From de111ba604a2786cc7bd14047ccfbda23edc3840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Thu, 28 Dec 2017 23:16:33 +0200 Subject: [PATCH 1/3] New upstream version 10.1.30 --- Docs/INFO_SRC | 10 +- VERSION | 2 +- client/mysql.cc | 8 +- client/mysql_upgrade.c | 4 +- client/mysqladmin.cc | 8 +- client/mysqlbinlog.cc | 19 +- client/mysqlcheck.c | 8 +- client/mysqldump.c | 8 +- client/mysqlimport.c | 8 +- client/mysqlshow.c | 8 +- client/mysqlslap.c | 8 +- client/mysqltest.cc | 8 +- cmake/dtrace.cmake | 3 +- cmake/install_layout.cmake | 6 +- extra/mariabackup/crc/crc_glue.c | 2 +- extra/mariabackup/xtrabackup.cc | 72 +- include/m_string.h | 9 - include/ma_dyncol.h | 6 + include/mysql.h.pp | 2 - include/typelib.h | 2 - libmysqld/libmysqld.c | 3 + man/mysql_upgrade.1 | 3 +- mysql-test/extra/rpl_tests/rpl_log.test | 2 + mysql-test/include/filter_file.inc | 11 +- mysql-test/include/show_binlog_events.inc | 8 +- mysql-test/include/show_events.inc | 7 + mysql-test/include/show_gtid_list.inc | 15 + mysql-test/mysql-test-run.pl | 2 +- mysql-test/r/ctype_utf8.result | 15 + mysql-test/r/ctype_utf8mb4.result | 26 + mysql-test/r/func_set.result | 24 +- mysql-test/r/func_str.result | 21 + mysql-test/r/group_by.result | 25 + mysql-test/r/having.result | 15 + mysql-test/r/join_outer.result | 13 + mysql-test/r/join_outer_jcl6.result | 13 + mysql-test/r/sp.result | 12 + mysql-test/r/trigger.result | 17 + mysql-test/r/view.result | 14 + .../binlog_flush_binlogs_delete_domain.result | 78 + .../r/binlog_gtid_delete_domain_debug.result | 6 + .../t/binlog_flush_binlogs_delete_domain.test | 137 + .../t/binlog_gtid_delete_domain_debug.test | 11 + mysql-test/suite/galera/disabled.def | 5 + mysql-test/suite/galera/r/MW-388.result | 2 +- .../suite/galera/r/galera_bf_lock_wait.result | 18 + mysql-test/suite/galera/r/sql_log_bin.result | 1 + .../suite/galera/t/galera_bf_lock_wait.test | 52 + mysql-test/suite/galera/t/sql_log_bin.test | 12 + .../suite/innodb/r/innodb-autoinc.result | 18 + .../suite/innodb/r/innodb-index-debug.result | 22 + .../innodb/r/innodb-replace-debug.result | 13 + .../suite/innodb/r/recovery_shutdown.result | 56 + mysql-test/suite/innodb/t/innodb-autoinc.test | 17 + .../suite/innodb/t/innodb-index-debug.test | 42 +- .../suite/innodb/t/innodb-replace-debug.test | 15 + .../suite/innodb/t/recovery_shutdown.test | 57 + .../innodb/t/table_definition_cache_debug.opt | 2 +- .../mariabackup/apply-log-only-incr.result | 4 + .../mariabackup/apply-log-only-incr.test | 7 + mysql-test/suite/mariabackup/mdev-14447.opt | 1 + .../suite/mariabackup/mdev-14447.result | 19 + mysql-test/suite/mariabackup/mdev-14447.test | 46 + .../suite/parts/inc/part_alter_values.inc | 37 + .../parts/r/partition_alter_innodb.result | 49 + .../parts/r/partition_alter_maria.result | 44 + .../parts/r/partition_alter_myisam.result | 44 + .../suite/parts/t/partition_alter_innodb.test | 4 + .../suite/parts/t/partition_alter_maria.test | 3 + .../suite/parts/t/partition_alter_myisam.test | 3 + mysql-test/suite/perfschema/r/misc.result | 16 + .../r/start_server_low_digest.result | 4 +- mysql-test/suite/perfschema/t/misc.test | 15 + .../r/binlog-simple_plugin_check.result | 19 + .../plugins/t/binlog-simple_plugin_check.test | 31 + .../suite/roles/flush_roles-12366.result | 539 + mysql-test/suite/roles/flush_roles-12366.test | 379 + mysql-test/suite/roles/set_role-13655.result | 50 + mysql-test/suite/roles/set_role-13655.test | 49 + .../suite/rpl/r/rpl_gtid_delete_domain.result | 30 + mysql-test/suite/rpl/r/rpl_row_log.result | 2 - .../suite/rpl/r/rpl_row_log_innodb.result | 2 - mysql-test/suite/rpl/r/rpl_stm_log.result | 2 - .../suite/rpl/t/rpl_gtid_delete_domain.test | 95 + .../suite/sys_vars/r/sysvars_innodb.result | 2 +- .../suite/sys_vars/t/wsrep_on_basic.opt | 1 + mysql-test/t/ctype_utf8.test | 12 + mysql-test/t/ctype_utf8mb4.test | 18 + mysql-test/t/func_set.test | 18 +- mysql-test/t/func_str.test | 13 +- mysql-test/t/group_by.test | 26 + mysql-test/t/having.test | 17 + mysql-test/t/join_outer.test | 14 + mysql-test/t/sp.test | 17 + mysql-test/t/trigger.test | 24 + mysql-test/t/view.test | 12 + mysql-test/t/xml.test | 2 +- mysql-test/unstable-tests | 144 +- mysys/ma_dyncol.c | 3 +- mysys/my_default.c | 6 +- mysys/my_malloc.c | 2 +- mysys/thr_alarm.c | 4 +- mysys/typelib.c | 12 - scripts/mysqld_safe.sh | 4 +- scripts/wsrep_sst_common.sh | 4 +- scripts/wsrep_sst_mysqldump.sh | 2 +- scripts/wsrep_sst_xtrabackup-v2.sh | 14 +- sql-common/client.c | 7 +- sql/event_data_objects.cc | 30 +- sql/events.cc | 18 + sql/field.cc | 13 +- sql/field.h | 8 +- sql/filesort.cc | 3 +- sql/filesort_utils.cc | 2 +- sql/handler.h | 7 + sql/item.cc | 3 +- sql/item_cmpfunc.cc | 19 +- sql/item_cmpfunc.h | 1 + sql/item_strfunc.cc | 31 +- sql/item_strfunc.h | 8 +- sql/item_sum.cc | 2 +- sql/lex.h | 1 + sql/log.cc | 217 +- sql/log.h | 7 +- sql/mysqld.cc | 21 +- sql/partition_info.cc | 20 + sql/partition_info.h | 1 + sql/rpl_gtid.cc | 151 +- sql/rpl_gtid.h | 9 + sql/share/errmsg-utf8.txt | 52 +- sql/sp_head.cc | 42 +- sql/sql_acl.cc | 77 +- sql/sql_connect.cc | 49 +- sql/sql_lex.cc | 5 + sql/sql_lex.h | 7 + sql/sql_parse.cc | 45 +- sql/sql_partition.cc | 16 +- sql/sql_plugin.cc | 20 +- sql/sql_reload.cc | 5 +- sql/sql_repl.cc | 68 +- sql/sql_repl.h | 1 - sql/sql_table.cc | 5 +- sql/sql_trigger.cc | 5 + sql/sql_view.cc | 6 + sql/sql_yacc.cc | 42396 ++++++++-------- sql/sql_yacc.h | 2032 +- sql/sql_yacc.yy | 30 +- sql/structs.h | 2 +- sql/sys_vars.cc | 3 +- sql/table.cc | 8 + sql/wsrep_mysqld.cc | 2 +- sql/wsrep_utils.cc | 1 - sql/wsrep_var.cc | 16 + sql/wsrep_var.h | 3 +- storage/connect/reldef.cpp | 14 +- storage/innobase/CMakeLists.txt | 6 + storage/innobase/buf/buf0buf.cc | 5 +- storage/innobase/dict/dict0stats_bg.cc | 29 +- storage/innobase/fil/fil0fil.cc | 4 +- storage/innobase/handler/ha_innodb.cc | 21 +- storage/innobase/include/os0file.h | 4 +- storage/innobase/include/que0que.h | 3 - storage/innobase/include/trx0rec.h | 6 +- storage/innobase/include/trx0roll.h | 9 +- storage/innobase/include/trx0sys.ic | 3 - storage/innobase/lock/lock0lock.cc | 94 +- storage/innobase/lock/lock0wait.cc | 39 +- storage/innobase/row/row0ins.cc | 4 + storage/innobase/row/row0log.cc | 33 +- storage/innobase/row/row0mysql.cc | 136 +- storage/innobase/row/row0undo.cc | 8 + storage/innobase/trx/trx0rec.cc | 6 +- storage/innobase/trx/trx0roll.cc | 164 +- storage/innobase/trx/trx0sys.cc | 5 - storage/innobase/trx/trx0undo.cc | 16 +- storage/maria/ma_loghandler.c | 1 - .../include/mroonga/have_mroonga_helper.inc | 2 +- .../mroonga/print_groonga_query_log.inc | 8 + ...e_query_log_file_disabled_empty_value.test | 3 +- ...le_query_log_file_disabled_null_value.test | 3 +- ...le_query_log_file_enabled_empty_value.test | 3 +- ...ble_query_log_file_enabled_null_value.test | 3 +- .../t/variable_query_log_file_new_value.test | 3 +- .../t/variable_query_log_file_same_value.test | 3 +- storage/tokudb/CMakeLists.txt | 6 + .../rpl/r/rpl_tokudb_row_log.result | 2 - .../rpl/r/rpl_tokudb_stm_log.result | 2 - storage/xtradb/CMakeLists.txt | 6 + storage/xtradb/buf/buf0buf.cc | 5 +- storage/xtradb/dict/dict0stats_bg.cc | 29 +- storage/xtradb/fil/fil0fil.cc | 3 +- storage/xtradb/handler/ha_innodb.cc | 21 +- storage/xtradb/include/os0file.h | 4 +- storage/xtradb/include/que0que.h | 3 - storage/xtradb/include/trx0rec.h | 6 +- storage/xtradb/include/trx0roll.h | 9 +- storage/xtradb/include/trx0sys.ic | 3 - storage/xtradb/lock/lock0lock.cc | 91 +- storage/xtradb/lock/lock0wait.cc | 39 +- storage/xtradb/row/row0ins.cc | 4 + storage/xtradb/row/row0log.cc | 33 +- storage/xtradb/row/row0mysql.cc | 136 +- storage/xtradb/row/row0undo.cc | 8 + storage/xtradb/trx/trx0rec.cc | 6 +- storage/xtradb/trx/trx0roll.cc | 164 +- storage/xtradb/trx/trx0sys.cc | 5 - storage/xtradb/trx/trx0undo.cc | 16 +- strings/CMakeLists.txt | 2 +- strings/ctype-tis620.c | 8 +- strings/my_vsnprintf.c | 6 +- strings/str_alloc.c | 41 - strings/xml.c | 9 +- support-files/CMakeLists.txt | 15 + support-files/mariadb.service.in | 9 +- support-files/mariadb@.service.in | 9 +- support-files/sysusers.conf.in | 1 + support-files/tmpfiles.conf.in | 1 + 217 files changed, 26326 insertions(+), 23365 deletions(-) create mode 100644 mysql-test/include/show_gtid_list.inc create mode 100644 mysql-test/suite/binlog/r/binlog_flush_binlogs_delete_domain.result create mode 100644 mysql-test/suite/binlog/r/binlog_gtid_delete_domain_debug.result create mode 100644 mysql-test/suite/binlog/t/binlog_flush_binlogs_delete_domain.test create mode 100644 mysql-test/suite/binlog/t/binlog_gtid_delete_domain_debug.test create mode 100644 mysql-test/suite/galera/r/galera_bf_lock_wait.result create mode 100644 mysql-test/suite/galera/t/galera_bf_lock_wait.test create mode 100644 mysql-test/suite/innodb/r/innodb-replace-debug.result create mode 100644 mysql-test/suite/innodb/r/recovery_shutdown.result create mode 100644 mysql-test/suite/innodb/t/innodb-replace-debug.test create mode 100644 mysql-test/suite/innodb/t/recovery_shutdown.test create mode 100644 mysql-test/suite/mariabackup/mdev-14447.opt create mode 100644 mysql-test/suite/mariabackup/mdev-14447.result create mode 100644 mysql-test/suite/mariabackup/mdev-14447.test create mode 100644 mysql-test/suite/parts/inc/part_alter_values.inc create mode 100644 mysql-test/suite/parts/r/partition_alter_innodb.result create mode 100644 mysql-test/suite/parts/r/partition_alter_myisam.result create mode 100644 mysql-test/suite/parts/t/partition_alter_innodb.test create mode 100644 mysql-test/suite/parts/t/partition_alter_myisam.test create mode 100644 mysql-test/suite/plugins/r/binlog-simple_plugin_check.result create mode 100644 mysql-test/suite/plugins/t/binlog-simple_plugin_check.test create mode 100644 mysql-test/suite/roles/flush_roles-12366.result create mode 100644 mysql-test/suite/roles/flush_roles-12366.test create mode 100644 mysql-test/suite/roles/set_role-13655.result create mode 100644 mysql-test/suite/roles/set_role-13655.test create mode 100644 mysql-test/suite/rpl/r/rpl_gtid_delete_domain.result create mode 100644 mysql-test/suite/rpl/t/rpl_gtid_delete_domain.test create mode 100644 mysql-test/suite/sys_vars/t/wsrep_on_basic.opt create mode 100644 storage/mroonga/mysql-test/mroonga/include/mroonga/print_groonga_query_log.inc delete mode 100644 strings/str_alloc.c create mode 100644 support-files/sysusers.conf.in create mode 100644 support-files/tmpfiles.conf.in diff --git a/Docs/INFO_SRC b/Docs/INFO_SRC index 7007a3c3..3dcb9a5d 100644 --- a/Docs/INFO_SRC +++ b/Docs/INFO_SRC @@ -1,8 +1,8 @@ -commit: 05103c84ecc519eae4090b720f48203a648e2ab9 -date: 2017-11-13 18:41:55 +0000 -build-date: 2017-11-13 18:46:50 +0000 -short: 05103c8 +commit: 461cf3e5a3c2d346d75b1407b285f8daf9d01f67 +date: 2017-12-21 17:40:01 +0200 +build-date: 2017-12-21 15:48:56 +0000 +short: 461cf3e branch: HEAD -MariaDB source 10.1.29 +MariaDB source 10.1.30 diff --git a/VERSION b/VERSION index dce8bbe2..466fdaeb 100644 --- a/VERSION +++ b/VERSION @@ -1,3 +1,3 @@ MYSQL_VERSION_MAJOR=10 MYSQL_VERSION_MINOR=1 -MYSQL_VERSION_PATCH=29 +MYSQL_VERSION_PATCH=30 diff --git a/client/mysql.cc b/client/mysql.cc index c043d054..977085eb 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -1793,8 +1793,12 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), break; case OPT_MYSQL_PROTOCOL: #ifndef EMBEDDED_LIBRARY - opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib, - opt->name); + if ((opt_protocol= find_type_with_warning(argument, &sql_protocol_typelib, + opt->name)) <= 0) + { + sf_leaking_memory= 1; /* no memory leak reports here */ + exit(1); + } #endif break; case OPT_SERVER_ARG: diff --git a/client/mysql_upgrade.c b/client/mysql_upgrade.c index c10dc20e..cbdd398c 100644 --- a/client/mysql_upgrade.c +++ b/client/mysql_upgrade.c @@ -166,8 +166,8 @@ static struct my_option my_long_options[]= "server with which it was built/distributed.", &opt_version_check, &opt_version_check, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, - {"write-binlog", OPT_WRITE_BINLOG, "All commands including those, " - "issued by mysqlcheck, are written to the binary log.", + {"write-binlog", OPT_WRITE_BINLOG, "All commands including those " + "issued by mysqlcheck are written to the binary log.", &opt_write_binlog, &opt_write_binlog, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} diff --git a/client/mysqladmin.cc b/client/mysqladmin.cc index ffdc73f9..897c2eb4 100644 --- a/client/mysqladmin.cc +++ b/client/mysqladmin.cc @@ -298,8 +298,12 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), #endif break; case OPT_MYSQL_PROTOCOL: - opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib, - opt->name); + if ((opt_protocol= find_type_with_warning(argument, &sql_protocol_typelib, + opt->name)) <= 0) + { + sf_leaking_memory= 1; /* no memory leak reports here */ + exit(1); + } break; } return 0; diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index c103061b..b871a70e 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -1649,8 +1649,12 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), remote_opt= 1; break; case OPT_MYSQL_PROTOCOL: - opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib, - opt->name); + if ((opt_protocol= find_type_with_warning(argument, &sql_protocol_typelib, + opt->name)) <= 0) + { + sf_leaking_memory= 1; /* no memory leak reports here */ + exit(1); + } break; case OPT_START_DATETIME: start_datetime= convert_str_to_timestamp(start_datetime_str); @@ -1663,8 +1667,15 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), opt_base64_output_mode= BASE64_OUTPUT_ALWAYS; else { - opt_base64_output_mode= (enum_base64_output_mode) - (find_type_or_exit(argument, &base64_output_mode_typelib, opt->name)-1); + int val; + + if ((val= find_type_with_warning(argument, &base64_output_mode_typelib, + opt->name)) <= 0) + { + sf_leaking_memory= 1; /* no memory leak reports here */ + exit(1); + } + opt_base64_output_mode= (enum_base64_output_mode) (val - 1); } break; case OPT_REWRITE_DB: // db_from->db_to diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c index c4ac5897..47cb3875 100644 --- a/client/mysqlcheck.c +++ b/client/mysqlcheck.c @@ -367,8 +367,12 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), print_version(); exit(0); break; case OPT_MYSQL_PROTOCOL: - opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib, - opt->name); + if ((opt_protocol= find_type_with_warning(argument, &sql_protocol_typelib, + opt->name)) <= 0) + { + sf_leaking_memory= 1; /* no memory leak reports here */ + exit(1); + } break; } diff --git a/client/mysqldump.c b/client/mysqldump.c index aead4caf..5c0ec2a5 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -956,8 +956,12 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), break; } case (int) OPT_MYSQL_PROTOCOL: - opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib, - opt->name); + if ((opt_protocol= find_type_with_warning(argument, &sql_protocol_typelib, + opt->name)) <= 0) + { + sf_leaking_memory= 1; /* no memory leak reports here */ + exit(1); + } break; } return 0; diff --git a/client/mysqlimport.c b/client/mysqlimport.c index 7f03cb35..9c84d4a6 100644 --- a/client/mysqlimport.c +++ b/client/mysqlimport.c @@ -249,8 +249,12 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), break; #endif case OPT_MYSQL_PROTOCOL: - opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib, - opt->name); + if ((opt_protocol= find_type_with_warning(argument, &sql_protocol_typelib, + opt->name)) <= 0) + { + sf_leaking_memory= 1; /* no memory leak reports here */ + exit(1); + } break; case '#': DBUG_PUSH(argument ? argument : "d:t:o"); diff --git a/client/mysqlshow.c b/client/mysqlshow.c index 6f434d67..f851c151 100644 --- a/client/mysqlshow.c +++ b/client/mysqlshow.c @@ -328,8 +328,12 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), #endif break; case OPT_MYSQL_PROTOCOL: - opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib, - opt->name); + if ((opt_protocol= find_type_with_warning(argument, &sql_protocol_typelib, + opt->name)) <= 0) + { + sf_leaking_memory= 1; /* no memory leak reports here */ + exit(1); + } break; case '#': DBUG_PUSH(argument ? argument : "d:t:o"); diff --git a/client/mysqlslap.c b/client/mysqlslap.c index a78bf35d..6a0b2143 100644 --- a/client/mysqlslap.c +++ b/client/mysqlslap.c @@ -779,8 +779,12 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), #endif break; case OPT_MYSQL_PROTOCOL: - opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib, - opt->name); + if ((opt_protocol= find_type_with_warning(argument, &sql_protocol_typelib, + opt->name)) <= 0) + { + sf_leaking_memory= 1; /* no memory leak reports here */ + exit(1); + } break; case '#': DBUG_PUSH(argument ? argument : default_dbug_option); diff --git a/client/mysqltest.cc b/client/mysqltest.cc index 155d0c4c..2200462b 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -7292,8 +7292,12 @@ get_one_option(int optid, const struct my_option *opt, char *argument) exit(0); case OPT_MYSQL_PROTOCOL: #ifndef EMBEDDED_LIBRARY - opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib, - opt->name); + if ((opt_protocol= find_type_with_warning(argument, &sql_protocol_typelib, + opt->name)) <= 0) + { + sf_leaking_memory= 1; /* no memory leak reports here */ + exit(1); + } #endif break; case '?': diff --git a/cmake/dtrace.cmake b/cmake/dtrace.cmake index 3edcdc4c..d7ab0f31 100644 --- a/cmake/dtrace.cmake +++ b/cmake/dtrace.cmake @@ -42,7 +42,8 @@ MACRO(CHECK_DTRACE) # On FreeBSD, dtrace does not handle userland tracing yet IF(DTRACE AND NOT CMAKE_SYSTEM_NAME MATCHES "FreeBSD" AND NOT BUGGY_GCC_NO_DTRACE_MODULES - AND NOT BUGGY_LINUX_DTRACE) + AND NOT BUGGY_LINUX_DTRACE + AND NOT CMAKE_SYSTEM_NAME MATCHES "SunOS") SET(ENABLE_DTRACE ON CACHE BOOL "Enable dtrace") ENDIF() SET(HAVE_DTRACE ${ENABLE_DTRACE}) diff --git a/cmake/install_layout.cmake b/cmake/install_layout.cmake index d1a261f8..5484691e 100644 --- a/cmake/install_layout.cmake +++ b/cmake/install_layout.cmake @@ -162,6 +162,8 @@ SET(INSTALL_MYSQLDATADIR_RPM "/var/lib/mysql") SET(INSTALL_UNIX_ADDRDIR_RPM "${INSTALL_MYSQLDATADIR_RPM}/mysql.sock") SET(INSTALL_SYSTEMD_UNITDIR_RPM "/usr/lib/systemd/system") +SET(INSTALL_SYSTEMD_SYSUSERSDIR_RPM "/usr/lib/sysusers.d") +SET(INSTALL_SYSTEMD_TMPFILESDIR_RPM "/usr/lib/tmpfiles.d") # # DEB layout @@ -191,6 +193,8 @@ SET(INSTALL_MYSQLDATADIR_DEB "/var/lib/mysql") SET(INSTALL_UNIX_ADDRDIR_DEB "/var/run/mysqld/mysqld.sock") SET(INSTALL_SYSTEMD_UNITDIR_DEB "/lib/systemd/system") +SET(INSTALL_SYSTEMD_SYSUSERSDIR_DEB "/usr/lib/sysusers.d") +SET(INSTALL_SYSTEMD_TMPFILESDIR_DEB "/usr/lib/tmpfiles.d") # # SVR4 layout @@ -232,7 +236,7 @@ SET(OLD_INSTALL_LAYOUT ${INSTALL_LAYOUT} CACHE INTERNAL "") # layout is chosen) FOREACH(var BIN SBIN LIB MYSQLSHARE SHARE PLUGIN INCLUDE SCRIPT DOC MAN SYSCONF SYSCONF2 INFO MYSQLTEST SQLBENCH DOCREADME SUPPORTFILES MYSQLDATA UNIX_ADDR - SYSTEMD_UNIT) + SYSTEMD_UNIT SYSTEMD_SYSUSERS SYSTEMD_TMPFILES) SET(INSTALL_${var}DIR ${INSTALL_${var}DIR_${INSTALL_LAYOUT}} CACHE STRING "${var} installation directory" ${FORCE}) MARK_AS_ADVANCED(INSTALL_${var}DIR) diff --git a/extra/mariabackup/crc/crc_glue.c b/extra/mariabackup/crc/crc_glue.c index c301cb01..11d2c218 100644 --- a/extra/mariabackup/crc/crc_glue.c +++ b/extra/mariabackup/crc/crc_glue.c @@ -24,7 +24,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA #include #include -#if __GNUC__ >= 4 && defined(__x86_64__) +#if defined(__GNUC__) && defined(__x86_64__) static int pclmul_enabled = 0; #endif diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index 2f9761eb..437fc4aa 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -1103,11 +1103,13 @@ Disable with --skip-innodb-doublewrite.", (G_PTR*) &innobase_use_doublewrite, (G_PTR*) &defaults_group, (G_PTR*) &defaults_group, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"plugin-dir", OPT_PLUGIN_DIR, "Server plugin directory", + {"plugin-dir", OPT_PLUGIN_DIR, + "Server plugin directory. Used to load encryption plugin during 'prepare' phase." + "Has no effect in the 'backup' phase (plugin directory during backup is the same as server's)", &xb_plugin_dir, &xb_plugin_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, - { "plugin-load", OPT_PLUGIN_LOAD, "encrypton plugin to load", + { "plugin-load", OPT_PLUGIN_LOAD, "encrypton plugin to load during 'prepare' phase.", &xb_plugin_load, &xb_plugin_load, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, @@ -1378,8 +1380,12 @@ xb_get_one_option(int optid, case OPT_PROTOCOL: if (argument) { - opt_protocol= find_type_or_exit(argument, &sql_protocol_typelib, - opt->name); + if ((opt_protocol= find_type_with_warning(argument, &sql_protocol_typelib, + opt->name)) <= 0) + { + sf_leaking_memory= 1; /* no memory leak reports here */ + exit(1); + } } break; #include "sslopt-case.h" @@ -2555,8 +2561,9 @@ xtrabackup_scan_log_recs( to this lsn */ lsn_t* group_scanned_lsn,/*!< out: scanning succeeded up to this lsn */ - bool* finished) /*!< out: false if is not able to scan + bool* finished, /*!< out: false if is not able to scan any more in this log group */ + bool* must_reread_log) /*!< out: should re-read buffer from disk, incomplete read*/ { lsn_t scanned_lsn; ulint data_len; @@ -2566,6 +2573,7 @@ xtrabackup_scan_log_recs( ulint scanned_checkpoint_no = 0; *finished = false; + *must_reread_log = false; scanned_lsn = start_lsn; log_block = log_sys->buf; @@ -2622,8 +2630,10 @@ xtrabackup_scan_log_recs( msg("mariabackup: warning: this is possible when the " "log block has not been fully written by the " "server, will retry later.\n"); - *finished = true; - break; + *finished = false; + *must_reread_log = true; + my_sleep(1000); + return false; } if (log_block_get_flush_bit(log_block)) { @@ -2735,14 +2745,23 @@ xtrabackup_copy_logfile(lsn_t from_lsn, my_bool is_last) mutex_enter(&log_sys->mutex); - log_group_read_log_seg(LOG_RECOVER, log_sys->buf, - group, start_lsn, end_lsn, false); + bool scan_ok = false; + bool must_reread_log; + int retries = 0; + do { + + log_group_read_log_seg(LOG_RECOVER, log_sys->buf, + group, start_lsn, end_lsn, false); + + scan_ok = xtrabackup_scan_log_recs(group, is_last, + start_lsn, &contiguous_lsn, &group_scanned_lsn, + &finished, &must_reread_log); - if (!xtrabackup_scan_log_recs(group, is_last, - start_lsn, &contiguous_lsn, &group_scanned_lsn, - &finished)) { + } while (!scan_ok && must_reread_log && retries++ < 100); + + if (!scan_ok) { goto error; - } + } mutex_exit(&log_sys->mutex); @@ -4955,10 +4974,29 @@ xtrabackup_apply_delta( const os_offset_t off = os_offset_t(offset_on_page)*page_size; if (off == 0) { - /* Fix tablespace size. */ - os_offset_t n_pages = fsp_get_size_low(static_cast(buf)); - if (!os_file_set_size(dst_path, dst_file, n_pages*page_size)) - goto error; + /* Read tablespace size from page 0, + extend the tablespace to specified size. */ + os_offset_t n_pages = mach_read_from_4(buf + FSP_HEADER_OFFSET + FSP_SIZE); + ulint space_id = mach_read_from_4(buf + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID); + if (space_id != TRX_SYS_SPACE) { + if (!os_file_set_size(dst_path, dst_file, n_pages*page_size)) + goto error; + } else { + /* System tablespace needs special handling , since + it can consist of multiple files. The first one has full + tablespace size in page 0, but only last file should be extended. */ + mutex_enter(&fil_system->mutex); + fil_space_t* space = fil_space_get_by_id(space_id); + mutex_exit(&fil_system->mutex); + DBUG_ASSERT(space); + fil_node_t* n = UT_LIST_GET_FIRST(space->chain); + if(strcmp(n->name, dst_path) == 0) { + /* Got first tablespace file, with correct size */ + ulint actual_size; + if (!fil_extend_space_to_desired_size(&actual_size, 0, (ulint)n_pages)) + goto error; + } + } } success = os_file_write(dst_path, dst_file, buf, off, page_size); diff --git a/include/m_string.h b/include/m_string.h index 7437ea8b..d088b510 100644 --- a/include/m_string.h +++ b/include/m_string.h @@ -64,15 +64,6 @@ extern "C" { #endif -/* - my_str_malloc(), my_str_realloc() and my_str_free() are assigned to - implementations in strings/alloc.c, but can be overridden in - the calling program. - */ -extern void *(*my_str_malloc)(size_t); -extern void *(*my_str_realloc)(void *, size_t); -extern void (*my_str_free)(void *); - #ifdef DBUG_OFF #if defined(HAVE_STPCPY) && MY_GNUC_PREREQ(3, 4) && !defined(__INTEL_COMPILER) #define strmov(A,B) __builtin_stpcpy((A),(B)) diff --git a/include/ma_dyncol.h b/include/ma_dyncol.h index cb03ccb5..300474e0 100644 --- a/include/ma_dyncol.h +++ b/include/ma_dyncol.h @@ -63,6 +63,12 @@ typedef struct st_mysql_lex_string LEX_STRING; /* NO and OK is the same used just to show semantics */ #define ER_DYNCOL_NO ER_DYNCOL_OK +#ifdef HAVE_CHARSET_utf8mb4 +#define DYNCOL_UTF (&my_charset_utf8mb4_general_ci) +#else +#define DYNCOL_UTF (&my_charset_utf8_general_ci) +#endif + enum enum_dyncol_func_result { ER_DYNCOL_OK= 0, diff --git a/include/mysql.h.pp b/include/mysql.h.pp index 32d87b73..8936a716 100644 --- a/include/mysql.h.pp +++ b/include/mysql.h.pp @@ -221,8 +221,6 @@ typedef struct st_typelib { extern my_ulonglong find_typeset(char *x, TYPELIB *typelib,int *error_position); extern int find_type_with_warning(const char *x, TYPELIB *typelib, const char *option); -extern int find_type_or_exit(const char *x, TYPELIB *typelib, - const char *option); extern int find_type(const char *x, const TYPELIB *typelib, unsigned int flags); extern void make_type(char *to,unsigned int nr,TYPELIB *typelib); extern const char *get_type(TYPELIB *typelib,unsigned int nr); diff --git a/include/typelib.h b/include/typelib.h index 4504bea4..ab5a0f0d 100644 --- a/include/typelib.h +++ b/include/typelib.h @@ -29,8 +29,6 @@ typedef struct st_typelib { /* Different types saved here */ extern my_ulonglong find_typeset(char *x, TYPELIB *typelib,int *error_position); extern int find_type_with_warning(const char *x, TYPELIB *typelib, const char *option); -extern int find_type_or_exit(const char *x, TYPELIB *typelib, - const char *option); #define FIND_TYPE_BASIC 0 /** makes @c find_type() require the whole name, no prefix */ #define FIND_TYPE_NO_PREFIX (1 << 0) diff --git a/libmysqld/libmysqld.c b/libmysqld/libmysqld.c index 36728cf5..543ab866 100644 --- a/libmysqld/libmysqld.c +++ b/libmysqld/libmysqld.c @@ -121,6 +121,9 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user, my_free(mysql->options.my_cnf_file); my_free(mysql->options.my_cnf_group); mysql->options.my_cnf_file=mysql->options.my_cnf_group=0; + + if (mysql->options.protocol == UINT_MAX32) + goto error; } if (!db || !db[0]) diff --git a/man/mysql_upgrade.1 b/man/mysql_upgrade.1 index 48ea44a5..f04fa122 100644 --- a/man/mysql_upgrade.1 +++ b/man/mysql_upgrade.1 @@ -691,8 +691,7 @@ it was built/distributed. Defaults to on; use \fB\-\-skip\-version\-check\fR to .sp Cause binary logging to be enabled while \fBmysql_upgrade\fR -runs\&. This is the default behavior; to disable binary logging during the upgrade, use the inverse of this option (that is, start the program with -\fB\-\-skip\-write\-binlog\fR)\&. +runs\&. .RE .SH "COPYRIGHT" .br diff --git a/mysql-test/extra/rpl_tests/rpl_log.test b/mysql-test/extra/rpl_tests/rpl_log.test index 01e8497e..934f4030 100644 --- a/mysql-test/extra/rpl_tests/rpl_log.test +++ b/mysql-test/extra/rpl_tests/rpl_log.test @@ -65,6 +65,8 @@ flush logs; # To make it predictable, we do a useless update now, but which has the # interest of making the slave catch both rotate events. +let $skip_checkpoint_events=1; + eval create table t3 (a int)ENGINE=$engine_type; # Sync slave and force it to start on another binary log diff --git a/mysql-test/include/filter_file.inc b/mysql-test/include/filter_file.inc index 17c7c198..bfe53896 100644 --- a/mysql-test/include/filter_file.inc +++ b/mysql-test/include/filter_file.inc @@ -53,6 +53,9 @@ # # $rpl_debug # If set, verbose debug info is printed. +# +# $filter_script +# If set, rows matching this regexp will be filtered out --let $include_filename= filter_file.inc --source include/begin_include_file.inc @@ -67,10 +70,12 @@ if ($rpl_debug) --let _FF_PRE_SCRIPT= $pre_script --let _FF_SCRIPT= $script +--let _FF_FILTER_SCRIPT= $filter_script --let _FF_INPUT_FILE= $input_file --let _FF_OUTPUT_FILE= $output_file --let _FF_SELECT_COLUMNS= $select_columns --let _FF_DEBUG= $rpl_debug + if (!$output_file) { --let _FF_OUTPUT_FILE= $input_file @@ -79,6 +84,7 @@ perl; my $pre_script = $ENV{'_FF_PRE_SCRIPT'}; $pre_script =~ s/DOLLAR/\$/g; my $script = $ENV{'_FF_SCRIPT'}; + my $filter_script = $ENV{'_FF_FILTER_SCRIPT'}; $script =~ s/DOLLAR/\$/g; my $input_file = $ENV{'_FF_INPUT_FILE'}; my $output_file = $ENV{'_FF_OUTPUT_FILE'}; @@ -123,7 +129,10 @@ perl; { ' . $script . ' } - $filtered_contents .= $_."\n"; + if (!$filter_script || ! m/$filter_script/) + { + $filtered_contents .= $_."\n"; + } } close FILE or die "Error closing $input_file: $!"; open FILE, "> $output_file" or die "Error opening $output_file: $!"; diff --git a/mysql-test/include/show_binlog_events.inc b/mysql-test/include/show_binlog_events.inc index b2462e0d..57fe1ffe 100644 --- a/mysql-test/include/show_binlog_events.inc +++ b/mysql-test/include/show_binlog_events.inc @@ -7,7 +7,7 @@ # [--let $binlog_file= [ | LAST]] # [--let $binlog_start= ] # [--let $binlog_limit= 1, 3 ] -# [--let $keep_gtid_events= 1] +# [--let $skip_checkpoint_events= 1] # --source include/show_binlog_events.inc # # Parameters: @@ -26,12 +26,6 @@ # Limit for the 'LIMIT' clause of SHOW BINLOG EVENTS, i.e.: # $binlog_limit= 3 -- print three events # $binlog_limit= 4, 3 -- skip four events, print the three next events -# -# $keep_gtid_events -# By default, Gtid_log_event and Previous_gtid_log_event are -# filtered out, so that the output is independent of whether GTIDs -# are enabled or not. If this flag is set, events are kept but -# the actual GTID values are masked out. --let $include_filename= show_binlog_events.inc --source include/begin_include_file.inc diff --git a/mysql-test/include/show_events.inc b/mysql-test/include/show_events.inc index 368cfc9e..9ee01f73 100644 --- a/mysql-test/include/show_events.inc +++ b/mysql-test/include/show_events.inc @@ -104,8 +104,15 @@ let $script= s{DOLLARmysqltest_vardir}{MYSQLTEST_VARDIR}g; || --let $pre_script= my DOLLARmysqltest_vardir = DOLLARENV{'MYSQLTEST_VARDIR'}; + --delimiter ; +if ($skip_checkpoint_events) +{ + let $filter_script=Binlog_checkpoint; +} + + #--let $select_columns= 1 3 6 --let $input_file= $output_file --source include/filter_file.inc diff --git a/mysql-test/include/show_gtid_list.inc b/mysql-test/include/show_gtid_list.inc new file mode 100644 index 00000000..96f813f1 --- /dev/null +++ b/mysql-test/include/show_gtid_list.inc @@ -0,0 +1,15 @@ +# ==== Purpose ==== +# +# Extract Gtid_list info from SHOW BINLOG EVENTS output masking +# non-deterministic fields. +# +# ==== Usage ==== +# +# [--let $binlog_file=filename +# +if ($binlog_file) +{ + --let $_in_binlog_file=in '$binlog_file' +} +--replace_column 2 # 5 # +--eval show binlog events $_in_binlog_file limit 1,1 diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index ac9f493d..3b1bb0b5 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -2817,7 +2817,7 @@ sub mysql_server_start($) { # Some InnoDB options are incompatible with the default bootstrap. # If they are used, re-bootstrap if ( $extra_opts and - "@$extra_opts" =~ /--innodb[-_](?:page[-_]size|checksum[-_]algorithm|undo[-_]tablespaces|log[-_]group[-_]home[-_]dir|data[-_]home[-_]dir)/ ) + "@$extra_opts" =~ /--innodb[-_](?:page[-_]size|checksum[-_]algorithm|undo[-_]tablespaces|log[-_]group[-_]home[-_]dir|data[-_]home[-_]dir)|data[-_]file[-_]path/ ) { mysql_install_db($mysqld, undef, $extra_opts); } diff --git a/mysql-test/r/ctype_utf8.result b/mysql-test/r/ctype_utf8.result index ca585f9e..5a77ea3a 100644 --- a/mysql-test/r/ctype_utf8.result +++ b/mysql-test/r/ctype_utf8.result @@ -10264,6 +10264,21 @@ DROP FUNCTION iswellformed; DROP TABLE allbytes; # End of ctype_backslash.inc # +# MDEV-12681 Wrong VIEW results for CHAR(0xDF USING latin1) +# +SET NAMES utf8; +SELECT CHAR(0xDF USING latin1); +CHAR(0xDF USING latin1) +ß +CREATE OR REPLACE VIEW v1 AS SELECT CHAR(0xDF USING latin1) AS c; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select char(0xdf using latin1) AS `c` utf8 utf8_general_ci +SELECT * FROM v1; +c +ß +DROP VIEW v1; +# # End of 10.0 tests # # diff --git a/mysql-test/r/ctype_utf8mb4.result b/mysql-test/r/ctype_utf8mb4.result index bac0fc34..d45b6b23 100644 --- a/mysql-test/r/ctype_utf8mb4.result +++ b/mysql-test/r/ctype_utf8mb4.result @@ -3421,6 +3421,32 @@ a b a 😁 b a ? b DROP TABLE t1; # +# MDEV-8949: COLUMN_CREATE unicode name breakage +# +SET NAMES utf8mb4; +SELECT COLUMN_JSON(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1)); +COLUMN_JSON(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1)) +{"😎":1} +SELECT COLUMN_LIST(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1)); +COLUMN_LIST(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1)) +`😎` +SELECT COLUMN_GET(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1), _utf8mb4 0xF09F988E +as int); +COLUMN_GET(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1), _utf8mb4 0xF09F988E +as int) +1 +CREATE TABLE t1 AS SELECT +COLUMN_LIST(COLUMN_CREATE('a',1)), +COLUMN_JSON(COLUMN_CREATE('b',1)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `COLUMN_LIST(COLUMN_CREATE('a',1))` longtext CHARACTER SET utf8mb4, + `COLUMN_JSON(COLUMN_CREATE('b',1))` longtext CHARACTER SET utf8mb4 +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +DROP TABLE t1; +SET NAMES default; +# # End of 10.0 tests # # diff --git a/mysql-test/r/func_set.result b/mysql-test/r/func_set.result index 96af966d..23931bde 100644 --- a/mysql-test/r/func_set.result +++ b/mysql-test/r/func_set.result @@ -221,21 +221,11 @@ NULL DROP TABLE t1; # -# Start of 5.3 tests -# -# -# MDEV-4512 Valgrind warnings in my_long10_to_str_8bit on INTERVAL and DATE_ADD with incorrect types -# -CREATE TABLE t1 (pk INT PRIMARY KEY); -INSERT INTO t1 VALUES (10),(11); -SELECT INTERVAL( 9, 1, DATE_ADD( pk, INTERVAL pk MINUTE_SECOND ), 9, 8, 3, 5, 2, 1 ) FROM t1; -INTERVAL( 9, 1, DATE_ADD( pk, INTERVAL pk MINUTE_SECOND ), 9, 8, 3, 5, 2, 1 ) -8 -8 -Warnings: -Warning 1292 Incorrect datetime value: '10' for column 'pk' at row 1 -Warning 1292 Incorrect datetime value: '11' for column 'pk' at row 2 -DROP TABLE t1; -# -# End of 5.3 tests +# MDEV-14596 Crash in INTERVAL(ROW(..),ROW(..)) # +SELECT INTERVAL(ROW(1,1),ROW(1,2)); +ERROR 21000: Operand should contain 1 column(s) +SELECT INTERVAL(1,ROW(1,2)); +ERROR 21000: Operand should contain 1 column(s) +SELECT INTERVAL(ROW(1,2),1); +ERROR 21000: Operand should contain 1 column(s) diff --git a/mysql-test/r/func_str.result b/mysql-test/r/func_str.result index d32efe64..3c84134d 100644 --- a/mysql-test/r/func_str.result +++ b/mysql-test/r/func_str.result @@ -4547,6 +4547,27 @@ set global max_allowed_packet=default; # End of 5.6 tests # # +# Start of 10.0 tests +# +# +# MDEV-12681 Wrong VIEW results for CHAR(0xDF USING latin1) +# +EXPLAIN EXTENDED SELECT CHAR(0xDF USING latin1); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Warnings: +Note 1003 select char(0xdf using latin1) AS `CHAR(0xDF USING latin1)` +EXPLAIN EXTENDED SELECT CHAR(0xDF USING `binary`); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Warnings: +Note 1003 select char(0xdf) AS `CHAR(0xDF USING ``binary``)` +EXPLAIN EXTENDED SELECT CHAR(0xDF); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Warnings: +Note 1003 select char(0xdf) AS `CHAR(0xDF)` +# # Start of 10.1 tests # # diff --git a/mysql-test/r/group_by.result b/mysql-test/r/group_by.result index 29b3a0ea..eb730a8c 100644 --- a/mysql-test/r/group_by.result +++ b/mysql-test/r/group_by.result @@ -2636,6 +2636,31 @@ create table t2 (c1 int, c2 int); select t1.c1 as c1, t2.c2 as c1 from t1, t2 where t1.c1 < 20 and t2.c2 > 5 group by t1.c1, t2.c2 having t1.c1 < 3; c1 c1 drop table t1, t2; +SET @old_sort_buff_size = @@sort_buffer_size; +SET @@sort_buffer_size=256*1024; +CREATE TABLE t1 (c INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES +(2011),(1977),(1982),(2027),(2023),(NULL),(NULL),(2004),(1974),(2032), +(1993),(NULL),(1995),(2034),(NULL),(2009),(1900),(NULL),(2025),(1900), +(2033),(1900),(2012),(NULL),(2009),(1992),(1974),(1974),(2012),(2028), +(2007),(2012),(1900),(1983),(1900),(2010),(1987),(1994),(1981),(2032), +(2010),(1989),(2014),(1900),(1900),(1976),(1978),(2007),(2030),(NULL), +(2002),(1997),(1900),(NULL),(2000),(2027),(1975),(2026),(1975),(2026), +(2029),(1977),(1900),(1900),(2031),(1993),(1986),(2012),(1979),(2013), +(1994),(2014),(2025),(2006),(1971),(1974),(2021),(2011),(NULL),(1991), +(2001),(1977),(2023),(2012),(1900),(1978),(1998),(NULL),(1988),(1999), +(2017),(2008),(1976),(1900),(2005),(2030),(2023),(1900),(1978),(1990), +(1978),(1987),(2030),(1900),(2034),(2006),(2015),(2001),(2019),(2024), +(2030),(1989),(1997),(2007),(2023),(1994),(1971),(2011),(2011),(2015), +(1984),(1978),(1979),(1989),(2008),(2030); +SELECT ExtractValue('','/a') AS f1, SPACE(c) AS f2 FROM t1 GROUP BY f1, f2 WITH ROLLUP; +f1 f2 + NULL + + NULL +NULL NULL +SET @@sort_buffer_size = @old_sort_buff_size; +DROP TABLE t1; # # Bug #58782 # Missing rows with SELECT .. WHERE .. IN subquery diff --git a/mysql-test/r/having.result b/mysql-test/r/having.result index 7fdec5a2..f7503597 100644 --- a/mysql-test/r/having.result +++ b/mysql-test/r/having.result @@ -698,6 +698,21 @@ id column_1 expected -- 1 row(s) returned not ER_BAD_FIELD_ERROR drop table t1; # +# mdev-14368: grouping query with alias for aggregate function in HAVING +# when sql_mode = 'ONLY_FULL_GROUP_BY' +set @save_sql_mode= @@sql_mode; +set sql_mode = 'ONLY_FULL_GROUP_BY'; +create table t1(a int); +insert t1 values (4),(1),(2),(1), (3),(4); +SELECT a, COUNT(a) as ct FROM t1 GROUP BY a HAVING ct>0; +a ct +1 2 +2 1 +3 1 +4 2 +set sql_mode=@save_sql_mode; +drop table t1; +# # Bug mdev-5160: two-way join with HAVING over the second table # CREATE TABLE t1 (c1 varchar(6)) ENGINE=MyISAM; diff --git a/mysql-test/r/join_outer.result b/mysql-test/r/join_outer.result index 2109d75a..78cdfe6e 100644 --- a/mysql-test/r/join_outer.result +++ b/mysql-test/r/join_outer.result @@ -2433,5 +2433,18 @@ Warnings: Note 1003 select `test`.`t1`.`col1` AS `col1`,`test`.`t2`.`col1` AS `col1`,`test`.`t2`.`col3` AS `col3` from `test`.`t1` left join `test`.`t2` on((`test`.`t2`.`col2` = `test`.`t1`.`col1`)) where (`f1`(`test`.`t2`.`col3`,0) = 0) DROP FUNCTION f1; DROP TABLE t1,t2; +# +# MDEV-10397: Server crashes in key_copy with join_cache_level > 2 and join on BIT fields +# +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; +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; # 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 69f0c25b..861b2240 100644 --- a/mysql-test/r/join_outer_jcl6.result +++ b/mysql-test/r/join_outer_jcl6.result @@ -2444,6 +2444,19 @@ Warnings: Note 1003 select `test`.`t1`.`col1` AS `col1`,`test`.`t2`.`col1` AS `col1`,`test`.`t2`.`col3` AS `col3` from `test`.`t1` left join `test`.`t2` on((`test`.`t2`.`col2` = `test`.`t1`.`col1`)) where (`f1`(`test`.`t2`.`col3`,0) = 0) DROP FUNCTION f1; DROP TABLE t1,t2; +# +# MDEV-10397: Server crashes in key_copy with join_cache_level > 2 and join on BIT fields +# +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; +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; # end of 5.5 tests SET optimizer_switch=@save_optimizer_switch; set join_cache_level=default; diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index c6867d46..9b0ace5c 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -8107,4 +8107,16 @@ CALL p(); drop procedure p; drop view v; drop table t, tmp_t; +# +# MDEV-13936: Server crashes in Time_and_counter_tracker::incr_loops +# +CREATE TABLE t1 (i INT); +CREATE VIEW v1 AS SELECT * FROM t1 WHERE RAND() > 0.5; +CREATE FUNCTION f1() RETURNS INT RETURN ( SELECT MAX(i) FROM v1 ); +REPLACE INTO v1 VALUES (f1()); +ERROR HY000: The target table v1 of the INSERT is not insertable-into +SET @aux = f1(); +DROP FUNCTION f1; +DROP VIEW v1; +DROP TABLE t1; #End of 10.1 tests diff --git a/mysql-test/r/trigger.result b/mysql-test/r/trigger.result index 86219875..8455450e 100644 --- a/mysql-test/r/trigger.result +++ b/mysql-test/r/trigger.result @@ -2290,3 +2290,20 @@ INSERT INTO t1 VALUES ('a'); ERROR 22001: Data too long for column 'c' at row 1 DROP TRIGGER t1_bi; DROP TABLE t1; +# +# MDEV-13936: Server crashes in Time_and_counter_tracker::incr_loops +# +CREATE TABLE t1 (i INT); +CREATE VIEW v1 AS SELECT * FROM t1 WHERE RAND() > 0.5; +CREATE TABLE t2 (a int); +CREATE TABLE t3 (a int); +create trigger trg after insert on t2 for each row +INSERT INTO t3 SELECT MAX(i) FROM v1 UNION SELECT MAX(i) FROM v1; +drop table t1; +insert into t2 value (2); +ERROR 42S02: Table 'test.t1' doesn't exist +CREATE TABLE t1 (i INT); +insert into t2 value (2); +DROP VIEW v1; +DROP TABLE t1,t2,t3; +End of 10.1 tests. diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index 451124ac..88f40b2c 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -5662,6 +5662,20 @@ PREPARE stmt FROM 'REPLACE INTO v2 SELECT a FROM t3'; ERROR HY000: Can not insert into join view 'test.v2' without fields list drop view v1,v2; drop table t3; +# +# MDEV-14619: VIEW and GROUP_CONCAT +# +CREATE TABLE t1 (str text); +INSERT INTO t1 VALUES ("My"),("SQL"); +CREATE VIEW v1 AS SELECT GROUP_CONCAT(str SEPARATOR '\\') FROM t1; +SELECT * FROM v1; +GROUP_CONCAT(str SEPARATOR '\\') +My\SQL +SHOW CREATE VIEW v1; +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; # ----------------------------------------------------------------- # -- End of 5.5 tests. # ----------------------------------------------------------------- diff --git a/mysql-test/suite/binlog/r/binlog_flush_binlogs_delete_domain.result b/mysql-test/suite/binlog/r/binlog_flush_binlogs_delete_domain.result new file mode 100644 index 00000000..99f2a578 --- /dev/null +++ b/mysql-test/suite/binlog/r/binlog_flush_binlogs_delete_domain.result @@ -0,0 +1,78 @@ +RESET MASTER; +FLUSH BINARY LOGS DELETE_DOMAIN_ID = (); +and the command execution is effective thence rotates binlog as usual +show binary logs; +Log_name File_size +master-bin.000001 # +master-bin.000002 # +Non-existed domain is warned, the command completes without rotation +but with a warning +FLUSH BINARY LOGS DELETE_DOMAIN_ID = (99); +Warnings: +Warning 1076 The gtid domain being deleted ('99') is not in the current binlog state +show binary logs; +Log_name File_size +master-bin.000001 # +master-bin.000002 # +SET @@SESSION.gtid_domain_id=1; +SET @@SESSION.server_id=1; +CREATE TABLE t (a int); +FLUSH BINARY LOGS DELETE_DOMAIN_ID = (1); +ERROR HY000: Could not delete gtid domain. Reason: binlog files may contain gtids from the domain ('1') being deleted. Make sure to first purge those files. +FLUSH BINARY LOGS; +FLUSH BINARY LOGS DELETE_DOMAIN_ID = (1); +ERROR HY000: Could not delete gtid domain. Reason: binlog files may contain gtids from the domain ('1') being deleted. Make sure to first purge those files. +PURGE BINARY LOGS TO 'master-bin.000003';; +FLUSH BINARY LOGS DELETE_DOMAIN_ID = (1); +Gtid_list of the current binlog does not contain '1': +show binlog events in 'master-bin.000004' limit 1,1; +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000004 # Gtid_list 1 # [] +But the previous log's Gtid_list may have it which explains a warning from the following command +show binlog events in 'master-bin.000003' limit 1,1; +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000003 # Gtid_list 1 # [1-1-1] +Already deleted domain in Gtid_list of the earliest log is benign +but may cause a warning +FLUSH BINARY LOGS DELETE_DOMAIN_ID = (1); +Warnings: +Warning 1076 The current gtid binlog state is incompatible with a former one missing gtids from the '1-1' domain-server pair which is referred to in the gtid list describing an earlier state. Ignore if the domain ('1') was already explicitly deleted. +Warning 1076 The gtid domain being deleted ('1') is not in the current binlog state +FLUSH BINARY LOGS DELETE_DOMAIN_ID = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 0); +ERROR HY000: Could not delete gtid domain. Reason: binlog files may contain gtids from the domain ('1') being deleted. Make sure to first purge those files. +FLUSH BINARY LOGS; +PURGE BINARY LOGS TO 'master-bin.000005'; +FLUSH BINARY LOGS DELETE_DOMAIN_ID = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 0); +Warnings: +Warning 1076 The gtid domain being deleted ('0') is not in the current binlog state +Gtid_list of the current binlog does not contain 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 0: +show binlog events in 'master-bin.000006' limit 1,1; +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000006 # Gtid_list 1 # [] +SET @@SESSION.gtid_domain_id=1;; +SET @@SESSION.server_id=1; +SET @@SESSION.gtid_seq_no=1; +INSERT INTO t SET a=1; +SET @@SESSION.server_id=2; +SET @@SESSION.gtid_seq_no=2; +INSERT INTO t SET a=2; +SET @@SESSION.gtid_domain_id=11; +SET @@SESSION.server_id=11; +SET @@SESSION.gtid_seq_no=11; +INSERT INTO t SET a=11; +SET @gtid_binlog_state_saved=@@GLOBAL.gtid_binlog_state; +FLUSH BINARY LOGS; +SET @@SESSION.gtid_domain_id=11; +SET @@SESSION.server_id=11; +SET @@SESSION.gtid_seq_no=1; +INSERT INTO t SET a=1; +SELECT @gtid_binlog_state_saved "as original state", @@GLOBAL.gtid_binlog_state as "out of order for 11 domain state"; +as original state out of order for 11 domain state +1-1-1,1-2-2,11-11-11 1-1-1,1-2-2,11-11-1 +PURGE BINARY LOGS TO 'master-bin.000007'; +the following command succeeds with warnings +FLUSH BINARY LOGS DELETE_DOMAIN_ID = (1); +Warnings: +Warning 1076 The current gtid binlog state is incompatible with a former one having a gtid '11-11-1' which is less than the '11-11-11' of the gtid list describing an earlier state. The state may have been affected by manually injecting a lower sequence number gtid or via replication. +DROP TABLE t; +RESET MASTER; diff --git a/mysql-test/suite/binlog/r/binlog_gtid_delete_domain_debug.result b/mysql-test/suite/binlog/r/binlog_gtid_delete_domain_debug.result new file mode 100644 index 00000000..b4627cac --- /dev/null +++ b/mysql-test/suite/binlog/r/binlog_gtid_delete_domain_debug.result @@ -0,0 +1,6 @@ +SET @@SESSION.debug_dbug='+d,inject_binlog_delete_domain_init_error'; +FLUSH BINARY LOGS DELETE_DOMAIN_ID = (99); +ERROR HY000: Could not delete gtid domain. Reason: injected error. +SHOW WARNINGS; +Level Code Message +Error 1076 Could not delete gtid domain. Reason: injected error. diff --git a/mysql-test/suite/binlog/t/binlog_flush_binlogs_delete_domain.test b/mysql-test/suite/binlog/t/binlog_flush_binlogs_delete_domain.test new file mode 100644 index 00000000..0faafa35 --- /dev/null +++ b/mysql-test/suite/binlog/t/binlog_flush_binlogs_delete_domain.test @@ -0,0 +1,137 @@ +# Prove basic properties of +# +# FLUSH BINARY LOGS DELETE_DOMAIN_ID = (...) +# +# The command removes the supplied list of domains from the current +# @@global.gtid_binlog_state provided the binlog files do not contain +# events from such domains. + +# The test is not format specific. One format is chosen to run it. +--source include/have_binlog_format_mixed.inc + +# Reset binlog state +RESET MASTER; + +# Empty list is accepted +FLUSH BINARY LOGS DELETE_DOMAIN_ID = (); +--echo and the command execution is effective thence rotates binlog as usual +--source include/show_binary_logs.inc + +--echo Non-existed domain is warned, the command completes without rotation +--echo but with a warning +--let $binlog_pre_flush=query_get_value(SHOW MASTER STATUS, Position, 1) +FLUSH BINARY LOGS DELETE_DOMAIN_ID = (99); +--let $binlog_start=$binlog_pre_flush +--source include/show_binary_logs.inc + +# Log one event in a specified domain and try to delete the domain +SET @@SESSION.gtid_domain_id=1; +SET @@SESSION.server_id=1; +CREATE TABLE t (a int); + +--error ER_BINLOG_CANT_DELETE_GTID_DOMAIN +FLUSH BINARY LOGS DELETE_DOMAIN_ID = (1); + +# the same error after log rotation +FLUSH BINARY LOGS; +--error ER_BINLOG_CANT_DELETE_GTID_DOMAIN +FLUSH BINARY LOGS DELETE_DOMAIN_ID = (1); + +# the latest binlog does not really contain any events incl ones from 1-domain +--let $purge_to_binlog= query_get_value(SHOW MASTER STATUS, File, 1) +--eval PURGE BINARY LOGS TO '$purge_to_binlog'; +# So now it's safe to delete +--error 0 +FLUSH BINARY LOGS DELETE_DOMAIN_ID = (1); +--echo Gtid_list of the current binlog does not contain '1': +--let $binlog_file=query_get_value(SHOW MASTER STATUS, File, 1) +--source include/show_gtid_list.inc +--echo But the previous log's Gtid_list may have it which explains a warning from the following command +--let $binlog_file=$purge_to_binlog +--source include/show_gtid_list.inc + +--echo Already deleted domain in Gtid_list of the earliest log is benign +--echo but may cause a warning +--error 0 +FLUSH BINARY LOGS DELETE_DOMAIN_ID = (1); + +# Few domains delete. The chosen number verifies among others how +# expected overrun of the static buffers of underlying dynamic arrays is doing. +--let $domain_cnt=17 +--let $server_in_domain_cnt=3 +--let $domain_list= +--disable_query_log +while ($domain_cnt) +{ + --let servers=$server_in_domain_cnt + --eval SET @@SESSION.gtid_domain_id=$domain_cnt + while ($servers) + { + --eval SET @@SESSION.server_id=10*$domain_cnt + $servers + --eval INSERT INTO t SET a=@@SESSION.server_id + + --dec $servers + } + --let $domain_list= $domain_cnt, $domain_list + + --dec $domain_cnt +} +--enable_query_log +--let $zero=0 +--let $domain_list= $domain_list$zero + +--error ER_BINLOG_CANT_DELETE_GTID_DOMAIN +--eval FLUSH BINARY LOGS DELETE_DOMAIN_ID = ($domain_list) + +# Now satisfy the safety condtion to purge log files containing $domain list +FLUSH BINARY LOGS; +--let $purge_to_binlog= query_get_value(SHOW MASTER STATUS, File, 1) +--eval PURGE BINARY LOGS TO '$purge_to_binlog' +--error 0 +--eval FLUSH BINARY LOGS DELETE_DOMAIN_ID = ($domain_list) +--echo Gtid_list of the current binlog does not contain $domain_list: +--let $binlog_file=query_get_value(SHOW MASTER STATUS, File, 1) +--source include/show_gtid_list.inc + +# Show reaction on @@global.gtid_binlog_state not succeeding +# earlier state as described by the 1st binlog' Gtid_list. +# Now let it be out-order gtid logged to a domain unrelated to deletion. + +--let $del_d_id=1 +--eval SET @@SESSION.gtid_domain_id=$del_d_id; +SET @@SESSION.server_id=1; +SET @@SESSION.gtid_seq_no=1; +INSERT INTO t SET a=1; +SET @@SESSION.server_id=2; +SET @@SESSION.gtid_seq_no=2; +INSERT INTO t SET a=2; + +SET @@SESSION.gtid_domain_id=11; +SET @@SESSION.server_id=11; +SET @@SESSION.gtid_seq_no=11; +INSERT INTO t SET a=11; + +SET @gtid_binlog_state_saved=@@GLOBAL.gtid_binlog_state; +FLUSH BINARY LOGS; + +# Inject out of order for domain '11' before +SET @@SESSION.gtid_domain_id=11; +SET @@SESSION.server_id=11; +SET @@SESSION.gtid_seq_no=1; +INSERT INTO t SET a=1; + +SELECT @gtid_binlog_state_saved "as original state", @@GLOBAL.gtid_binlog_state as "out of order for 11 domain state"; + +# to delete '1', first to purge logs containing its events +--let $purge_to_binlog= query_get_value(SHOW MASTER STATUS, File, 1) +--eval PURGE BINARY LOGS TO '$purge_to_binlog' + +--echo the following command succeeds with warnings +--eval FLUSH BINARY LOGS DELETE_DOMAIN_ID = ($del_d_id) + +# +# Cleanup +# + +DROP TABLE t; +RESET MASTER; diff --git a/mysql-test/suite/binlog/t/binlog_gtid_delete_domain_debug.test b/mysql-test/suite/binlog/t/binlog_gtid_delete_domain_debug.test new file mode 100644 index 00000000..5de549c4 --- /dev/null +++ b/mysql-test/suite/binlog/t/binlog_gtid_delete_domain_debug.test @@ -0,0 +1,11 @@ +# Check "internal" error branches of +# FLUSH BINARY LOGS DELETE_DOMAIN_ID = (...) +# handler. +--source include/have_debug.inc +--source include/have_binlog_format_mixed.inc + +SET @@SESSION.debug_dbug='+d,inject_binlog_delete_domain_init_error'; +--error ER_BINLOG_CANT_DELETE_GTID_DOMAIN +FLUSH BINARY LOGS DELETE_DOMAIN_ID = (99); + +SHOW WARNINGS; diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index cd19fccd..b67dea0f 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -54,3 +54,8 @@ 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 diff --git a/mysql-test/suite/galera/r/MW-388.result b/mysql-test/suite/galera/r/MW-388.result index 17d347a1..59d4d4a2 100644 --- a/mysql-test/suite/galera/r/MW-388.result +++ b/mysql-test/suite/galera/r/MW-388.result @@ -25,7 +25,7 @@ SET DEBUG_SYNC = "now SIGNAL wsrep_after_replication_continue"; SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; SELECT @errno = 1213; @errno = 1213 -1 +0 SELECT * FROM t1; f1 f2 1 node 2 diff --git a/mysql-test/suite/galera/r/galera_bf_lock_wait.result b/mysql-test/suite/galera/r/galera_bf_lock_wait.result new file mode 100644 index 00000000..4e6019ec --- /dev/null +++ b/mysql-test/suite/galera/r/galera_bf_lock_wait.result @@ -0,0 +1,18 @@ +CREATE TABLE t1 ENGINE=InnoDB select 1 as a, 1 as b union select 2, 2; +ALTER TABLE t1 add primary key(a); +CREATE PROCEDURE p1() +BEGIN +DECLARE CONTINUE HANDLER FOR SQLEXCEPTION rollback; +WHILE 1 DO +start transaction; +update t1 set b=connection_id() where a=1; +commit; +END WHILE; +END| +call p1; +call p1; +call p1; +call p1; +checking error log for 'BF lock wait long' message for 10 times every 10 seconds ... +drop table t1; +drop procedure p1; diff --git a/mysql-test/suite/galera/r/sql_log_bin.result b/mysql-test/suite/galera/r/sql_log_bin.result index 237725ec..a2ebafe5 100644 --- a/mysql-test/suite/galera/r/sql_log_bin.result +++ b/mysql-test/suite/galera/r/sql_log_bin.result @@ -6,6 +6,7 @@ INSERT INTO t1 VALUES (1); # Disable binary logging for current session SET SQL_LOG_BIN=OFF; INSERT INTO t1 VALUES (2); +FLUSH BINARY LOGS; CREATE TABLE t2(c1 INT PRIMARY KEY) ENGINE=INNODB; INSERT INTO t2 VALUES (1); CREATE TABLE test.t3 AS SELECT * from t1; diff --git a/mysql-test/suite/galera/t/galera_bf_lock_wait.test b/mysql-test/suite/galera/t/galera_bf_lock_wait.test new file mode 100644 index 00000000..e3a9077a --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_lock_wait.test @@ -0,0 +1,52 @@ +--source include/galera_cluster.inc +--source include/big_test.inc + +CREATE TABLE t1 ENGINE=InnoDB select 1 as a, 1 as b union select 2, 2; +ALTER TABLE t1 add primary key(a); + +DELIMITER |; + +CREATE PROCEDURE p1() +BEGIN + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION rollback; + WHILE 1 DO + start transaction; + update t1 set b=connection_id() where a=1; + commit; + END WHILE; +END| + + +DELIMITER ;| + +--connect node_1_p1, 127.0.0.1, root, , test, $NODE_MYPORT_1 +send call p1; +--connect node_1_p2, 127.0.0.1, root, , test, $NODE_MYPORT_1 +send call p1; +--connect node_2_p1, 127.0.0.1, root, , test, $NODE_MYPORT_2 +send call p1; +--connect node_2_p2, 127.0.0.1, root, , test, $NODE_MYPORT_2 +send call p1; + +connection default; +let $counter=10; +let $sleep_period=10; + +echo checking error log for 'BF lock wait long' message for $counter times every $sleep_period seconds ...; +while($counter > 0) +{ +--disable_query_log +--disable_result_log + eval do sleep($sleep_period); +--enable_query_log +--enable_result_log + +# use error 0,1 instead if want test to continue + --error 1 + exec grep 'BF lock wait long' $MYSQLTEST_VARDIR/log/mysqld.*.err; + dec $counter; +} + +drop table t1; +drop procedure p1; + diff --git a/mysql-test/suite/galera/t/sql_log_bin.test b/mysql-test/suite/galera/t/sql_log_bin.test index 615bc4c3..9f8f7c84 100644 --- a/mysql-test/suite/galera/t/sql_log_bin.test +++ b/mysql-test/suite/galera/t/sql_log_bin.test @@ -1,5 +1,13 @@ # Test to check the behavior of galera cluster with sql_log_bin=ON|OFF & binary # logging is disabled. sql_bin_log should not affect galera replication. +# +# The following bugfixes are tested: +# +# MDEV-9510: Segmentation fault in binlog thread. +# A scenario otherwise causing a similar segfault is replayed. +# The test must pass having no crashes. +# The sequence of sql statements is provided by original +# sql_log_bin.test augmented with a FLUSH BINLOG LOGS, below. --source include/galera_cluster.inc --source include/have_innodb.inc @@ -15,6 +23,10 @@ INSERT INTO t1 VALUES (1); --echo # Disable binary logging for current session SET SQL_LOG_BIN=OFF; INSERT INTO t1 VALUES (2); + +# MDEV-9510: the following binlog rotation due to FLUSH segfaults wo/ the fixes +FLUSH BINARY LOGS; + CREATE TABLE t2(c1 INT PRIMARY KEY) ENGINE=INNODB; INSERT INTO t2 VALUES (1); CREATE TABLE test.t3 AS SELECT * from t1; diff --git a/mysql-test/suite/innodb/r/innodb-autoinc.result b/mysql-test/suite/innodb/r/innodb-autoinc.result index ddca4685..7d50ed00 100644 --- a/mysql-test/suite/innodb/r/innodb-autoinc.result +++ b/mysql-test/suite/innodb/r/innodb-autoinc.result @@ -1348,3 +1348,21 @@ t CREATE TABLE `t` ( KEY `i` (`i`) ) ENGINE=InnoDB AUTO_INCREMENT=401 DEFAULT CHARSET=latin1 DROP TABLE t; +# +# MDEV-14008 Assertion failing: `!is_set() || (m_status == DA_OK_BULK && is_bulk_op()) +# +SET sql_mode=STRICT_ALL_TABLES; +CREATE TABLE t1 ( +c1 DOUBLE NOT NULL PRIMARY KEY AUTO_INCREMENT +) ENGINE=InnoDB AUTO_INCREMENT=10000000000000000000; +INSERT INTO t1 VALUES (); +SELECT * FROM t1; +c1 +1e19 +DROP TABLE t1; +CREATE TABLE t1 (a DOUBLE PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (-1); +SELECT * FROM t1; +a +-1 +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/innodb-index-debug.result b/mysql-test/suite/innodb/r/innodb-index-debug.result index d78ba680..69dd8742 100644 --- a/mysql-test/suite/innodb/r/innodb-index-debug.result +++ b/mysql-test/suite/innodb/r/innodb-index-debug.result @@ -67,3 +67,25 @@ alter table t1 force, algorithm=inplace; ERROR HY000: Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space SET DEBUG_DBUG = @saved_debug_dbug; drop table t1, t480; +# +# MDEV-12827 Assertion failure when reporting duplicate key error +# in online table rebuild +# +CREATE TABLE t1 (j INT UNIQUE, i INT UNIQUE) ENGINE=InnoDB; +SET DEBUG_SYNC='row_log_table_apply1_before SIGNAL built WAIT_FOR log'; +ALTER TABLE t1 DROP j, FORCE; +SET DEBUG_SYNC='now WAIT_FOR built'; +INSERT INTO t1 (i) VALUES (0),(0); +ERROR 23000: Duplicate entry '0' for key 'i' +SET DEBUG_SYNC='now SIGNAL log'; +ERROR 23000: Duplicate entry '0' for key 'i' +SET DEBUG_SYNC='row_log_table_apply1_before SIGNAL built2 WAIT_FOR log2'; +ALTER TABLE t1 DROP j, FORCE; +SET DEBUG_SYNC='now WAIT_FOR built2'; +INSERT INTO t1 (i) VALUES (0),(1); +UPDATE t1 SET i=0; +ERROR 23000: Duplicate entry '0' for key 'i' +SET DEBUG_SYNC='now SIGNAL log2'; +ERROR 23000: Duplicate entry '0' for key 'i' +SET DEBUG_SYNC='RESET'; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/innodb-replace-debug.result b/mysql-test/suite/innodb/r/innodb-replace-debug.result new file mode 100644 index 00000000..84bc9dc9 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-replace-debug.result @@ -0,0 +1,13 @@ +# +# Bug#17604730 ASSERTION: *CURSOR->INDEX->NAME == TEMP_INDEX_PREFIX +# +create table t1 (f1 int primary key, f2 int, f3 int, unique key k1(f2), +key k2(f3)) engine=innodb; +insert into t1 values (14, 24, 34); +set @@debug_dbug = '+d,row_ins_sec_index_entry_timeout'; +replace into t1 values (14, 25, 34); +select * from t1; +f1 f2 f3 +14 25 34 +drop table t1; +set @@debug_dbug = '-d,row_ins_sec_index_entry_timeout'; diff --git a/mysql-test/suite/innodb/r/recovery_shutdown.result b/mysql-test/suite/innodb/r/recovery_shutdown.result new file mode 100644 index 00000000..861461dd --- /dev/null +++ b/mysql-test/suite/innodb/r/recovery_shutdown.result @@ -0,0 +1,56 @@ +# +# MDEV-13797 InnoDB may hang if shutdown is initiated soon after startup +# while rolling back recovered incomplete transactions +# +CREATE TABLE t (a INT) ENGINE=InnoDB; +BEGIN; +COMMIT; +CREATE TABLE t8 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB; +BEGIN; +INSERT INTO t8 (a) SELECT NULL FROM t; +UPDATE t8 SET a=a+100, b=a; +DELETE FROM t8; +CREATE TABLE t7 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB; +BEGIN; +INSERT INTO t7 (a) SELECT NULL FROM t; +UPDATE t7 SET a=a+100, b=a; +DELETE FROM t7; +CREATE TABLE t6 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB; +BEGIN; +INSERT INTO t6 (a) SELECT NULL FROM t; +UPDATE t6 SET a=a+100, b=a; +DELETE FROM t6; +CREATE TABLE t5 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB; +BEGIN; +INSERT INTO t5 (a) SELECT NULL FROM t; +UPDATE t5 SET a=a+100, b=a; +DELETE FROM t5; +CREATE TABLE t4 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB; +BEGIN; +INSERT INTO t4 (a) SELECT NULL FROM t; +UPDATE t4 SET a=a+100, b=a; +DELETE FROM t4; +CREATE TABLE t3 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB; +BEGIN; +INSERT INTO t3 (a) SELECT NULL FROM t; +UPDATE t3 SET a=a+100, b=a; +DELETE FROM t3; +CREATE TABLE t2 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB; +BEGIN; +INSERT INTO t2 (a) SELECT NULL FROM t; +UPDATE t2 SET a=a+100, b=a; +DELETE FROM t2; +CREATE TABLE t1 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB; +BEGIN; +INSERT INTO t1 (a) SELECT NULL FROM t; +UPDATE t1 SET a=a+100, b=a; +DELETE FROM t1; +INSERT INTO t1(a) SELECT NULL FROM t; +INSERT INTO t1(a) SELECT NULL FROM t1; +INSERT INTO t1(a) SELECT NULL FROM t1; +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 +DROP TABLE t,u; diff --git a/mysql-test/suite/innodb/t/innodb-autoinc.test b/mysql-test/suite/innodb/t/innodb-autoinc.test index dd4c4ae8..75b2e898 100644 --- a/mysql-test/suite/innodb/t/innodb-autoinc.test +++ b/mysql-test/suite/innodb/t/innodb-autoinc.test @@ -680,3 +680,20 @@ INSERT INTO t VALUES (NULL); SELECT * FROM t; SHOW CREATE TABLE t; DROP TABLE t; + +--echo # +--echo # MDEV-14008 Assertion failing: `!is_set() || (m_status == DA_OK_BULK && is_bulk_op()) +--echo # + +SET sql_mode=STRICT_ALL_TABLES; +CREATE TABLE t1 ( + c1 DOUBLE NOT NULL PRIMARY KEY AUTO_INCREMENT +) ENGINE=InnoDB AUTO_INCREMENT=10000000000000000000; +INSERT INTO t1 VALUES (); +SELECT * FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a DOUBLE PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (-1); +SELECT * FROM t1; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/innodb-index-debug.test b/mysql-test/suite/innodb/t/innodb-index-debug.test index d4fcda4f..e179b969 100644 --- a/mysql-test/suite/innodb/t/innodb-index-debug.test +++ b/mysql-test/suite/innodb/t/innodb-index-debug.test @@ -1,7 +1,6 @@ -- source include/have_debug.inc -- source include/have_innodb.inc - -let $MYSQLD_DATADIR= `select @@datadir`; +-- source include/have_debug_sync.inc let $per_table=`select @@innodb_file_per_table`; let $format=`select @@innodb_file_format`; @@ -82,3 +81,42 @@ SET DEBUG_DBUG = '+d,innobase_tmpfile_creation_failure'; alter table t1 force, algorithm=inplace; SET DEBUG_DBUG = @saved_debug_dbug; drop table t1, t480; + +--echo # +--echo # MDEV-12827 Assertion failure when reporting duplicate key error +--echo # in online table rebuild +--echo # + +CREATE TABLE t1 (j INT UNIQUE, i INT UNIQUE) ENGINE=InnoDB; +--connect (con1,localhost,root,,test) +SET DEBUG_SYNC='row_log_table_apply1_before SIGNAL built WAIT_FOR log'; +--send +ALTER TABLE t1 DROP j, FORCE; + +--connection default +SET DEBUG_SYNC='now WAIT_FOR built'; +--error ER_DUP_ENTRY +INSERT INTO t1 (i) VALUES (0),(0); +SET DEBUG_SYNC='now SIGNAL log'; + +--connection con1 +--error ER_DUP_ENTRY +reap; +SET DEBUG_SYNC='row_log_table_apply1_before SIGNAL built2 WAIT_FOR log2'; +--send +ALTER TABLE t1 DROP j, FORCE; + +--connection default +SET DEBUG_SYNC='now WAIT_FOR built2'; +INSERT INTO t1 (i) VALUES (0),(1); +--error ER_DUP_ENTRY +UPDATE t1 SET i=0; +SET DEBUG_SYNC='now SIGNAL log2'; + +--connection con1 +--error ER_DUP_ENTRY +reap; +--disconnect con1 +--connection default +SET DEBUG_SYNC='RESET'; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/innodb-replace-debug.test b/mysql-test/suite/innodb/t/innodb-replace-debug.test new file mode 100644 index 00000000..5cec9e1f --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-replace-debug.test @@ -0,0 +1,15 @@ +--source include/have_innodb.inc +--source include/have_debug.inc + +--echo # +--echo # Bug#17604730 ASSERTION: *CURSOR->INDEX->NAME == TEMP_INDEX_PREFIX +--echo # + +create table t1 (f1 int primary key, f2 int, f3 int, unique key k1(f2), + key k2(f3)) engine=innodb; +insert into t1 values (14, 24, 34); +set @@debug_dbug = '+d,row_ins_sec_index_entry_timeout'; +replace into t1 values (14, 25, 34); +select * from t1; +drop table t1; +set @@debug_dbug = '-d,row_ins_sec_index_entry_timeout'; diff --git a/mysql-test/suite/innodb/t/recovery_shutdown.test b/mysql-test/suite/innodb/t/recovery_shutdown.test new file mode 100644 index 00000000..28b80cd3 --- /dev/null +++ b/mysql-test/suite/innodb/t/recovery_shutdown.test @@ -0,0 +1,57 @@ +--source include/have_innodb.inc +--source include/not_embedded.inc + +--echo # +--echo # MDEV-13797 InnoDB may hang if shutdown is initiated soon after startup +--echo # while rolling back recovered incomplete transactions +--echo # + +CREATE TABLE t (a INT) ENGINE=InnoDB; +let $size = 100; +let $trx = 8; +let $c = $size; +BEGIN; +--disable_query_log +while ($c) { +INSERT INTO t VALUES(); +dec $c; +} +--enable_query_log +COMMIT; + +let $c = $trx; +while ($c) +{ +connect (con$c,localhost,root,,); +eval CREATE TABLE t$c (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB; +BEGIN; +eval INSERT INTO t$c (a) SELECT NULL FROM t; +eval UPDATE t$c SET a=a+$size, b=a; +eval DELETE FROM t$c; +dec $c; +} + +INSERT INTO t1(a) SELECT NULL FROM t; +INSERT INTO t1(a) SELECT NULL FROM t1; +INSERT INTO t1(a) SELECT NULL FROM t1; +INSERT INTO t1(a) SELECT NULL FROM t1; +INSERT INTO t1(a) SELECT NULL FROM t1; + +--connection default +SET GLOBAL innodb_flush_log_at_trx_commit=1; +CREATE TABLE u(a SERIAL) ENGINE=INNODB; + +--source include/kill_and_restart_mysqld.inc +--source include/restart_mysqld.inc + +--disable_query_log +let $c = $trx; +while ($c) +{ +disconnect con$c; +eval DROP TABLE t$c; +dec $c; +} +--enable_query_log + +DROP TABLE t,u; diff --git a/mysql-test/suite/innodb/t/table_definition_cache_debug.opt b/mysql-test/suite/innodb/t/table_definition_cache_debug.opt index 6195e055..6d341857 100644 --- a/mysql-test/suite/innodb/t/table_definition_cache_debug.opt +++ b/mysql-test/suite/innodb/t/table_definition_cache_debug.opt @@ -1 +1 @@ ---innodb-open-files=13 +--innodb-open-files=20 diff --git a/mysql-test/suite/mariabackup/apply-log-only-incr.result b/mysql-test/suite/mariabackup/apply-log-only-incr.result index 2baed8c1..f724d1d1 100644 --- a/mysql-test/suite/mariabackup/apply-log-only-incr.result +++ b/mysql-test/suite/mariabackup/apply-log-only-incr.result @@ -3,6 +3,10 @@ CREATE TABLE t(a INT UNSIGNED PRIMARY KEY) ENGINE INNODB; INSERT INTO t VALUES(0); COMMIT; start transaction; +BEGIN; +DELETE FROM t LIMIT 1; +SET GLOBAL innodb_flush_log_at_trx_commit = 1; +ROLLBACK; NOT FOUND /Rollback of trx with id/ in current_test # expect NOT FOUND NOT FOUND /Rollback of trx with id/ in current_test diff --git a/mysql-test/suite/mariabackup/apply-log-only-incr.test b/mysql-test/suite/mariabackup/apply-log-only-incr.test index aa5110cc..81c91d3c 100644 --- a/mysql-test/suite/mariabackup/apply-log-only-incr.test +++ b/mysql-test/suite/mariabackup/apply-log-only-incr.test @@ -26,6 +26,13 @@ eval INSERT t VALUES(201-$n); dec $n; } --enable_query_log +connect (flush_log,localhost,root,,); +BEGIN; +DELETE FROM t LIMIT 1; +SET GLOBAL innodb_flush_log_at_trx_commit = 1; +ROLLBACK; +disconnect flush_log; +connection default; --disable_result_log exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --ftwrl-wait-timeout=5 --ftwrl-wait-threshold=300 --ftwrl-wait-query-type=all --target-dir=$incremental_dir --incremental-basedir=$basedir ; diff --git a/mysql-test/suite/mariabackup/mdev-14447.opt b/mysql-test/suite/mariabackup/mdev-14447.opt new file mode 100644 index 00000000..5ac67e95 --- /dev/null +++ b/mysql-test/suite/mariabackup/mdev-14447.opt @@ -0,0 +1 @@ +--sequence --innodb-data-file-path=ibdata_first:3M;ibdata_second:1M:autoextend \ No newline at end of file diff --git a/mysql-test/suite/mariabackup/mdev-14447.result b/mysql-test/suite/mariabackup/mdev-14447.result new file mode 100644 index 00000000..3bca7eb5 --- /dev/null +++ b/mysql-test/suite/mariabackup/mdev-14447.result @@ -0,0 +1,19 @@ +call mtr.add_suppression("InnoDB: New log files created"); +CREATE TABLE t(a varchar(40) PRIMARY KEY, b varchar(40), c varchar(40), d varchar(40), index(b,c,d)) ENGINE INNODB; +# Create full backup , modify table, then create incremental/differential backup +BEGIN; +INSERT INTO t select uuid(), uuid(), uuid(), uuid() from seq_1_to_100000; +COMMIT; +SELECT count(*) FROM t; +count(*) +100000 +# Prepare full backup, apply incremental one +# Restore and check results +# shutdown server +# remove datadir +# xtrabackup move back +# restart server +SELECT count(*) FROM t; +count(*) +100000 +DROP TABLE t; diff --git a/mysql-test/suite/mariabackup/mdev-14447.test b/mysql-test/suite/mariabackup/mdev-14447.test new file mode 100644 index 00000000..48f37646 --- /dev/null +++ b/mysql-test/suite/mariabackup/mdev-14447.test @@ -0,0 +1,46 @@ +call mtr.add_suppression("InnoDB: New log files created"); + +let $basedir=$MYSQLTEST_VARDIR/tmp/backup; +let $incremental_dir=$MYSQLTEST_VARDIR/tmp/backup_inc1; + +CREATE TABLE t(a varchar(40) PRIMARY KEY, b varchar(40), c varchar(40), d varchar(40), index(b,c,d)) ENGINE INNODB; + +echo # Create full backup , modify table, then create incremental/differential backup; +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir; +--enable_result_log +BEGIN; +INSERT INTO t select uuid(), uuid(), uuid(), uuid() from seq_1_to_100000; +COMMIT; +SELECT count(*) FROM t; + +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$incremental_dir --incremental-basedir=$basedir; + +--disable_result_log +echo # Prepare full backup, apply incremental one; +exec $XTRABACKUP --prepare --apply-log-only --target-dir=$basedir; +exec $XTRABACKUP --prepare --apply-log-only --target-dir=$basedir --incremental-dir=$incremental_dir ; + +echo # Restore and check results; +let $targetdir=$basedir; +#-- source include/restart_and_restore.inc + +let $_datadir= `SELECT @@datadir`; +let $innodb_data_file_path=`SELECT @@innodb_data_file_path`; +echo # shutdown server; +--source include/shutdown_mysqld.inc +echo # remove datadir; +rmdir $_datadir; +echo # xtrabackup move back; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --copy-back --datadir=$_datadir "--innodb_data_file_path=$innodb_data_file_path" --target-dir=$targetdir; +echo # restart server; +--source include/start_mysqld.inc + + +--enable_result_log +SELECT count(*) FROM t; +DROP TABLE t; + +# Cleanup +rmdir $basedir; +rmdir $incremental_dir; diff --git a/mysql-test/suite/parts/inc/part_alter_values.inc b/mysql-test/suite/parts/inc/part_alter_values.inc new file mode 100644 index 00000000..0d4929d9 --- /dev/null +++ b/mysql-test/suite/parts/inc/part_alter_values.inc @@ -0,0 +1,37 @@ +--echo # +--echo # MDEV-14641 Incompatible key or row definition between the MariaDB .frm file and the information in the storage engine +--echo # + +--eval CREATE TABLE t1 (i INT) ENGINE=$engine PARTITION BY LIST(i) (PARTITION p0 VALUES IN (1), PARTITION p1 VALUES IN (2)); +ALTER TABLE t1 ROW_FORMAT=COMPRESSED; +ALTER TABLE t1 DROP PARTITION p1; +SELECT * FROM t1; + +# Cleanup +DROP TABLE t1; + + +--echo # +--echo # MDEV-13788 Server crash when issuing bad SQL partition syntax +--echo # + +--eval CREATE TABLE t1 (id int, d date) ENGINE=$engine PARTITION BY RANGE COLUMNS(d) (PARTITION p1 VALUES LESS THAN (MAXVALUE)) +SHOW CREATE TABLE t1; +--error ER_PARTITION_REQUIRES_VALUES_ERROR +ALTER TABLE t1 REORGANIZE PARTITION p1 INTO +( + PARTITION p2, /* Notice no values */ + PARTITION p3 VALUES LESS THAN (MAXVALUE) +); +DROP TABLE t1; + + +--eval CREATE TABLE t1 (id int, d date) ENGINE=$engine PARTITION BY LIST (id) (PARTITION p1 VALUES IN (1,2,3)) +SHOW CREATE TABLE t1; +--error ER_PARTITION_REQUIRES_VALUES_ERROR +ALTER TABLE t1 REORGANIZE PARTITION p1 INTO +( + PARTITION p2, /* Notice no values */ + PARTITION p3 VALUES IN (4,5,6) +); +DROP TABLE t1; diff --git a/mysql-test/suite/parts/r/partition_alter_innodb.result b/mysql-test/suite/parts/r/partition_alter_innodb.result new file mode 100644 index 00000000..29076a3c --- /dev/null +++ b/mysql-test/suite/parts/r/partition_alter_innodb.result @@ -0,0 +1,49 @@ +# +# MDEV-14641 Incompatible key or row definition between the MariaDB .frm file and the information in the storage engine +# +CREATE TABLE t1 (i INT) ENGINE=InnoDB PARTITION BY LIST(i) (PARTITION p0 VALUES IN (1), PARTITION p1 VALUES IN (2));; +ALTER TABLE t1 ROW_FORMAT=COMPRESSED; +Warnings: +Warning 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_format > Antelope. +Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. +Warning 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_format > Antelope. +Warning 1478 InnoDB: assuming ROW_FORMAT=COMPACT. +ALTER TABLE t1 DROP PARTITION p1; +SELECT * FROM t1; +i +DROP TABLE t1; +# +# MDEV-13788 Server crash when issuing bad SQL partition syntax +# +CREATE TABLE t1 (id int, d date) ENGINE=InnoDB PARTITION BY RANGE COLUMNS(d) (PARTITION p1 VALUES LESS THAN (MAXVALUE)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) DEFAULT NULL, + `d` date DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +/*!50500 PARTITION BY RANGE COLUMNS(d) +(PARTITION p1 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB) */ +ALTER TABLE t1 REORGANIZE PARTITION p1 INTO +( +PARTITION p2, /* Notice no values */ +PARTITION p3 VALUES LESS THAN (MAXVALUE) +); +ERROR HY000: Syntax error: RANGE PARTITIONING requires definition of VALUES LESS THAN for each partition +DROP TABLE t1; +CREATE TABLE t1 (id int, d date) ENGINE=InnoDB PARTITION BY LIST (id) (PARTITION p1 VALUES IN (1,2,3)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) DEFAULT NULL, + `d` date DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +/*!50100 PARTITION BY LIST (id) +(PARTITION p1 VALUES IN (1,2,3) ENGINE = InnoDB) */ +ALTER TABLE t1 REORGANIZE PARTITION p1 INTO +( +PARTITION p2, /* Notice no values */ +PARTITION p3 VALUES IN (4,5,6) +); +ERROR HY000: Syntax error: LIST PARTITIONING requires definition of VALUES IN for each partition +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 6343566e..fd09c0bd 100644 --- a/mysql-test/suite/parts/r/partition_alter_maria.result +++ b/mysql-test/suite/parts/r/partition_alter_maria.result @@ -16,3 +16,47 @@ select * from t1; pk dt 1 2017-09-28 15:12:00 drop table t1; +# +# MDEV-14641 Incompatible key or row definition between the MariaDB .frm file and the information in the storage engine +# +CREATE TABLE t1 (i INT) ENGINE=Aria PARTITION BY LIST(i) (PARTITION p0 VALUES IN (1), PARTITION p1 VALUES IN (2));; +ALTER TABLE t1 ROW_FORMAT=COMPRESSED; +ALTER TABLE t1 DROP PARTITION p1; +SELECT * FROM t1; +i +DROP TABLE t1; +# +# MDEV-13788 Server crash when issuing bad SQL partition syntax +# +CREATE TABLE t1 (id int, d date) ENGINE=Aria PARTITION BY RANGE COLUMNS(d) (PARTITION p1 VALUES LESS THAN (MAXVALUE)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) DEFAULT NULL, + `d` date DEFAULT NULL +) ENGINE=Aria DEFAULT CHARSET=latin1 +/*!50500 PARTITION BY RANGE COLUMNS(d) +(PARTITION p1 VALUES LESS THAN (MAXVALUE) ENGINE = Aria) */ +ALTER TABLE t1 REORGANIZE PARTITION p1 INTO +( +PARTITION p2, /* Notice no values */ +PARTITION p3 VALUES LESS THAN (MAXVALUE) +); +ERROR HY000: Syntax error: RANGE PARTITIONING requires definition of VALUES LESS THAN for each partition +DROP TABLE t1; +CREATE TABLE t1 (id int, d date) ENGINE=Aria PARTITION BY LIST (id) (PARTITION p1 VALUES IN (1,2,3)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) DEFAULT NULL, + `d` date DEFAULT NULL +) ENGINE=Aria DEFAULT CHARSET=latin1 +/*!50100 PARTITION BY LIST (id) +(PARTITION p1 VALUES IN (1,2,3) ENGINE = Aria) */ +ALTER TABLE t1 REORGANIZE PARTITION p1 INTO +( +PARTITION p2, /* Notice no values */ +PARTITION p3 VALUES IN (4,5,6) +); +ERROR HY000: Syntax error: LIST PARTITIONING requires definition of VALUES IN for each partition +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 new file mode 100644 index 00000000..9f238103 --- /dev/null +++ b/mysql-test/suite/parts/r/partition_alter_myisam.result @@ -0,0 +1,44 @@ +# +# MDEV-14641 Incompatible key or row definition between the MariaDB .frm file and the information in the storage engine +# +CREATE TABLE t1 (i INT) ENGINE=MyISAM PARTITION BY LIST(i) (PARTITION p0 VALUES IN (1), PARTITION p1 VALUES IN (2));; +ALTER TABLE t1 ROW_FORMAT=COMPRESSED; +ALTER TABLE t1 DROP PARTITION p1; +SELECT * FROM t1; +i +DROP TABLE t1; +# +# MDEV-13788 Server crash when issuing bad SQL partition syntax +# +CREATE TABLE t1 (id int, d date) ENGINE=MyISAM PARTITION BY RANGE COLUMNS(d) (PARTITION p1 VALUES LESS THAN (MAXVALUE)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) DEFAULT NULL, + `d` date DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +/*!50500 PARTITION BY RANGE COLUMNS(d) +(PARTITION p1 VALUES LESS THAN (MAXVALUE) ENGINE = MyISAM) */ +ALTER TABLE t1 REORGANIZE PARTITION p1 INTO +( +PARTITION p2, /* Notice no values */ +PARTITION p3 VALUES LESS THAN (MAXVALUE) +); +ERROR HY000: Syntax error: RANGE PARTITIONING requires definition of VALUES LESS THAN for each partition +DROP TABLE t1; +CREATE TABLE t1 (id int, d date) ENGINE=MyISAM PARTITION BY LIST (id) (PARTITION p1 VALUES IN (1,2,3)); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) DEFAULT NULL, + `d` date DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +/*!50100 PARTITION BY LIST (id) +(PARTITION p1 VALUES IN (1,2,3) ENGINE = MyISAM) */ +ALTER TABLE t1 REORGANIZE PARTITION p1 INTO +( +PARTITION p2, /* Notice no values */ +PARTITION p3 VALUES IN (4,5,6) +); +ERROR HY000: Syntax error: LIST PARTITIONING requires definition of VALUES IN for each partition +DROP TABLE t1; diff --git a/mysql-test/suite/parts/t/partition_alter_innodb.test b/mysql-test/suite/parts/t/partition_alter_innodb.test new file mode 100644 index 00000000..451bec05 --- /dev/null +++ b/mysql-test/suite/parts/t/partition_alter_innodb.test @@ -0,0 +1,4 @@ +--source include/have_innodb.inc +--source include/have_partition.inc +--let $engine=InnoDB +--source inc/part_alter_values.inc diff --git a/mysql-test/suite/parts/t/partition_alter_maria.test b/mysql-test/suite/parts/t/partition_alter_maria.test index db249591..e21f0dfa 100644 --- a/mysql-test/suite/parts/t/partition_alter_maria.test +++ b/mysql-test/suite/parts/t/partition_alter_maria.test @@ -16,3 +16,6 @@ select * from t1; alter table t1 drop partition p20181231; select * from 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 new file mode 100644 index 00000000..a53fa333 --- /dev/null +++ b/mysql-test/suite/parts/t/partition_alter_myisam.test @@ -0,0 +1,3 @@ +--source include/have_partition.inc +--let $engine=MyISAM +--source inc/part_alter_values.inc diff --git a/mysql-test/suite/perfschema/r/misc.result b/mysql-test/suite/perfschema/r/misc.result index 2adf2cba..7a097a27 100644 --- a/mysql-test/suite/perfschema/r/misc.result +++ b/mysql-test/suite/perfschema/r/misc.result @@ -118,3 +118,19 @@ B select count(*) from events_statements_history where sql_text like "%..."; count(*) 2 +use test; +create table t1 (id int); +insert into t1 values (1), (2), (3); +truncate performance_schema.events_statements_history; +select * from t1; +id +1 +2 +3 +insert into t1 select RAND()*10000 from t1; +select sql_text, rows_examined from performance_schema.events_statements_history; +sql_text rows_examined +truncate performance_schema.events_statements_history 0 +select * from t1 3 +insert into t1 select RAND()*10000 from t1 6 +drop table t1; diff --git a/mysql-test/suite/perfschema/r/start_server_low_digest.result b/mysql-test/suite/perfschema/r/start_server_low_digest.result index 8cc92f21..6fc41fbb 100644 --- a/mysql-test/suite/perfschema/r/start_server_low_digest.result +++ b/mysql-test/suite/perfschema/r/start_server_low_digest.result @@ -8,5 +8,5 @@ SELECT 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1 #################################### SELECT event_name, digest, digest_text, sql_text FROM events_statements_history_long; event_name digest digest_text sql_text -statement/sql/truncate e1c917a43f978456fab15240f89372ca TRUNCATE TABLE truncate table events_statements_history_long -statement/sql/select 3f7ca34376814d0e985337bd588b5ffd SELECT ? + ? + SELECT 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1 +statement/sql/truncate 6206ac02a54d832f55015e480e6f2213 TRUNCATE TABLE truncate table events_statements_history_long +statement/sql/select 4cc1c447d79877c4e8df0423fd0cde9a SELECT ? + ? + SELECT 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1 diff --git a/mysql-test/suite/perfschema/t/misc.test b/mysql-test/suite/perfschema/t/misc.test index bf3e8aff..c9f7dc6b 100644 --- a/mysql-test/suite/perfschema/t/misc.test +++ b/mysql-test/suite/perfschema/t/misc.test @@ -207,3 +207,18 @@ select 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa select _utf8mb4 'васÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑвасÑ' as B; select count(*) from events_statements_history where sql_text like "%..."; + + +# +# MDEV-10486 MariaDB 10.x does not update rows_examined in performance_schema tables +# Verify that the rows_examined counter is set properly. + +use test; +create table t1 (id int); +insert into t1 values (1), (2), (3); +truncate performance_schema.events_statements_history; +select * from t1; +insert into t1 select RAND()*10000 from t1; +select sql_text, rows_examined from performance_schema.events_statements_history; +drop table t1; + diff --git a/mysql-test/suite/plugins/r/binlog-simple_plugin_check.result b/mysql-test/suite/plugins/r/binlog-simple_plugin_check.result new file mode 100644 index 00000000..6c960ee3 --- /dev/null +++ b/mysql-test/suite/plugins/r/binlog-simple_plugin_check.result @@ -0,0 +1,19 @@ +INSTALL SONAME "simple_password_check"; +SELECT PLUGIN_NAME FROM INFORMATION_SCHEMA.PLUGINS +WHERE PLUGIN_NAME='simple_password_check'; +PLUGIN_NAME +simple_password_check +# +# MDEV-14031 Password policy causes replication failure +# +CREATE USER user1@localhost IDENTIFIED BY 'BsG9#9.cem#!85'; +CREATE USER user2@localhost IDENTIFIED BY 'bsg9#d.cem#!85'; +ERROR HY000: Your password does not satisfy the current policy requirements +DROP USER user1@localhost; +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 USER user1@localhost IDENTIFIED BY 'BsG9#9.cem#!85' +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; DROP USER user1@localhost +UNINSTALL PLUGIN simple_password_check; diff --git a/mysql-test/suite/plugins/t/binlog-simple_plugin_check.test b/mysql-test/suite/plugins/t/binlog-simple_plugin_check.test new file mode 100644 index 00000000..773dafe8 --- /dev/null +++ b/mysql-test/suite/plugins/t/binlog-simple_plugin_check.test @@ -0,0 +1,31 @@ +--source include/not_embedded.inc +--source include/have_binlog_format_statement.inc + +if (!$SIMPLE_PASSWORD_CHECK_SO) { + skip No SIMPLE_PASSWORD_CHECK plugin; +} + +INSTALL SONAME "simple_password_check"; +SELECT PLUGIN_NAME FROM INFORMATION_SCHEMA.PLUGINS +WHERE PLUGIN_NAME='simple_password_check'; + + +--echo # +--echo # MDEV-14031 Password policy causes replication failure +--echo # + +--disable_query_log +RESET MASTER; # get rid of previous tests binlog +--enable_query_log + +CREATE USER user1@localhost IDENTIFIED BY 'BsG9#9.cem#!85'; + +--error ER_NOT_VALID_PASSWORD +CREATE USER user2@localhost IDENTIFIED BY 'bsg9#d.cem#!85'; + +DROP USER user1@localhost; + +--let $binlog_file = LAST +source include/show_binlog_events.inc; + +UNINSTALL PLUGIN simple_password_check; diff --git a/mysql-test/suite/roles/flush_roles-12366.result b/mysql-test/suite/roles/flush_roles-12366.result new file mode 100644 index 00000000..5897e480 --- /dev/null +++ b/mysql-test/suite/roles/flush_roles-12366.result @@ -0,0 +1,539 @@ +# +# MDEV-12366: FLUSH PRIVILEGES can break hierarchy of roles +# +# This testcase contains a user, who is granted a master role +# operations_cluster. operations_cluster is granted 8 different roles +# who in turn each have 4 different roles granted to them. +# +# Only the leaf roles contain privileges to access databases. +# Make sure the user has access to all databases if the master role +# is granted to him. +# +CREATE USER u; +CREATE ROLE operations_cluster; +GRANT operations_cluster TO u; +CREATE DATABASE bob_live_sg; +CREATE TABLE bob_live_sg.a (i INT(10)); +CREATE TABLE bob_live_sg.b (i INT(10)); +CREATE TABLE bob_live_sg.c (i INT(10)); +CREATE TABLE bob_live_sg.d (i INT(10)); +CREATE DATABASE oms_live_sg; +CREATE TABLE oms_live_sg.a (i INT(10)); +CREATE TABLE oms_live_sg.b (i INT(10)); +CREATE TABLE oms_live_sg.c (i INT(10)); +CREATE TABLE oms_live_sg.d (i INT(10)); +CREATE DATABASE bob_live_ph; +CREATE TABLE bob_live_ph.a (i INT(10)); +CREATE TABLE bob_live_ph.b (i INT(10)); +CREATE TABLE bob_live_ph.c (i INT(10)); +CREATE TABLE bob_live_ph.d (i INT(10)); +CREATE DATABASE oms_live_ph; +CREATE TABLE oms_live_ph.a (i INT(10)); +CREATE TABLE oms_live_ph.b (i INT(10)); +CREATE TABLE oms_live_ph.c (i INT(10)); +CREATE TABLE oms_live_ph.d (i INT(10)); +CREATE DATABASE bob_live_id; +CREATE TABLE bob_live_id.a (i INT(10)); +CREATE TABLE bob_live_id.b (i INT(10)); +CREATE TABLE bob_live_id.c (i INT(10)); +CREATE TABLE bob_live_id.d (i INT(10)); +CREATE DATABASE oms_live_id; +CREATE TABLE oms_live_id.a (i INT(10)); +CREATE TABLE oms_live_id.b (i INT(10)); +CREATE TABLE oms_live_id.c (i INT(10)); +CREATE TABLE oms_live_id.d (i INT(10)); +CREATE DATABASE bob_live_hk; +CREATE TABLE bob_live_hk.a (i INT(10)); +CREATE TABLE bob_live_hk.b (i INT(10)); +CREATE TABLE bob_live_hk.c (i INT(10)); +CREATE TABLE bob_live_hk.d (i INT(10)); +CREATE DATABASE oms_live_hk; +CREATE TABLE oms_live_hk.a (i INT(10)); +CREATE TABLE oms_live_hk.b (i INT(10)); +CREATE TABLE oms_live_hk.c (i INT(10)); +CREATE TABLE oms_live_hk.d (i INT(10)); +CREATE DATABASE bob_live_vn; +CREATE TABLE bob_live_vn.a (i INT(10)); +CREATE TABLE bob_live_vn.b (i INT(10)); +CREATE TABLE bob_live_vn.c (i INT(10)); +CREATE TABLE bob_live_vn.d (i INT(10)); +CREATE DATABASE oms_live_vn; +CREATE TABLE oms_live_vn.a (i INT(10)); +CREATE TABLE oms_live_vn.b (i INT(10)); +CREATE TABLE oms_live_vn.c (i INT(10)); +CREATE TABLE oms_live_vn.d (i INT(10)); +CREATE DATABASE bob_live_tw; +CREATE TABLE bob_live_tw.a (i INT(10)); +CREATE TABLE bob_live_tw.b (i INT(10)); +CREATE TABLE bob_live_tw.c (i INT(10)); +CREATE TABLE bob_live_tw.d (i INT(10)); +CREATE DATABASE oms_live_tw; +CREATE TABLE oms_live_tw.a (i INT(10)); +CREATE TABLE oms_live_tw.b (i INT(10)); +CREATE TABLE oms_live_tw.c (i INT(10)); +CREATE TABLE oms_live_tw.d (i INT(10)); +CREATE DATABASE bob_live_my; +CREATE TABLE bob_live_my.a (i INT(10)); +CREATE TABLE bob_live_my.b (i INT(10)); +CREATE TABLE bob_live_my.c (i INT(10)); +CREATE TABLE bob_live_my.d (i INT(10)); +CREATE DATABASE oms_live_my; +CREATE TABLE oms_live_my.a (i INT(10)); +CREATE TABLE oms_live_my.b (i INT(10)); +CREATE TABLE oms_live_my.c (i INT(10)); +CREATE TABLE oms_live_my.d (i INT(10)); +CREATE DATABASE bob_live_th; +CREATE TABLE bob_live_th.a (i INT(10)); +CREATE TABLE bob_live_th.b (i INT(10)); +CREATE TABLE bob_live_th.c (i INT(10)); +CREATE TABLE bob_live_th.d (i INT(10)); +CREATE DATABASE oms_live_th; +CREATE TABLE oms_live_th.a (i INT(10)); +CREATE TABLE oms_live_th.b (i INT(10)); +CREATE TABLE oms_live_th.c (i INT(10)); +CREATE TABLE oms_live_th.d (i INT(10)); +CREATE ROLE a_sg; +CREATE ROLE b_sg; +CREATE ROLE c_sg; +CREATE ROLE d_sg; +CREATE ROLE operations_sg; +GRANT a_sg TO operations_sg; +GRANT b_sg TO operations_sg; +GRANT c_sg TO operations_sg; +GRANT d_sg TO operations_sg; +GRANT SELECT ON bob_live_sg.a TO a_sg; +GRANT SELECT ON bob_live_sg.b TO b_sg; +GRANT SELECT ON bob_live_sg.c TO c_sg; +GRANT SELECT ON bob_live_sg.d TO d_sg; +GRANT SELECT ON oms_live_sg.a TO a_sg; +GRANT SELECT ON oms_live_sg.b TO b_sg; +GRANT SELECT ON oms_live_sg.c TO c_sg; +GRANT SELECT ON oms_live_sg.d TO d_sg; +CREATE ROLE a_ph; +CREATE ROLE b_ph; +CREATE ROLE c_ph; +CREATE ROLE d_ph; +CREATE ROLE operations_ph; +GRANT a_ph TO operations_ph; +GRANT b_ph TO operations_ph; +GRANT c_ph TO operations_ph; +GRANT d_ph TO operations_ph; +GRANT SELECT ON bob_live_ph.a TO a_ph; +GRANT SELECT ON bob_live_ph.b TO b_ph; +GRANT SELECT ON bob_live_ph.c TO c_ph; +GRANT SELECT ON bob_live_ph.d TO d_ph; +GRANT SELECT ON oms_live_ph.a TO a_ph; +GRANT SELECT ON oms_live_ph.b TO b_ph; +GRANT SELECT ON oms_live_ph.c TO c_ph; +GRANT SELECT ON oms_live_ph.d TO d_ph; +CREATE ROLE a_id; +CREATE ROLE b_id; +CREATE ROLE c_id; +CREATE ROLE d_id; +CREATE ROLE operations_id; +GRANT a_id TO operations_id; +GRANT b_id TO operations_id; +GRANT c_id TO operations_id; +GRANT d_id TO operations_id; +GRANT SELECT ON bob_live_id.a TO a_id; +GRANT SELECT ON bob_live_id.b TO b_id; +GRANT SELECT ON bob_live_id.c TO c_id; +GRANT SELECT ON bob_live_id.d TO d_id; +GRANT SELECT ON oms_live_id.a TO a_id; +GRANT SELECT ON oms_live_id.b TO b_id; +GRANT SELECT ON oms_live_id.c TO c_id; +GRANT SELECT ON oms_live_id.d TO d_id; +CREATE ROLE a_hk; +CREATE ROLE b_hk; +CREATE ROLE c_hk; +CREATE ROLE d_hk; +CREATE ROLE operations_hk; +GRANT a_hk TO operations_hk; +GRANT b_hk TO operations_hk; +GRANT c_hk TO operations_hk; +GRANT d_hk TO operations_hk; +GRANT SELECT ON bob_live_hk.a TO a_hk; +GRANT SELECT ON bob_live_hk.b TO b_hk; +GRANT SELECT ON bob_live_hk.c TO c_hk; +GRANT SELECT ON bob_live_hk.d TO d_hk; +GRANT SELECT ON oms_live_hk.a TO a_hk; +GRANT SELECT ON oms_live_hk.b TO b_hk; +GRANT SELECT ON oms_live_hk.c TO c_hk; +GRANT SELECT ON oms_live_hk.d TO d_hk; +CREATE ROLE a_vn; +CREATE ROLE b_vn; +CREATE ROLE c_vn; +CREATE ROLE d_vn; +CREATE ROLE operations_vn; +GRANT a_vn TO operations_vn; +GRANT b_vn TO operations_vn; +GRANT c_vn TO operations_vn; +GRANT d_vn TO operations_vn; +GRANT SELECT ON bob_live_vn.a TO a_vn; +GRANT SELECT ON bob_live_vn.b TO b_vn; +GRANT SELECT ON bob_live_vn.c TO c_vn; +GRANT SELECT ON bob_live_vn.d TO d_vn; +GRANT SELECT ON oms_live_vn.a TO a_vn; +GRANT SELECT ON oms_live_vn.b TO b_vn; +GRANT SELECT ON oms_live_vn.c TO c_vn; +GRANT SELECT ON oms_live_vn.d TO d_vn; +CREATE ROLE a_tw; +CREATE ROLE b_tw; +CREATE ROLE c_tw; +CREATE ROLE d_tw; +CREATE ROLE operations_tw; +GRANT a_tw TO operations_tw; +GRANT b_tw TO operations_tw; +GRANT c_tw TO operations_tw; +GRANT d_tw TO operations_tw; +GRANT SELECT ON bob_live_tw.a TO a_tw; +GRANT SELECT ON bob_live_tw.b TO b_tw; +GRANT SELECT ON bob_live_tw.c TO c_tw; +GRANT SELECT ON bob_live_tw.d TO d_tw; +GRANT SELECT ON oms_live_tw.a TO a_tw; +GRANT SELECT ON oms_live_tw.b TO b_tw; +GRANT SELECT ON oms_live_tw.c TO c_tw; +GRANT SELECT ON oms_live_tw.d TO d_tw; +CREATE ROLE a_my; +CREATE ROLE b_my; +CREATE ROLE c_my; +CREATE ROLE d_my; +CREATE ROLE operations_my; +GRANT a_my TO operations_my; +GRANT b_my TO operations_my; +GRANT c_my TO operations_my; +GRANT d_my TO operations_my; +GRANT SELECT ON bob_live_my.a TO a_my; +GRANT SELECT ON bob_live_my.b TO b_my; +GRANT SELECT ON bob_live_my.c TO c_my; +GRANT SELECT ON bob_live_my.d TO d_my; +GRANT SELECT ON oms_live_my.a TO a_my; +GRANT SELECT ON oms_live_my.b TO b_my; +GRANT SELECT ON oms_live_my.c TO c_my; +GRANT SELECT ON oms_live_my.d TO d_my; +CREATE ROLE a_th; +CREATE ROLE b_th; +CREATE ROLE c_th; +CREATE ROLE d_th; +CREATE ROLE operations_th; +GRANT a_th TO operations_th; +GRANT b_th TO operations_th; +GRANT c_th TO operations_th; +GRANT d_th TO operations_th; +GRANT SELECT ON bob_live_th.a TO a_th; +GRANT SELECT ON bob_live_th.b TO b_th; +GRANT SELECT ON bob_live_th.c TO c_th; +GRANT SELECT ON bob_live_th.d TO d_th; +GRANT SELECT ON oms_live_th.a TO a_th; +GRANT SELECT ON oms_live_th.b TO b_th; +GRANT SELECT ON oms_live_th.c TO c_th; +GRANT SELECT ON oms_live_th.d TO d_th; +GRANT operations_sg TO operations_cluster; +GRANT operations_ph TO operations_cluster; +GRANT operations_id TO operations_cluster; +GRANT operations_hk TO operations_cluster; +GRANT operations_vn TO operations_cluster; +GRANT operations_tw TO operations_cluster; +GRANT operations_my TO operations_cluster; +GRANT operations_th TO operations_cluster; +SHOW DATABASES; +Database +information_schema +test +SET ROLE operations_cluster; +SHOW DATABASES; +Database +bob_live_hk +bob_live_id +bob_live_my +bob_live_ph +bob_live_sg +bob_live_th +bob_live_tw +bob_live_vn +information_schema +oms_live_hk +oms_live_id +oms_live_my +oms_live_ph +oms_live_sg +oms_live_th +oms_live_tw +oms_live_vn +test +SELECT COUNT(1) FROM oms_live_sg.a; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_sg.b; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_sg.c; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_sg.d; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_ph.a; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_ph.b; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_ph.c; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_ph.d; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_id.a; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_id.b; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_id.c; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_id.d; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_hk.a; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_hk.b; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_hk.c; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_hk.d; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_vn.a; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_vn.b; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_vn.c; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_vn.d; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_tw.a; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_tw.b; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_tw.c; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_tw.d; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_my.a; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_my.b; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_my.c; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_my.d; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_th.a; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_th.b; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_th.c; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_th.d; +COUNT(1) +0 +FLUSH PRIVILEGES; +SHOW DATABASES; +Database +information_schema +test +SET ROLE operations_cluster; +SHOW DATABASES; +Database +bob_live_hk +bob_live_id +bob_live_my +bob_live_ph +bob_live_sg +bob_live_th +bob_live_tw +bob_live_vn +information_schema +oms_live_hk +oms_live_id +oms_live_my +oms_live_ph +oms_live_sg +oms_live_th +oms_live_tw +oms_live_vn +test +SELECT COUNT(1) FROM oms_live_sg.a; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_sg.b; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_sg.c; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_sg.d; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_ph.a; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_ph.b; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_ph.c; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_ph.d; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_id.a; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_id.b; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_id.c; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_id.d; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_hk.a; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_hk.b; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_hk.c; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_hk.d; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_vn.a; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_vn.b; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_vn.c; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_vn.d; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_tw.a; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_tw.b; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_tw.c; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_tw.d; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_my.a; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_my.b; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_my.c; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_my.d; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_th.a; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_th.b; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_th.c; +COUNT(1) +0 +SELECT COUNT(1) FROM oms_live_th.d; +COUNT(1) +0 +DROP DATABASE bob_live_sg; +DROP DATABASE oms_live_sg; +DROP DATABASE bob_live_ph; +DROP DATABASE oms_live_ph; +DROP DATABASE bob_live_id; +DROP DATABASE oms_live_id; +DROP DATABASE bob_live_hk; +DROP DATABASE oms_live_hk; +DROP DATABASE bob_live_vn; +DROP DATABASE oms_live_vn; +DROP DATABASE bob_live_tw; +DROP DATABASE oms_live_tw; +DROP DATABASE bob_live_my; +DROP DATABASE oms_live_my; +DROP DATABASE bob_live_th; +DROP DATABASE oms_live_th; +DROP ROLE operations_sg; +DROP ROLE a_sg; +DROP ROLE b_sg; +DROP ROLE c_sg; +DROP ROLE d_sg; +DROP ROLE operations_ph; +DROP ROLE a_ph; +DROP ROLE b_ph; +DROP ROLE c_ph; +DROP ROLE d_ph; +DROP ROLE operations_id; +DROP ROLE a_id; +DROP ROLE b_id; +DROP ROLE c_id; +DROP ROLE d_id; +DROP ROLE operations_hk; +DROP ROLE a_hk; +DROP ROLE b_hk; +DROP ROLE c_hk; +DROP ROLE d_hk; +DROP ROLE operations_vn; +DROP ROLE a_vn; +DROP ROLE b_vn; +DROP ROLE c_vn; +DROP ROLE d_vn; +DROP ROLE operations_tw; +DROP ROLE a_tw; +DROP ROLE b_tw; +DROP ROLE c_tw; +DROP ROLE d_tw; +DROP ROLE operations_my; +DROP ROLE a_my; +DROP ROLE b_my; +DROP ROLE c_my; +DROP ROLE d_my; +DROP ROLE operations_th; +DROP ROLE a_th; +DROP ROLE b_th; +DROP ROLE c_th; +DROP ROLE d_th; +DROP USER u; +DROP ROLE operations_cluster; diff --git a/mysql-test/suite/roles/flush_roles-12366.test b/mysql-test/suite/roles/flush_roles-12366.test new file mode 100644 index 00000000..343ac4ab --- /dev/null +++ b/mysql-test/suite/roles/flush_roles-12366.test @@ -0,0 +1,379 @@ +--source include/not_embedded.inc +--echo # +--echo # MDEV-12366: FLUSH PRIVILEGES can break hierarchy of roles +--echo # +--echo # This testcase contains a user, who is granted a master role +--echo # operations_cluster. operations_cluster is granted 8 different roles +--echo # who in turn each have 4 different roles granted to them. +--echo # +--echo # Only the leaf roles contain privileges to access databases. +--echo # Make sure the user has access to all databases if the master role +--echo # is granted to him. +--echo # +CREATE USER u; +CREATE ROLE operations_cluster; +GRANT operations_cluster TO u; +CREATE DATABASE bob_live_sg; +CREATE TABLE bob_live_sg.a (i INT(10)); +CREATE TABLE bob_live_sg.b (i INT(10)); +CREATE TABLE bob_live_sg.c (i INT(10)); +CREATE TABLE bob_live_sg.d (i INT(10)); +CREATE DATABASE oms_live_sg; +CREATE TABLE oms_live_sg.a (i INT(10)); +CREATE TABLE oms_live_sg.b (i INT(10)); +CREATE TABLE oms_live_sg.c (i INT(10)); +CREATE TABLE oms_live_sg.d (i INT(10)); +CREATE DATABASE bob_live_ph; +CREATE TABLE bob_live_ph.a (i INT(10)); +CREATE TABLE bob_live_ph.b (i INT(10)); +CREATE TABLE bob_live_ph.c (i INT(10)); +CREATE TABLE bob_live_ph.d (i INT(10)); +CREATE DATABASE oms_live_ph; +CREATE TABLE oms_live_ph.a (i INT(10)); +CREATE TABLE oms_live_ph.b (i INT(10)); +CREATE TABLE oms_live_ph.c (i INT(10)); +CREATE TABLE oms_live_ph.d (i INT(10)); +CREATE DATABASE bob_live_id; +CREATE TABLE bob_live_id.a (i INT(10)); +CREATE TABLE bob_live_id.b (i INT(10)); +CREATE TABLE bob_live_id.c (i INT(10)); +CREATE TABLE bob_live_id.d (i INT(10)); +CREATE DATABASE oms_live_id; +CREATE TABLE oms_live_id.a (i INT(10)); +CREATE TABLE oms_live_id.b (i INT(10)); +CREATE TABLE oms_live_id.c (i INT(10)); +CREATE TABLE oms_live_id.d (i INT(10)); +CREATE DATABASE bob_live_hk; +CREATE TABLE bob_live_hk.a (i INT(10)); +CREATE TABLE bob_live_hk.b (i INT(10)); +CREATE TABLE bob_live_hk.c (i INT(10)); +CREATE TABLE bob_live_hk.d (i INT(10)); +CREATE DATABASE oms_live_hk; +CREATE TABLE oms_live_hk.a (i INT(10)); +CREATE TABLE oms_live_hk.b (i INT(10)); +CREATE TABLE oms_live_hk.c (i INT(10)); +CREATE TABLE oms_live_hk.d (i INT(10)); +CREATE DATABASE bob_live_vn; +CREATE TABLE bob_live_vn.a (i INT(10)); +CREATE TABLE bob_live_vn.b (i INT(10)); +CREATE TABLE bob_live_vn.c (i INT(10)); +CREATE TABLE bob_live_vn.d (i INT(10)); +CREATE DATABASE oms_live_vn; +CREATE TABLE oms_live_vn.a (i INT(10)); +CREATE TABLE oms_live_vn.b (i INT(10)); +CREATE TABLE oms_live_vn.c (i INT(10)); +CREATE TABLE oms_live_vn.d (i INT(10)); +CREATE DATABASE bob_live_tw; +CREATE TABLE bob_live_tw.a (i INT(10)); +CREATE TABLE bob_live_tw.b (i INT(10)); +CREATE TABLE bob_live_tw.c (i INT(10)); +CREATE TABLE bob_live_tw.d (i INT(10)); +CREATE DATABASE oms_live_tw; +CREATE TABLE oms_live_tw.a (i INT(10)); +CREATE TABLE oms_live_tw.b (i INT(10)); +CREATE TABLE oms_live_tw.c (i INT(10)); +CREATE TABLE oms_live_tw.d (i INT(10)); +CREATE DATABASE bob_live_my; +CREATE TABLE bob_live_my.a (i INT(10)); +CREATE TABLE bob_live_my.b (i INT(10)); +CREATE TABLE bob_live_my.c (i INT(10)); +CREATE TABLE bob_live_my.d (i INT(10)); +CREATE DATABASE oms_live_my; +CREATE TABLE oms_live_my.a (i INT(10)); +CREATE TABLE oms_live_my.b (i INT(10)); +CREATE TABLE oms_live_my.c (i INT(10)); +CREATE TABLE oms_live_my.d (i INT(10)); +CREATE DATABASE bob_live_th; +CREATE TABLE bob_live_th.a (i INT(10)); +CREATE TABLE bob_live_th.b (i INT(10)); +CREATE TABLE bob_live_th.c (i INT(10)); +CREATE TABLE bob_live_th.d (i INT(10)); +CREATE DATABASE oms_live_th; +CREATE TABLE oms_live_th.a (i INT(10)); +CREATE TABLE oms_live_th.b (i INT(10)); +CREATE TABLE oms_live_th.c (i INT(10)); +CREATE TABLE oms_live_th.d (i INT(10)); +CREATE ROLE a_sg; +CREATE ROLE b_sg; +CREATE ROLE c_sg; +CREATE ROLE d_sg; +CREATE ROLE operations_sg; +GRANT a_sg TO operations_sg; +GRANT b_sg TO operations_sg; +GRANT c_sg TO operations_sg; +GRANT d_sg TO operations_sg; +GRANT SELECT ON bob_live_sg.a TO a_sg; +GRANT SELECT ON bob_live_sg.b TO b_sg; +GRANT SELECT ON bob_live_sg.c TO c_sg; +GRANT SELECT ON bob_live_sg.d TO d_sg; +GRANT SELECT ON oms_live_sg.a TO a_sg; +GRANT SELECT ON oms_live_sg.b TO b_sg; +GRANT SELECT ON oms_live_sg.c TO c_sg; +GRANT SELECT ON oms_live_sg.d TO d_sg; +CREATE ROLE a_ph; +CREATE ROLE b_ph; +CREATE ROLE c_ph; +CREATE ROLE d_ph; +CREATE ROLE operations_ph; +GRANT a_ph TO operations_ph; +GRANT b_ph TO operations_ph; +GRANT c_ph TO operations_ph; +GRANT d_ph TO operations_ph; +GRANT SELECT ON bob_live_ph.a TO a_ph; +GRANT SELECT ON bob_live_ph.b TO b_ph; +GRANT SELECT ON bob_live_ph.c TO c_ph; +GRANT SELECT ON bob_live_ph.d TO d_ph; +GRANT SELECT ON oms_live_ph.a TO a_ph; +GRANT SELECT ON oms_live_ph.b TO b_ph; +GRANT SELECT ON oms_live_ph.c TO c_ph; +GRANT SELECT ON oms_live_ph.d TO d_ph; +CREATE ROLE a_id; +CREATE ROLE b_id; +CREATE ROLE c_id; +CREATE ROLE d_id; +CREATE ROLE operations_id; +GRANT a_id TO operations_id; +GRANT b_id TO operations_id; +GRANT c_id TO operations_id; +GRANT d_id TO operations_id; +GRANT SELECT ON bob_live_id.a TO a_id; +GRANT SELECT ON bob_live_id.b TO b_id; +GRANT SELECT ON bob_live_id.c TO c_id; +GRANT SELECT ON bob_live_id.d TO d_id; +GRANT SELECT ON oms_live_id.a TO a_id; +GRANT SELECT ON oms_live_id.b TO b_id; +GRANT SELECT ON oms_live_id.c TO c_id; +GRANT SELECT ON oms_live_id.d TO d_id; +CREATE ROLE a_hk; +CREATE ROLE b_hk; +CREATE ROLE c_hk; +CREATE ROLE d_hk; +CREATE ROLE operations_hk; +GRANT a_hk TO operations_hk; +GRANT b_hk TO operations_hk; +GRANT c_hk TO operations_hk; +GRANT d_hk TO operations_hk; +GRANT SELECT ON bob_live_hk.a TO a_hk; +GRANT SELECT ON bob_live_hk.b TO b_hk; +GRANT SELECT ON bob_live_hk.c TO c_hk; +GRANT SELECT ON bob_live_hk.d TO d_hk; +GRANT SELECT ON oms_live_hk.a TO a_hk; +GRANT SELECT ON oms_live_hk.b TO b_hk; +GRANT SELECT ON oms_live_hk.c TO c_hk; +GRANT SELECT ON oms_live_hk.d TO d_hk; +CREATE ROLE a_vn; +CREATE ROLE b_vn; +CREATE ROLE c_vn; +CREATE ROLE d_vn; +CREATE ROLE operations_vn; +GRANT a_vn TO operations_vn; +GRANT b_vn TO operations_vn; +GRANT c_vn TO operations_vn; +GRANT d_vn TO operations_vn; +GRANT SELECT ON bob_live_vn.a TO a_vn; +GRANT SELECT ON bob_live_vn.b TO b_vn; +GRANT SELECT ON bob_live_vn.c TO c_vn; +GRANT SELECT ON bob_live_vn.d TO d_vn; +GRANT SELECT ON oms_live_vn.a TO a_vn; +GRANT SELECT ON oms_live_vn.b TO b_vn; +GRANT SELECT ON oms_live_vn.c TO c_vn; +GRANT SELECT ON oms_live_vn.d TO d_vn; +CREATE ROLE a_tw; +CREATE ROLE b_tw; +CREATE ROLE c_tw; +CREATE ROLE d_tw; +CREATE ROLE operations_tw; +GRANT a_tw TO operations_tw; +GRANT b_tw TO operations_tw; +GRANT c_tw TO operations_tw; +GRANT d_tw TO operations_tw; +GRANT SELECT ON bob_live_tw.a TO a_tw; +GRANT SELECT ON bob_live_tw.b TO b_tw; +GRANT SELECT ON bob_live_tw.c TO c_tw; +GRANT SELECT ON bob_live_tw.d TO d_tw; +GRANT SELECT ON oms_live_tw.a TO a_tw; +GRANT SELECT ON oms_live_tw.b TO b_tw; +GRANT SELECT ON oms_live_tw.c TO c_tw; +GRANT SELECT ON oms_live_tw.d TO d_tw; +CREATE ROLE a_my; +CREATE ROLE b_my; +CREATE ROLE c_my; +CREATE ROLE d_my; +CREATE ROLE operations_my; +GRANT a_my TO operations_my; +GRANT b_my TO operations_my; +GRANT c_my TO operations_my; +GRANT d_my TO operations_my; +GRANT SELECT ON bob_live_my.a TO a_my; +GRANT SELECT ON bob_live_my.b TO b_my; +GRANT SELECT ON bob_live_my.c TO c_my; +GRANT SELECT ON bob_live_my.d TO d_my; +GRANT SELECT ON oms_live_my.a TO a_my; +GRANT SELECT ON oms_live_my.b TO b_my; +GRANT SELECT ON oms_live_my.c TO c_my; +GRANT SELECT ON oms_live_my.d TO d_my; +CREATE ROLE a_th; +CREATE ROLE b_th; +CREATE ROLE c_th; +CREATE ROLE d_th; +CREATE ROLE operations_th; +GRANT a_th TO operations_th; +GRANT b_th TO operations_th; +GRANT c_th TO operations_th; +GRANT d_th TO operations_th; +GRANT SELECT ON bob_live_th.a TO a_th; +GRANT SELECT ON bob_live_th.b TO b_th; +GRANT SELECT ON bob_live_th.c TO c_th; +GRANT SELECT ON bob_live_th.d TO d_th; +GRANT SELECT ON oms_live_th.a TO a_th; +GRANT SELECT ON oms_live_th.b TO b_th; +GRANT SELECT ON oms_live_th.c TO c_th; +GRANT SELECT ON oms_live_th.d TO d_th; +GRANT operations_sg TO operations_cluster; +GRANT operations_ph TO operations_cluster; +GRANT operations_id TO operations_cluster; +GRANT operations_hk TO operations_cluster; +GRANT operations_vn TO operations_cluster; +GRANT operations_tw TO operations_cluster; +GRANT operations_my TO operations_cluster; +GRANT operations_th TO operations_cluster; + +connect(con1,localhost,u,,); +SHOW DATABASES; +SET ROLE operations_cluster; +SHOW DATABASES; +SELECT COUNT(1) FROM oms_live_sg.a; +SELECT COUNT(1) FROM oms_live_sg.b; +SELECT COUNT(1) FROM oms_live_sg.c; +SELECT COUNT(1) FROM oms_live_sg.d; +SELECT COUNT(1) FROM oms_live_ph.a; +SELECT COUNT(1) FROM oms_live_ph.b; +SELECT COUNT(1) FROM oms_live_ph.c; +SELECT COUNT(1) FROM oms_live_ph.d; +SELECT COUNT(1) FROM oms_live_id.a; +SELECT COUNT(1) FROM oms_live_id.b; +SELECT COUNT(1) FROM oms_live_id.c; +SELECT COUNT(1) FROM oms_live_id.d; +SELECT COUNT(1) FROM oms_live_hk.a; +SELECT COUNT(1) FROM oms_live_hk.b; +SELECT COUNT(1) FROM oms_live_hk.c; +SELECT COUNT(1) FROM oms_live_hk.d; +SELECT COUNT(1) FROM oms_live_vn.a; +SELECT COUNT(1) FROM oms_live_vn.b; +SELECT COUNT(1) FROM oms_live_vn.c; +SELECT COUNT(1) FROM oms_live_vn.d; +SELECT COUNT(1) FROM oms_live_tw.a; +SELECT COUNT(1) FROM oms_live_tw.b; +SELECT COUNT(1) FROM oms_live_tw.c; +SELECT COUNT(1) FROM oms_live_tw.d; +SELECT COUNT(1) FROM oms_live_my.a; +SELECT COUNT(1) FROM oms_live_my.b; +SELECT COUNT(1) FROM oms_live_my.c; +SELECT COUNT(1) FROM oms_live_my.d; +SELECT COUNT(1) FROM oms_live_th.a; +SELECT COUNT(1) FROM oms_live_th.b; +SELECT COUNT(1) FROM oms_live_th.c; +SELECT COUNT(1) FROM oms_live_th.d; + + +connect(con2,localhost,root,,); +FLUSH PRIVILEGES; + +connect(con3,localhost,u,,); +SHOW DATABASES; +SET ROLE operations_cluster; +SHOW DATABASES; +SELECT COUNT(1) FROM oms_live_sg.a; +SELECT COUNT(1) FROM oms_live_sg.b; +SELECT COUNT(1) FROM oms_live_sg.c; +SELECT COUNT(1) FROM oms_live_sg.d; +SELECT COUNT(1) FROM oms_live_ph.a; +SELECT COUNT(1) FROM oms_live_ph.b; +SELECT COUNT(1) FROM oms_live_ph.c; +SELECT COUNT(1) FROM oms_live_ph.d; +SELECT COUNT(1) FROM oms_live_id.a; +SELECT COUNT(1) FROM oms_live_id.b; +SELECT COUNT(1) FROM oms_live_id.c; +SELECT COUNT(1) FROM oms_live_id.d; +SELECT COUNT(1) FROM oms_live_hk.a; +SELECT COUNT(1) FROM oms_live_hk.b; +SELECT COUNT(1) FROM oms_live_hk.c; +SELECT COUNT(1) FROM oms_live_hk.d; +SELECT COUNT(1) FROM oms_live_vn.a; +SELECT COUNT(1) FROM oms_live_vn.b; +SELECT COUNT(1) FROM oms_live_vn.c; +SELECT COUNT(1) FROM oms_live_vn.d; +SELECT COUNT(1) FROM oms_live_tw.a; +SELECT COUNT(1) FROM oms_live_tw.b; +SELECT COUNT(1) FROM oms_live_tw.c; +SELECT COUNT(1) FROM oms_live_tw.d; +SELECT COUNT(1) FROM oms_live_my.a; +SELECT COUNT(1) FROM oms_live_my.b; +SELECT COUNT(1) FROM oms_live_my.c; +SELECT COUNT(1) FROM oms_live_my.d; +SELECT COUNT(1) FROM oms_live_th.a; +SELECT COUNT(1) FROM oms_live_th.b; +SELECT COUNT(1) FROM oms_live_th.c; +SELECT COUNT(1) FROM oms_live_th.d; + + +connect(con4,localhost,root,,); + +DROP DATABASE bob_live_sg; +DROP DATABASE oms_live_sg; +DROP DATABASE bob_live_ph; +DROP DATABASE oms_live_ph; +DROP DATABASE bob_live_id; +DROP DATABASE oms_live_id; +DROP DATABASE bob_live_hk; +DROP DATABASE oms_live_hk; +DROP DATABASE bob_live_vn; +DROP DATABASE oms_live_vn; +DROP DATABASE bob_live_tw; +DROP DATABASE oms_live_tw; +DROP DATABASE bob_live_my; +DROP DATABASE oms_live_my; +DROP DATABASE bob_live_th; +DROP DATABASE oms_live_th; +DROP ROLE operations_sg; +DROP ROLE a_sg; +DROP ROLE b_sg; +DROP ROLE c_sg; +DROP ROLE d_sg; +DROP ROLE operations_ph; +DROP ROLE a_ph; +DROP ROLE b_ph; +DROP ROLE c_ph; +DROP ROLE d_ph; +DROP ROLE operations_id; +DROP ROLE a_id; +DROP ROLE b_id; +DROP ROLE c_id; +DROP ROLE d_id; +DROP ROLE operations_hk; +DROP ROLE a_hk; +DROP ROLE b_hk; +DROP ROLE c_hk; +DROP ROLE d_hk; +DROP ROLE operations_vn; +DROP ROLE a_vn; +DROP ROLE b_vn; +DROP ROLE c_vn; +DROP ROLE d_vn; +DROP ROLE operations_tw; +DROP ROLE a_tw; +DROP ROLE b_tw; +DROP ROLE c_tw; +DROP ROLE d_tw; +DROP ROLE operations_my; +DROP ROLE a_my; +DROP ROLE b_my; +DROP ROLE c_my; +DROP ROLE d_my; +DROP ROLE operations_th; +DROP ROLE a_th; +DROP ROLE b_th; +DROP ROLE c_th; +DROP ROLE d_th; +DROP USER u; +DROP ROLE operations_cluster; diff --git a/mysql-test/suite/roles/set_role-13655.result b/mysql-test/suite/roles/set_role-13655.result new file mode 100644 index 00000000..1c4841c8 --- /dev/null +++ b/mysql-test/suite/roles/set_role-13655.result @@ -0,0 +1,50 @@ +# +# MDEV-13655: SET ROLE does not properly grant privileges. +# +# We must test that if aditional db privileges get granted to a role +# which previously inherited privileges from another granted role +# keep the internal memory structures intact. +# +create role simple; +# +# First we create an entry with privileges for databases for the simple role. +# +grant select, insert, update, delete, lock tables, execute on t.* to simple; +create role admin; +# +# Now we grant the simple role to admin. This means that db privileges +# should propagate to admin. +# +grant simple to admin; +show grants for admin; +Grants for admin +GRANT simple TO 'admin' +GRANT USAGE ON *.* TO 'admin' +GRANT USAGE ON *.* TO 'simple' +GRANT SELECT, INSERT, UPDATE, DELETE, LOCK TABLES, EXECUTE ON `t`.* TO 'simple' +# +# Finally, we give the admin all the available privileges for the db. +# +grant all on t.* to admin; +# +# Create a user to test out the new roles; +# +create user foo; +grant admin to foo; +create database t; +ERROR 42000: Access denied for user 'foo'@'%' to database 't' +set role admin; +show grants; +Grants for foo@% +GRANT admin TO 'foo'@'%' +GRANT USAGE ON *.* TO 'foo'@'%' +GRANT simple TO 'admin' +GRANT USAGE ON *.* TO 'admin' +GRANT ALL PRIVILEGES ON `t`.* TO 'admin' +GRANT USAGE ON *.* TO 'simple' +GRANT SELECT, INSERT, UPDATE, DELETE, LOCK TABLES, EXECUTE ON `t`.* TO 'simple' +create database t; +drop database t; +drop role simple; +drop role admin; +drop user foo; diff --git a/mysql-test/suite/roles/set_role-13655.test b/mysql-test/suite/roles/set_role-13655.test new file mode 100644 index 00000000..97a82109 --- /dev/null +++ b/mysql-test/suite/roles/set_role-13655.test @@ -0,0 +1,49 @@ +source include/not_embedded.inc; + +--echo # +--echo # MDEV-13655: SET ROLE does not properly grant privileges. +--echo # +--echo # We must test that if aditional db privileges get granted to a role +--echo # which previously inherited privileges from another granted role +--echo # keep the internal memory structures intact. +--echo # + +create role simple; + +--echo # +--echo # First we create an entry with privileges for databases for the simple role. +--echo # +grant select, insert, update, delete, lock tables, execute on t.* to simple; +create role admin; + +--echo # +--echo # Now we grant the simple role to admin. This means that db privileges +--echo # should propagate to admin. +--echo # +grant simple to admin; +show grants for admin; + +--echo # +--echo # Finally, we give the admin all the available privileges for the db. +--echo # +grant all on t.* to admin; + +--echo # +--echo # Create a user to test out the new roles; +--echo # +create user foo; +grant admin to foo; + +connect (foo,localhost,foo,,,,,); +--error ER_DBACCESS_DENIED_ERROR +create database t; +set role admin; +show grants; +create database t; +drop database t; + +connection default; + +drop role simple; +drop role admin; +drop user foo; diff --git a/mysql-test/suite/rpl/r/rpl_gtid_delete_domain.result b/mysql-test/suite/rpl/r/rpl_gtid_delete_domain.result new file mode 100644 index 00000000..3558a676 --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_gtid_delete_domain.result @@ -0,0 +1,30 @@ +include/master-slave.inc +[connection master] +SET @@SESSION.gtid_domain_id=0; +CREATE TABLE t (a INT); +call mtr.add_suppression("connecting slave requested to start from.*which is not in the master's binlog"); +include/stop_slave.inc +CHANGE MASTER TO master_use_gtid=slave_pos; +SET @@SESSION.gtid_domain_id=11; +SET @@SESSION.server_id=111; +SET @@SESSION.gtid_seq_no=1; +INSERT INTO t SET a=1; +SET @save.gtid_slave_pos=@@global.gtid_slave_pos; +SET @@global.gtid_slave_pos=concat(@@global.gtid_slave_pos, ",", 11, "-", 111, "-", 1 + 1); +Warnings: +Warning 1947 Specified GTID 0-1-1 conflicts with the binary log which contains a more recent GTID 0-2-2. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos. +START SLAVE IO_THREAD; +include/wait_for_slave_io_error.inc [errno=1236] +FLUSH BINARY LOGS; +PURGE BINARY LOGS TO 'master-bin.000002';; +FLUSH BINARY LOGS DELETE_DOMAIN_ID=(11); +include/start_slave.inc +INSERT INTO t SET a=1; +include/wait_for_slave_io_error.inc [errno=1236] +FLUSH BINARY LOGS; +PURGE BINARY LOGS TO 'master-bin.000004';; +FLUSH BINARY LOGS DELETE_DOMAIN_ID=(11); +include/start_slave.inc +SET @@SESSION.gtid_domain_id=0; +DROP TABLE t; +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/r/rpl_row_log.result b/mysql-test/suite/rpl/r/rpl_row_log.result index 83ec2648..4ff3d45e 100644 --- a/mysql-test/suite/rpl/r/rpl_row_log.result +++ b/mysql-test/suite/rpl/r/rpl_row_log.result @@ -215,7 +215,6 @@ master-bin.000001 # Query # # COMMIT master-bin.000001 # Rotate # # master-bin.000002;pos=POS include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000002 # Binlog_checkpoint # # master-bin.000002 master-bin.000002 # Gtid # # GTID #-#-# master-bin.000002 # Query # # use `test`; create table t3 (a int)ENGINE=MyISAM master-bin.000002 # Gtid # # GTID #-#-# @@ -253,7 +252,6 @@ slave-bin.000001 # Query # # use `test`; create table t3 (a int)ENGINE=MyISAM slave-bin.000001 # Rotate # # slave-bin.000002;pos=POS include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info -slave-bin.000002 # Binlog_checkpoint # # slave-bin.000002 slave-bin.000002 # Gtid # # GTID #-#-# slave-bin.000002 # Query # # use `test`; create table t2 (n int)ENGINE=MyISAM slave-bin.000002 # Gtid # # BEGIN GTID #-#-# diff --git a/mysql-test/suite/rpl/r/rpl_row_log_innodb.result b/mysql-test/suite/rpl/r/rpl_row_log_innodb.result index 3b9733a1..c78e0e48 100644 --- a/mysql-test/suite/rpl/r/rpl_row_log_innodb.result +++ b/mysql-test/suite/rpl/r/rpl_row_log_innodb.result @@ -215,7 +215,6 @@ master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Rotate # # master-bin.000002;pos=POS include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000002 # Binlog_checkpoint # # master-bin.000002 master-bin.000002 # Gtid # # GTID #-#-# master-bin.000002 # Query # # use `test`; create table t3 (a int)ENGINE=InnoDB master-bin.000002 # Gtid # # GTID #-#-# @@ -253,7 +252,6 @@ slave-bin.000001 # Query # # use `test`; create table t3 (a int)ENGINE=InnoDB slave-bin.000001 # Rotate # # slave-bin.000002;pos=POS include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info -slave-bin.000002 # Binlog_checkpoint # # slave-bin.000002 slave-bin.000002 # Gtid # # GTID #-#-# slave-bin.000002 # Query # # use `test`; create table t2 (n int)ENGINE=InnoDB slave-bin.000002 # Gtid # # BEGIN GTID #-#-# diff --git a/mysql-test/suite/rpl/r/rpl_stm_log.result b/mysql-test/suite/rpl/r/rpl_stm_log.result index da925035..4d187095 100644 --- a/mysql-test/suite/rpl/r/rpl_stm_log.result +++ b/mysql-test/suite/rpl/r/rpl_stm_log.result @@ -215,7 +215,6 @@ master-bin.000001 # Query # # COMMIT master-bin.000001 # Rotate # # master-bin.000002;pos=POS include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000002 # Binlog_checkpoint # # master-bin.000002 master-bin.000002 # Gtid # # GTID #-#-# master-bin.000002 # Query # # use `test`; create table t3 (a int)ENGINE=MyISAM master-bin.000002 # Gtid # # GTID #-#-# @@ -252,7 +251,6 @@ slave-bin.000001 # Query # # use `test`; create table t3 (a int)ENGINE=MyISAM slave-bin.000001 # Rotate # # slave-bin.000002;pos=POS include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info -slave-bin.000002 # Binlog_checkpoint # # slave-bin.000002 slave-bin.000002 # Gtid # # GTID #-#-# slave-bin.000002 # Query # # use `test`; create table t2 (n int)ENGINE=MyISAM slave-bin.000002 # Gtid # # BEGIN GTID #-#-# diff --git a/mysql-test/suite/rpl/t/rpl_gtid_delete_domain.test b/mysql-test/suite/rpl/t/rpl_gtid_delete_domain.test new file mode 100644 index 00000000..5abedd7e --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_gtid_delete_domain.test @@ -0,0 +1,95 @@ +# In case master's gtid binlog state is divergent from the slave's gtid_slave_pos +# slave may not be able to connect. +# For instance when slave is more updated in some of domains, see +# MDEV-12012 as example, the master's state may require adjustment. +# In a specific case of an "old" divergent domain, that is there +# won't be no more event groups from it generated, the states can be +# made compatible with wiping the problematic domain away. After that slave +# becomes connectable. +# +# Notice that the slave applied gtid state is not really required to +# be similarly cleaned in order for replication to flow. +# However this could lead to an expected error when the master +# resumes binlogging of such domain which the test demonstrate. + +--source include/master-slave.inc + +--connection master +# enforce the default domain_id binlogging explicitly +SET @@SESSION.gtid_domain_id=0; +CREATE TABLE t (a INT); +--sync_slave_with_master + +--connection slave +call mtr.add_suppression("connecting slave requested to start from.*which is not in the master's binlog"); + +--source include/stop_slave.inc +CHANGE MASTER TO master_use_gtid=slave_pos; + +--connection master +# create extra gtid domains for binlog state +--let $extra_domain_id=11 +--let $extra_domain_server_id=111 +--let $extra_gtid_seq_no=1 +--eval SET @@SESSION.gtid_domain_id=$extra_domain_id +--eval SET @@SESSION.server_id=$extra_domain_server_id +--eval SET @@SESSION.gtid_seq_no=$extra_gtid_seq_no +INSERT INTO t SET a=1; + +# +# Set up the slave replication state as if slave knows more events from the extra +# domain. +# +--connection slave +SET @save.gtid_slave_pos=@@global.gtid_slave_pos; +--eval SET @@global.gtid_slave_pos=concat(@@global.gtid_slave_pos, ",", $extra_domain_id, "-", $extra_domain_server_id, "-", $extra_gtid_seq_no + 1) + +# unsuccessful attempt to start slave +START SLAVE IO_THREAD; +--let $slave_io_errno=1236 +--source include/wait_for_slave_io_error.inc + +--connection master +# adjust the master binlog state +FLUSH BINARY LOGS; +--let $purge_to_binlog= query_get_value(SHOW MASTER STATUS, File, 1) +--eval PURGE BINARY LOGS TO '$purge_to_binlog'; +# with final removal of the extra domain +--eval FLUSH BINARY LOGS DELETE_DOMAIN_ID=($extra_domain_id) + +--connection slave +# start the slave sucessfully +--source include/start_slave.inc + +--connection master +# but the following gtid from the *extra* domain will break replication +INSERT INTO t SET a=1; + +# take note of the slave io thread error due to being dismissed +# extra domain at connection to master which tried becoming active; +# slave is to stop. +--connection slave +--let $errno=1236 +--source include/wait_for_slave_io_error.inc + +# let's apply the very same medicine +--connection master +FLUSH BINARY LOGS; +--let $purge_to_binlog= query_get_value(SHOW MASTER STATUS, File, 1) +--eval PURGE BINARY LOGS TO '$purge_to_binlog'; +# with final removal of the extra domain +--eval FLUSH BINARY LOGS DELETE_DOMAIN_ID=($extra_domain_id) + +--connection slave +--source include/start_slave.inc + +# +# cleanup +# +--connection master +SET @@SESSION.gtid_domain_id=0; +DROP TABLE t; + +sync_slave_with_master; + +--source include/rpl_end.inc diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb.result b/mysql-test/suite/sys_vars/r/sysvars_innodb.result index acdbd007..161f740d 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_innodb.result +++ b/mysql-test/suite/sys_vars/r/sysvars_innodb.result @@ -1347,7 +1347,7 @@ NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST fcfs,vats -READ_ONLY NO +READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME INNODB_LOCK_WAIT_TIMEOUT SESSION_VALUE 50 diff --git a/mysql-test/suite/sys_vars/t/wsrep_on_basic.opt b/mysql-test/suite/sys_vars/t/wsrep_on_basic.opt new file mode 100644 index 00000000..aa1fb6cb --- /dev/null +++ b/mysql-test/suite/sys_vars/t/wsrep_on_basic.opt @@ -0,0 +1 @@ +--innodb-lock-schedule-algorithm=FCFS diff --git a/mysql-test/t/ctype_utf8.test b/mysql-test/t/ctype_utf8.test index d88ce2aa..e013109d 100644 --- a/mysql-test/t/ctype_utf8.test +++ b/mysql-test/t/ctype_utf8.test @@ -1869,6 +1869,18 @@ SELECT _utf8 0x7E, _utf8 X'7E', _utf8 B'01111110'; let $ctype_unescape_combinations=selected; --source include/ctype_unescape.inc +--echo # +--echo # MDEV-12681 Wrong VIEW results for CHAR(0xDF USING latin1) +--echo # + +SET NAMES utf8; +SELECT CHAR(0xDF USING latin1); +CREATE OR REPLACE VIEW v1 AS SELECT CHAR(0xDF USING latin1) AS c; +SHOW CREATE VIEW v1; +SELECT * FROM v1; +DROP VIEW v1; + + --echo # --echo # End of 10.0 tests --echo # diff --git a/mysql-test/t/ctype_utf8mb4.test b/mysql-test/t/ctype_utf8mb4.test index 060c2aa1..77ace195 100644 --- a/mysql-test/t/ctype_utf8mb4.test +++ b/mysql-test/t/ctype_utf8mb4.test @@ -1913,6 +1913,24 @@ INSERT INTO t1 SELECT 'a 😁 b', 'a 😁 b'; SELECT * FROM t1; DROP TABLE t1; +--echo # +--echo # MDEV-8949: COLUMN_CREATE unicode name breakage +--echo # + +SET NAMES utf8mb4; +SELECT COLUMN_JSON(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1)); +SELECT COLUMN_LIST(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1)); +SELECT COLUMN_GET(COLUMN_CREATE(_utf8mb4 0xF09F988E, 1), _utf8mb4 0xF09F988E +as int); + +CREATE TABLE t1 AS SELECT + COLUMN_LIST(COLUMN_CREATE('a',1)), + COLUMN_JSON(COLUMN_CREATE('b',1)); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +SET NAMES default; + --echo # --echo # End of 10.0 tests --echo # diff --git a/mysql-test/t/func_set.test b/mysql-test/t/func_set.test index 13f8661d..887b1948 100644 --- a/mysql-test/t/func_set.test +++ b/mysql-test/t/func_set.test @@ -136,18 +136,14 @@ SELECT * FROM t1 WHERE FIND_IN_SET(NULL, NULL) IS UNKNOWN; --echo DROP TABLE t1; ---echo # ---echo # Start of 5.3 tests ---echo # --echo # ---echo # MDEV-4512 Valgrind warnings in my_long10_to_str_8bit on INTERVAL and DATE_ADD with incorrect types +--echo # MDEV-14596 Crash in INTERVAL(ROW(..),ROW(..)) --echo # -CREATE TABLE t1 (pk INT PRIMARY KEY); -INSERT INTO t1 VALUES (10),(11); -SELECT INTERVAL( 9, 1, DATE_ADD( pk, INTERVAL pk MINUTE_SECOND ), 9, 8, 3, 5, 2, 1 ) FROM t1; -DROP TABLE t1; ---echo # ---echo # End of 5.3 tests ---echo # +--error ER_OPERAND_COLUMNS +SELECT INTERVAL(ROW(1,1),ROW(1,2)); +--error ER_OPERAND_COLUMNS +SELECT INTERVAL(1,ROW(1,2)); +--error ER_OPERAND_COLUMNS +SELECT INTERVAL(ROW(1,2),1); diff --git a/mysql-test/t/func_str.test b/mysql-test/t/func_str.test index 48872edc..b3143ecb 100644 --- a/mysql-test/t/func_str.test +++ b/mysql-test/t/func_str.test @@ -1756,6 +1756,18 @@ set global max_allowed_packet=default; --echo # End of 5.6 tests --echo # +--echo # +--echo # Start of 10.0 tests +--echo # + +--echo # +--echo # MDEV-12681 Wrong VIEW results for CHAR(0xDF USING latin1) +--echo # + +EXPLAIN EXTENDED SELECT CHAR(0xDF USING latin1); +EXPLAIN EXTENDED SELECT CHAR(0xDF USING `binary`); +EXPLAIN EXTENDED SELECT CHAR(0xDF); + --echo # --echo # Start of 10.1 tests --echo # @@ -1800,7 +1812,6 @@ SELECT f1,HEX(f2) FROM t1 WHERE f1='YQ==' AND (f2= from_base64( SELECT f1,HEX(f2) FROM t1 WHERE f1='YQ==' AND (f2= from_base64("Yq==") OR f2= from_base64("YQ==")); DROP TABLE t1; - --echo # --echo # End of 10.1 tests --echo # diff --git a/mysql-test/t/group_by.test b/mysql-test/t/group_by.test index 46d341af..0401ad97 100644 --- a/mysql-test/t/group_by.test +++ b/mysql-test/t/group_by.test @@ -1764,6 +1764,32 @@ create table t2 (c1 int, c2 int); select t1.c1 as c1, t2.c2 as c1 from t1, t2 where t1.c1 < 20 and t2.c2 > 5 group by t1.c1, t2.c2 having t1.c1 < 3; drop table t1, t2; +# +# MDEV-12350: Heap corruption, overrun buffer, ASAN errors, server crash in my_fill_8bit / filesort +# + +SET @old_sort_buff_size = @@sort_buffer_size; +SET @@sort_buffer_size=256*1024; +CREATE TABLE t1 (c INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES + (2011),(1977),(1982),(2027),(2023),(NULL),(NULL),(2004),(1974),(2032), + (1993),(NULL),(1995),(2034),(NULL),(2009),(1900),(NULL),(2025),(1900), + (2033),(1900),(2012),(NULL),(2009),(1992),(1974),(1974),(2012),(2028), + (2007),(2012),(1900),(1983),(1900),(2010),(1987),(1994),(1981),(2032), + (2010),(1989),(2014),(1900),(1900),(1976),(1978),(2007),(2030),(NULL), + (2002),(1997),(1900),(NULL),(2000),(2027),(1975),(2026),(1975),(2026), + (2029),(1977),(1900),(1900),(2031),(1993),(1986),(2012),(1979),(2013), + (1994),(2014),(2025),(2006),(1971),(1974),(2021),(2011),(NULL),(1991), + (2001),(1977),(2023),(2012),(1900),(1978),(1998),(NULL),(1988),(1999), + (2017),(2008),(1976),(1900),(2005),(2030),(2023),(1900),(1978),(1990), + (1978),(1987),(2030),(1900),(2034),(2006),(2015),(2001),(2019),(2024), + (2030),(1989),(1997),(2007),(2023),(1994),(1971),(2011),(2011),(2015), + (1984),(1978),(1979),(1989),(2008),(2030); + +SELECT ExtractValue('','/a') AS f1, SPACE(c) AS f2 FROM t1 GROUP BY f1, f2 WITH ROLLUP; +SET @@sort_buffer_size = @old_sort_buff_size; +DROP TABLE t1; + # # End of MariaDB 5.5 tests # diff --git a/mysql-test/t/having.test b/mysql-test/t/having.test index f826feff..1bbde3e7 100644 --- a/mysql-test/t/having.test +++ b/mysql-test/t/having.test @@ -728,6 +728,23 @@ HAVING UPPER(`column_1`) LIKE '8%'; drop table t1; +--echo # +--echo # mdev-14368: grouping query with alias for aggregate function in HAVING +--echo # when sql_mode = 'ONLY_FULL_GROUP_BY' + + +set @save_sql_mode= @@sql_mode; +set sql_mode = 'ONLY_FULL_GROUP_BY'; + +create table t1(a int); +insert t1 values (4),(1),(2),(1), (3),(4); + +SELECT a, COUNT(a) as ct FROM t1 GROUP BY a HAVING ct>0; + +set sql_mode=@save_sql_mode; + +drop table t1; + --echo # --echo # Bug mdev-5160: two-way join with HAVING over the second table --echo # diff --git a/mysql-test/t/join_outer.test b/mysql-test/t/join_outer.test index 88861511..acbe19b5 100644 --- a/mysql-test/t/join_outer.test +++ b/mysql-test/t/join_outer.test @@ -1962,6 +1962,20 @@ DROP FUNCTION f1; DROP TABLE t1,t2; +--echo # +--echo # MDEV-10397: Server crashes in key_copy with join_cache_level > 2 and join on BIT fields +--echo # + +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; +SELECT t1.b1+'0' , t2.b2 + '0' FROM t1 LEFT JOIN t2 ON b1 = b2; +DROP TABLE t1, t2; + --echo # end of 5.5 tests SET optimizer_switch=@save_optimizer_switch; diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 99020eb9..7453cec8 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -9588,4 +9588,21 @@ drop procedure p; drop view v; drop table t, tmp_t; + +--echo # +--echo # MDEV-13936: Server crashes in Time_and_counter_tracker::incr_loops +--echo # +CREATE TABLE t1 (i INT); +CREATE VIEW v1 AS SELECT * FROM t1 WHERE RAND() > 0.5; +CREATE FUNCTION f1() RETURNS INT RETURN ( SELECT MAX(i) FROM v1 ); + +--error ER_NON_INSERTABLE_TABLE +REPLACE INTO v1 VALUES (f1()); +SET @aux = f1(); + +# Cleanup +DROP FUNCTION f1; +DROP VIEW v1; +DROP TABLE t1; + --echo #End of 10.1 tests diff --git a/mysql-test/t/trigger.test b/mysql-test/t/trigger.test index a02dce34..ff6f38b7 100644 --- a/mysql-test/t/trigger.test +++ b/mysql-test/t/trigger.test @@ -2634,3 +2634,27 @@ INSERT INTO t1 VALUES ('a'); DROP TRIGGER t1_bi; DROP TABLE t1; +--echo # +--echo # MDEV-13936: Server crashes in Time_and_counter_tracker::incr_loops +--echo # + +CREATE TABLE t1 (i INT); +CREATE VIEW v1 AS SELECT * FROM t1 WHERE RAND() > 0.5; +CREATE TABLE t2 (a int); +CREATE TABLE t3 (a int); + +create trigger trg after insert on t2 for each row + INSERT INTO t3 SELECT MAX(i) FROM v1 UNION SELECT MAX(i) FROM v1; + +drop table t1; + +--error ER_NO_SUCH_TABLE +insert into t2 value (2); +CREATE TABLE t1 (i INT); +insert into t2 value (2); + +DROP VIEW v1; +DROP TABLE t1,t2,t3; + + +--echo End of 10.1 tests. diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index ac6b9410..68adc6e1 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -5591,6 +5591,18 @@ PREPARE stmt FROM 'REPLACE INTO v2 SELECT a FROM t3'; drop view v1,v2; drop table t3; +--echo # +--echo # MDEV-14619: VIEW and GROUP_CONCAT +--echo # + +CREATE TABLE t1 (str text); +INSERT INTO t1 VALUES ("My"),("SQL"); +CREATE VIEW v1 AS SELECT GROUP_CONCAT(str SEPARATOR '\\') FROM t1; +SELECT * FROM v1; +SHOW CREATE VIEW v1; +drop view v1; +drop table t1; + --echo # ----------------------------------------------------------------- --echo # -- End of 5.5 tests. --echo # ----------------------------------------------------------------- diff --git a/mysql-test/t/xml.test b/mysql-test/t/xml.test index 371fcb72..ae7e9058 100644 --- a/mysql-test/t/xml.test +++ b/mysql-test/t/xml.test @@ -713,7 +713,7 @@ FROM t1; SELECT UPDATEXML(txt, CONCAT('//', REPEAT('b', 63)), '63/63+') FROM t1; DROP TABLE t1; -# This will call my_str_realloc_mysqld() +# This will call realloc() CREATE TABLE t1 (a TEXT); INSERT INTO t1 VALUES (CONCAT('<', REPEAT('b',128),'>b128<',REPEAT('c',512),'>c512')); SELECT ExtractValue (a, CONCAT('//',REPEAT('c',512))) AS c512 FROM t1; diff --git a/mysql-test/unstable-tests b/mysql-test/unstable-tests index b5f8f9ff..3010c5dd 100644 --- a/mysql-test/unstable-tests +++ b/mysql-test/unstable-tests @@ -26,16 +26,17 @@ main.alter_table : Modified in 10.1.29 main.alter_table_trans : MDEV-12084 - timeout main.analyze_stmt_slow_query_log : MDEV-12237 - Wrong result +main.auth_named_pipe : MDEV-14724 - System error 2 main.bootstrap : Include files modified in 10.1.29 main.case : Modified in 10.1.29 -main.count_distinct : Modified in 10.1.27 main.create_delayed : MDEV-10605 - failed with timeout main.ctype_gbk : Modified in 10.1.29 main.ctype_latin1 : Modified in 10.1.29 main.ctype_ucs : Modified in 10.1.29 main.ctype_utf16le : MDEV-10675: timeout or extra warnings main.ctype_utf32 : Modified in 10.1.29 -main.ctype_utf8 : Modified in 10.1.29 +main.ctype_utf8 : Modified in 10.1.30 +main.ctype_utf8mb4 : Modified in 10.1.30 main.delete_returning : Modified in 10.1.29 main.delimiter_command_case_sensitivity : Added in 10.1.29 main.events_2 : MDEV-13277 - Server crash @@ -44,16 +45,19 @@ main.events_restart : MDEV-12236 - Server shutdown problem main.func_in : Modified in 10.1.29 main.func_misc : Modified in 10.1.29 main.func_regexp_pcre : Modified in 10.1.29 +main.func_set : Modified in 10.1.30 +main.func_str : Modified in 10.1.30 main.func_time : Modified in 10.1.29 main.gis-precise : Modified in 10.1.29 +main.group_by : Modified in 10.1.30 +main.having : Modified in 10.1.30 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.information_schema : Modified in 10.1.29 main.innodb_mysql_lock : MDEV-7861 - sporadic lock detection failure -main.insert : Modified in 10.1.27 +main.join_outer : Modified in 10.1.30 main.kill_processlist-6619 : MDEV-10793 - wrong result in processlist -main.log_tables-big : Modified in 10.1.27 main.mdev-504 : MDEV-10607 - sporadic "can't connect" main.mdev13607 : Added in 10.1.29 main.mdev375 : MDEV-10607 - sporadic "can't connect" @@ -63,12 +67,10 @@ main.mysql_upgrade_noengine : MDEV-14355 - Plugin is busy main.mysqlbinlog : Modified in 10.1.29 main.mysqlslap : MDEV-11801 - timeout main.mysqltest : MDEV-9269 - fails on Alpha -main.old-mode : Modified in 10.1.27 main.order_by_optimizer_innodb : MDEV-10683 - wrong execution plan main.partition_datatype : Modified in 10.1.29 main.partition_example : Include files modified in 10.1.29 main.partition_innodb_plugin : MDEV-12901 - Valgrind warnings -main.partition_symlink : Modified in 10.1.27 main.plugin : Include files modified in 10.1.29 main.plugin_innodb : Include files modified in 10.1.29 main.plugin_load : Include files modified in 10.1.29 @@ -83,31 +85,33 @@ main.read_only : Modified in 10.1.29 main.set_statement : MDEV-13183 - Wrong result main.show_explain : MDEV-10674 - sporadic failure main.show_function_with_pad_char_to_full_length : Added in 10.1.29 -main.sp : Modified in 10.1.27 +main.sp : Modified in 10.1.30 main.sp-security : MDEV-10607 - sporadic "can't connect" main.status : MDEV-8510 - sporadic wrong result main.subselect_exists2in : Modified in 10.1.29 main.subselect_innodb : MDEV-10614 - sporadic wrong results main.subselect_mat_cost_bugs : Modified in 10.1.29 -main.symlink : Modified in 10.1.27 main.table_options-5867 : Include files modified in 10.1.29 -main.tc_heuristic_recover : Added in 10.1.27 +main.trigger : Modified in 10.1.30 main.truncate_badse : Include files modified in 10.1.29 main.type_bit : Modified in 10.1.29 main.type_date : Modified in 10.1.29 main.type_datetime_hires : MDEV-10687 - timeout main.type_varchar : Modified in 10.1.29 main.user_var : Modified in 10.1.29 -main.view : Modified in 10.1.29 -main.xml : Modified in 10.1.29 +main.view : Modified in 10.1.30 +main.xml : Modified in 10.1.30 #---------------------------------------------------------------- -archive.discover : MDEV-10510 - table is marked as crashed +archive.discover : MDEV-10510 - Table is marked as crashed +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_killed : MDEV-12925 - Wrong result binlog.binlog_spurious_ddl_errors : Include files modified in 10.1.29 binlog.binlog_xa_recover : MDEV-8517 - Extra checkpoint @@ -118,44 +122,20 @@ binlog_encryption.binlog_xa_recover : MDEV-12908 - Extra checkpoint binlog_encryption.encrypted_master : MDEV-12906 - Failed to sync binlog_encryption.rpl_parallel : MDEV-10653 - Timeout binlog_encryption.rpl_semi_sync : MDEV-11220 - Wrong result, MDEV-11673 - Valgrind warning +binlog_encryption.rpl_ssl : MDEV-14507 - Timeout on SLES 11.4 binlog_encryption.rpl_typeconv : MDEV-14362 - Lost connection to MySQL server during query #---------------------------------------------------------------- -connect.alter_xml : Modified in 10.1.27 -connect.alter_xml2 : Added in 10.1.27 -connect.infoschema-9739 : Modified in 10.1.27 -connect.infoschema2-9739 : Added in 10.1.27 -connect.jdbc_new : Modified in 10.1.27 -connect.json : Modified in 10.1.27 connect.json_java_2 : Include file modified in 10.1.29 connect.json_java_3 : Include file modified in 10.1.29 connect.json_mongo_c : Include file modified in 10.1.29 -connect.json_udf : Modified in 10.1.27 -connect.json_udf_bin : Modified in 10.1.27 connect.mongo_c : Include file modified in 10.1.29 connect.mongo_java_2 : Include file modified in 10.1.29 connect.mongo_java_3 : Include file modified in 10.1.29 -connect.mul_new : Added in 10.1.27 -connect.mysql_exec : Modified in 10.1.27 -connect.mysql_new : Modified in 10.1.27 -connect.tbl : MDEV-9844, MDEV-10179 - sporadic crashes, valgrind warnings, wrong results; modified in 10.1.27 -connect.tbl_thread : MDEV-9844, MDEV-10179, MDEV-14214 - sporadic crashes, valgrind warnings, wrong results; added in 10.1.27 -connect.unsigned : Modified in 10.1.27 -connect.upd : Modified in 10.1.27 -connect.xml : Modified in 10.1.27 -connect.xml2 : Added in 10.1.27 -connect.xml2_grant : Added in 10.1.27 -connect.xml2_html : Added in 10.1.27 -connect.xml2_mdev5261 : Added in 10.1.27 -connect.xml2_mult : Added in 10.1.27 -connect.xml2_zip : Added in 10.1.27 -connect.xml_grant : Modified in 10.1.27 -connect.xml_html : Modified in 10.1.27 -connect.xml_mdev5261 : Modified in 10.1.27 -connect.xml_mult : Modified in 10.1.27 -connect.xml_zip : Modified in 10.1.27 -connect.zip : MDEV-13884 - Wrong result; modified in 10.1.27 +connect.tbl : MDEV-9844, MDEV-10179 - sporadic crashes, valgrind warnings, wrong results +connect.tbl_thread : MDEV-9844, MDEV-10179, MDEV-14214 - sporadic crashes, valgrind warnings, wrong results +connect.zip : MDEV-13884 - Wrong result #---------------------------------------------------------------- @@ -166,8 +146,8 @@ encryption.encryption_force : Modified in 10.1.29 encryption.filekeys_encfile : Include file modified in 10.1.29 encryption.filekeys_encfile_file : Include file modified in 10.1.29 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.27 encryption.innodb-encryption-alter : Modified in 10.1.29 encryption.innodb_encryption_discard_import : MDEV-12903 - Wrong result encryption.innodb_encryption_filekeys : MDEV-9962 - timeouts @@ -175,7 +155,7 @@ encryption.innodb_encryption-page-compression : MDEV-12630 - crash or assertion encryption.innodb_encryption_tables : MDEV-9359 - Assertion failure encryption.innodb_first_page : MDEV-10689 - crashes encryption.innodb-first-page-read : MDEV-14356 - Timeout on wait condition -encryption.innodb_lotoftables : MDEV-11531 - InnoDB error; modified in 10.1.27 +encryption.innodb_lotoftables : MDEV-11531 - InnoDB error encryption.innodb-missing-key : MDEV-9359 - assertion failure encryption.innodb-page_encryption : MDEV-10641 - mutex problem encryption.innodb-redo-badkey : MDEV-12898 - Server hang on startup @@ -223,44 +203,37 @@ galera.MW-328A : MDEV-13876 - Wrong result #---------------------------------------------------------------- -innodb.alter_rename_existing : Added in 10.1.27 innodb.binlog_consistent : MDEV-10618 - Server fails to start -innodb.create-index-debug : Added in 10.1.27 innodb.doublewrite : MDEV-12905, MDEV-14205 - Lost connection to MySQL server -innodb.index_tree_operation : Added in 10.1.27 +innodb_fts.fulltext2 : MDEV-14727 - Long semaphore wait innodb.innodb-16k : Modified in 10.1.29 innodb.innodb-32k : Modified in 10.1.29 innodb.innodb-64k : Modified in 10.1.29 innodb.innodb-64k-crash : MDEV-13872 - Failure and crash on startup innodb.innodb-alter : Modified in 10.1.29 -innodb.innodb-alter-autoinc : Added in 10.1.27 innodb.innodb-alter-debug : MDEV-13182 - InnoDB: adjusting FSP_SPACE_FLAGS innodb.innodb-alter-table : MDEV-10619 - Testcase timeout; modified in 10.1.29 +innodb.innodb-autoinc : Modified in 10.1.30 innodb.innodb-blob : MDEV-12053 - Client crash innodb.innodb_bug14147491 : MDEV-11808 - wrong error codes innodb.innodb_bug30423 : MDEV-7311 - Wrong number of rows in the plan -innodb.innodb-enlarge-blob : Modified in 10.1.27 +innodb.innodb_bug48024 : MDEV-14352 - Assertion failure innodb.innodb-fk : MDEV-13832 - Assertion failure on shutdown innodb.innodb-get-fk : Modified in 10.1.29 -innodb.innodb-index-debug : Added in 10.1.27 -innodb.innodb-index-online : Added in 10.1.27 -innodb.innodb-index-online-delete : Added in 10.1.27 -innodb.innodb-index-online-fk : Added in 10.1.27 -innodb.innodb-index-online-purge : Added in 10.1.27 innodb.innodb-page_compression_lzma : MDEV-14353 - wrong result on Fedora 25 innodb.innodb-page_compression_tables : Modified in 10.1.29 innodb.innodb-page_compression_zip : MDEV-10641 - mutex problem +innodb.innodb-replace-debug : Added in 10.1.30 innodb.innodb_stats : MDEV-10682 - wrong result innodb.innodb_sys_semaphore_waits : MDEV-10331 - wrong result innodb.innodb-table-online : Modified in 10.1.29 innodb.innodb-wl5522-debug : Modified in 10.1.29 innodb.innodb-wl5980-alter : Modified in 10.1.29 innodb.innodb_zip_innochecksum2 : MDEV-13882 - Warning: difficult to find free blocks -innodb.log_data_file_size : Modified in 10.1.27 -innodb.table_definition_cache_debug : MDEV-14206 - Extra warning; modified in 10.1.29 +innodb.recovery_shutdown : Added in 10.1.30 +innodb.table_definition_cache_debug : MDEV-14206 - Extra warning; opt file modified in 10.1.30 innodb.table_flags : MDEV-14363 - Operating system error number 2 innodb.undo_log : Modified in 10.1.29 -innodb.xa_recovery : Modified in 10.1.27 innodb_fts.concurrent_insert : Added in 10.1.29 innodb_fts.fulltext : Modified in 10.1.29 @@ -271,18 +244,15 @@ innodb_zip.wl5522_debug_zip : Added in 10.1.29 #---------------------------------------------------------------- -maria.maria : Modified in 10.1.29 +maria.maria : MDEV-14430 - Wrong result; modified in 10.1.29 #---------------------------------------------------------------- -mariabackup.apply-log-only : Added in 10.1.27 -mariabackup.apply-log-only-incr : Added in 10.1.27 -mariabackup.auth_plugin_win : Added in 10.1.27 mariabackup.compress_qpress : Added in 10.1.29 mariabackup.data_directory : Added in 10.1.29 mariabackup.incremental_backup : Modified in 10.1.29 +mariabackup.mdev-14447 : Added in 10.1.30 mariabackup.partition_datadir : Added in 10.1.29 -mariabackup.xb_aws_key_management : Modified in 10.1.27 #---------------------------------------------------------------- @@ -297,6 +267,12 @@ 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 +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 #---------------------------------------------------------------- @@ -309,23 +285,18 @@ multi_source.status_vars : MDEV-4632 - failed while waiting for Slave_received_h #---------------------------------------------------------------- -parts.partition_alter_maria : Added in 10.1.29 +parts.partition_alter_innodb : Added in 10.1.30 +parts.partition_alter_maria : Modified in 10.1.30 +parts.partition_alter_myisam : Added in 10.1.30 parts.partition_alter2_2_maria : MDEV-14364 - Lost connection to MySQL server during query -parts.partition_exch_myisam_innodb : Modified in 10.1.27 -parts.partition_exch_qa_10 : Include files modified in 10.1.27 -parts.partition_exch_qa_11 : Include files modified in 10.1.27 -parts.partition_exch_qa_12 : Include files modified in 10.1.27 -parts.partition_exch_qa_14 : Modified in 10.1.27 -parts.partition_exch_qa_15 : Modified in 10.1.27 -parts.partition_exch_qa_2 : Modified in 10.1.27 -parts.partition_exch_qa_3 : Modified in 10.1.27 -parts.partition_exch_qa_6 : Modified in 10.1.27 +parts.partition_auto_increment_maria : MDEV-14430 - Wrong result 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.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 @@ -335,6 +306,7 @@ 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; modified in 10.1.29 plugins.thread_pool_server_audit : MDEV-9562 - crashes on sol10-sparc; modified in 10.1.29 @@ -342,6 +314,8 @@ plugins.thread_pool_server_audit : MDEV-9562 - crashes on sol10-sparc; modified #---------------------------------------------------------------- roles.definer : Modified in 10.1.29 +roles.flush_roles-12366 : Added in 10.1.30 +roles.set_role-13655 : Added in 10.1.30 #---------------------------------------------------------------- @@ -356,7 +330,9 @@ 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_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 rpl.rpl_gtid_until : MDEV-10625 - warnings in error log rpl.rpl_innodb_bug30888 : MDEV-10417 - Fails on Mips @@ -366,20 +342,29 @@ rpl.rpl_insert_ignore : MDEV-14365 - Lost connection to MySQL se rpl.rpl_invoked_features : MDEV-10417 - Fails on Mips 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_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_optimistic : MDEV-10511 - timeout +rpl.rpl_parallel_multilevel2 : MDEV-14723 - Timeout +rpl.rpl_parallel_optimistic : MDEV-10511 - Timeout 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_plugin_load : Include files modified in 10.1.29 +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_log_innodb : MDEV-10688 - Wrong result +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 rpl.rpl_semi_sync_after_sync_row : MDEV-14366 - Wrong result rpl.rpl_semi_sync_event_after_sync : MDEV-11806 - warnings rpl.rpl_semi_sync_uninstall_plugin : MDEV-7140 - Wrong plugin status @@ -387,12 +372,12 @@ rpl.rpl_semi_sync_wait_point : MDEV-11807 - timeout in wait condition 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_sp_variables : Added in 10.1.27 rpl.rpl_start_stop_slave : MDEV-13567 - Replication failure +rpl.rpl_stm_log : Include file modified in 10.1.30 +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 rpl.rpl_table_options : Include files modified in 10.1.29 -rpl.rpl_temporal_format_mariadb53_to_mysql56_dst : Added in 10.1.27 rpl.rpl_temporary_error2 : MDEV-10634 - Wrong number of retries rpl.sec_behind_master-5114 : MDEV-13878 - Wrong result @@ -439,8 +424,6 @@ sys_vars.innodb_buffer_pool_load_now_basic : Modified in 10.1.29 sys_vars.innodb_fatal_semaphore_wait_threshold : MDEV-10513 - crashes sys_vars.log_slow_admin_statements_func : MDEV-12235 - Server crash sys_vars.rpl_init_slave_func : MDEV-10149 - wrong results -sys_vars.sysvars_innodb : MDEV-6958 - error-prone rdiffs -sys_vars.sysvars_server_embedded : MDEV-6958 - error-prone rdiffs sys_vars.sysvars_wsrep : MDEV-12522 - Dependency on specific wsrep_provider sys_vars.thread_cache_size_func : MDEV-11775 - Wrong result sys_vars.wait_timeout_func : MDEV-12896 - Wrong result @@ -453,7 +436,7 @@ tokudb.change_column_char : MDEV-12822 - Lost connection to MySQL ser tokudb.cluster_filter : MDEV-10678 - Wrong execution plan tokudb.cluster_filter_hidden : MDEV-10678 - Wrong execution plan tokudb.cluster_filter_unpack_varchar : MDEV-10636 - Wrong execution plan -tokudb.dir_per_db : MDEV-11537 - Wrong result; modified in 10.1.27 +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-1 : MDEV-13870 - Lost connection to MySQL server @@ -467,6 +450,9 @@ tokudb_bugs.xa : MDEV-11804 - Lock wait timeout tokudb_mariadb.mdev6657 : MDEV-12737 - Wrong plan, valgrind warnings +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 @@ -481,8 +467,8 @@ vcol.vcol_misc : Modified in 10.1.29 #---------------------------------------------------------------- wsrep.binlog_format : MDEV-11532 - WSREP has not yet prepared node -wsrep.mdev_6832 : MDEV-14195 - Failure upon check-testcase; option file changed in 10.1.27 -wsrep.mdev_7798 : Option file changed in 10.1.27 +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_info.plugin : MDEV-12909 - Wrong result diff --git a/mysys/ma_dyncol.c b/mysys/ma_dyncol.c index e3357e38..c46e9cd4 100644 --- a/mysys/ma_dyncol.c +++ b/mysys/ma_dyncol.c @@ -4183,8 +4183,7 @@ mariadb_dyncol_json_internal(DYNAMIC_COLUMN *str, DYNAMIC_STRING *json, } else { - if ((rc= mariadb_dyncol_val_str(json, &val, - &my_charset_utf8_general_ci, '"')) < 0) + if ((rc= mariadb_dyncol_val_str(json, &val, DYNCOL_UTF, '"')) < 0) goto err; } } diff --git a/mysys/my_default.c b/mysys/my_default.c index 655e9a57..dba22c4e 100644 --- a/mysys/my_default.c +++ b/mysys/my_default.c @@ -487,8 +487,7 @@ int load_defaults(const char *conf_file, const char **groups, easily command line options override options in configuration files NOTES - In case of fatal error, the function will print a warning and do - exit(1) + In case of fatal error, the function will print a warning and returns 2 To free used memory one should call free_defaults() with the argument that was put in *argv @@ -641,8 +640,7 @@ int my_load_defaults(const char *conf_file, const char **groups, err: fprintf(stderr,"Fatal error in defaults handling. Program aborted\n"); - exit(1); - return 0; /* Keep compiler happy */ + return 2; } diff --git a/mysys/my_malloc.c b/mysys/my_malloc.c index dc02d389..719c13a0 100644 --- a/mysys/my_malloc.c +++ b/mysys/my_malloc.c @@ -109,7 +109,7 @@ void *my_malloc(size_t size, myf my_flags) my_error(EE_OUTOFMEMORY, MYF(ME_BELL + ME_WAITTANG + ME_NOREFRESH + ME_FATALERROR),size); if (my_flags & MY_FAE) - exit(1); + abort(); } else { diff --git a/mysys/thr_alarm.c b/mysys/thr_alarm.c index 9d917d3d..61ef3657 100644 --- a/mysys/thr_alarm.c +++ b/mysys/thr_alarm.c @@ -273,7 +273,7 @@ void thr_end_alarm(thr_alarm_t *alarmed) /* Come here when some alarm in queue is due. Mark all alarms with are finnished in list. - Shedule alarms to be sent again after 1-10 sec (many alarms at once) + Schedule alarms to be sent again after 1-10 sec (many alarms at once) If alarm_aborted is set then all alarms are given and resent every second. */ @@ -425,7 +425,7 @@ void end_thr_alarm(my_bool free_structures) if (alarm_aborted != 1) /* If memory not freed */ { mysql_mutex_lock(&LOCK_alarm); - DBUG_PRINT("info",("Resheduling %d waiting alarms",alarm_queue.elements)); + DBUG_PRINT("info",("Rescheduling %d waiting alarms",alarm_queue.elements)); alarm_aborted= -1; /* mark aborted */ if (alarm_queue.elements || (alarm_thread_running && free_structures)) { diff --git a/mysys/typelib.c b/mysys/typelib.c index 96842b1a..9ca08475 100644 --- a/mysys/typelib.c +++ b/mysys/typelib.c @@ -45,18 +45,6 @@ int find_type_with_warning(const char *x, TYPELIB *typelib, const char *option) } -int find_type_or_exit(const char *x, TYPELIB *typelib, const char *option) -{ - int res; - if ((res= find_type_with_warning(x, typelib, option)) <= 0) - { - sf_leaking_memory= 1; /* no memory leak reports here */ - exit(1); - } - return res; -} - - /** Search after a string in a list of strings. Endspace in x is not compared. diff --git a/scripts/mysqld_safe.sh b/scripts/mysqld_safe.sh index bcaf7b86..f21e6979 100644 --- a/scripts/mysqld_safe.sh +++ b/scripts/mysqld_safe.sh @@ -989,8 +989,8 @@ if expr "${-}" : '.*x' > /dev/null then : else - exec 1>&- - exec 2>&- + exec 1>/dev/null + exec 2>/dev/null fi # maximum number of wsrep restarts diff --git a/scripts/wsrep_sst_common.sh b/scripts/wsrep_sst_common.sh index 1ef48306..788e1a12 100644 --- a/scripts/wsrep_sst_common.sh +++ b/scripts/wsrep_sst_common.sh @@ -257,12 +257,12 @@ parse_cnf() # look in group+suffix if [ -n $WSREP_SST_OPT_CONF_SUFFIX ]; then - reval=$($MY_PRINT_DEFAULTS -c $WSREP_SST_OPT_CONF "${group}${WSREP_SST_OPT_CONF_SUFFIX}" | awk -F= '{if ($1 ~ /_/) { gsub(/_/,"-",$1); print $1"="$2 } else { print $0 }}' | grep -- "--$var=" | cut -d= -f2- | tail -1) + reval=$($MY_PRINT_DEFAULTS "${group}${WSREP_SST_OPT_CONF_SUFFIX}" | awk -F= '{if ($1 ~ /_/) { gsub(/_/,"-",$1); print $1"="$2 } else { print $0 }}' | grep -- "--$var=" | cut -d= -f2- | tail -1) fi # look in group if [ -z $reval ]; then - reval=$($MY_PRINT_DEFAULTS -c $WSREP_SST_OPT_CONF $group | awk -F= '{if ($1 ~ /_/) { gsub(/_/,"-",$1); print $1"="$2 } else { print $0 }}' | grep -- "--$var=" | cut -d= -f2- | tail -1) + reval=$($MY_PRINT_DEFAULTS $group | awk -F= '{if ($1 ~ /_/) { gsub(/_/,"-",$1); print $1"="$2 } else { print $0 }}' | grep -- "--$var=" | cut -d= -f2- | tail -1) fi # use default if we haven't found a value diff --git a/scripts/wsrep_sst_mysqldump.sh b/scripts/wsrep_sst_mysqldump.sh index 59d9a3c5..f086d987 100644 --- a/scripts/wsrep_sst_mysqldump.sh +++ b/scripts/wsrep_sst_mysqldump.sh @@ -117,7 +117,7 @@ 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 --defaults-extra-file=$WSREP_SST_OPT_CONF "\ +MYSQL="$MYSQL_CLIENT $WSREP_SST_OPT_CONF "\ "$AUTH -h${WSREP_SST_OPT_HOST_UNESCAPED:-$WSREP_SST_OPT_HOST} "\ "-P$WSREP_SST_OPT_PORT --disable-reconnect --connect_timeout=10" diff --git a/scripts/wsrep_sst_xtrabackup-v2.sh b/scripts/wsrep_sst_xtrabackup-v2.sh index faa7bc5e..9284bf78 100644 --- a/scripts/wsrep_sst_xtrabackup-v2.sh +++ b/scripts/wsrep_sst_xtrabackup-v2.sh @@ -492,7 +492,7 @@ read_cnf() ssystag+="-" if [[ $ssyslog -ne -1 ]];then - if $MY_PRINT_DEFAULTS -c $WSREP_SST_OPT_CONF mysqld_safe | tr '_' '-' | grep -q -- "--syslog";then + if $MY_PRINT_DEFAULTS mysqld_safe | tr '_' '-' | grep -q -- "--syslog";then ssyslog=1 fi fi @@ -669,7 +669,7 @@ check_extra() local use_socket=1 if [[ $uextra -eq 1 ]];then if $MY_PRINT_DEFAULTS --mysqld | tr '_' '-' | grep -- "--thread-handling=" | grep -q 'pool-of-threads';then - local eport=$($MY_PRINT_DEFAULTS -c $WSREP_SST_OPT_CONF mysqld | tr '_' '-' | grep -- "--extra-port=" | cut -d= -f2) + local eport=$($MY_PRINT_DEFAULTS mysqld | tr '_' '-' | grep -- "--extra-port=" | cut -d= -f2) if [[ -n $eport ]];then # Xtrabackup works only locally. # Hence, setting host to 127.0.0.1 unconditionally. @@ -865,14 +865,14 @@ if [[ $ssyslog -eq 1 ]];then } INNOAPPLY="${INNOBACKUPEX_BIN} $disver $iapts --apply-log \$rebuildcmd \${DATA} 2>&1 | logger -p daemon.err -t ${ssystag}innobackupex-apply " - INNOMOVE="${INNOBACKUPEX_BIN} --defaults-file=${WSREP_SST_OPT_CONF} $disver $impts --datadir=${DATA} --move-back --force-non-empty-directories \${DATA} 2>&1 | logger -p daemon.err -t ${ssystag}innobackupex-move " - INNOBACKUP="${INNOBACKUPEX_BIN} ${WSREP_SST_OPT_CONF} $disver $iopts \$tmpopts \$INNOEXTRA --galera-info --stream=\$sfmt \$itmpdir 2> >(logger -p daemon.err -t ${ssystag}innobackupex-backup)" + INNOMOVE="${INNOBACKUPEX_BIN} ${WSREP_SST_OPT_DEFAULT} $disver $impts --datadir=${DATA} --move-back --force-non-empty-directories \${DATA} 2>&1 | logger -p daemon.err -t ${ssystag}innobackupex-move " + INNOBACKUP="${INNOBACKUPEX_BIN} ${WSREP_SST_OPT_DEFAULT} $disver $iopts \$tmpopts \$INNOEXTRA --galera-info --stream=\$sfmt \$itmpdir 2> >(logger -p daemon.err -t ${ssystag}innobackupex-backup)" fi else INNOAPPLY="${INNOBACKUPEX_BIN} $disver $iapts --apply-log \$rebuildcmd \${DATA} &>\${DATA}/innobackup.prepare.log" - INNOMOVE="${INNOBACKUPEX_BIN} --defaults-file=${WSREP_SST_OPT_CONF} --defaults-group=mysqld${WSREP_SST_OPT_CONF_SUFFIX} $disver $impts --datadir=${DATA} --move-back --force-non-empty-directories \${DATA} &>\${DATA}/innobackup.move.log" - INNOBACKUP="${INNOBACKUPEX_BIN} ${WSREP_SST_OPT_CONF} $disver $iopts \$tmpopts \$INNOEXTRA --galera-info --stream=\$sfmt \$itmpdir 2>\${DATA}/innobackup.backup.log" + INNOMOVE="${INNOBACKUPEX_BIN} ${WSREP_SST_OPT_DEFAULT} --defaults-group=mysqld${WSREP_SST_OPT_CONF_SUFFIX} $disver $impts --datadir=${DATA} --move-back --force-non-empty-directories \${DATA} &>\${DATA}/innobackup.move.log" + INNOBACKUP="${INNOBACKUPEX_BIN} ${WSREP_SST_OPT_DEFAULT} $disver $iopts \$tmpopts \$INNOEXTRA --galera-info --stream=\$sfmt \$itmpdir 2>\${DATA}/innobackup.backup.log" fi get_stream @@ -1072,7 +1072,7 @@ then wsrep_log_info "Cleaning the existing datadir and innodb-data/log directories" - find $ib_home_dir $ib_log_dir $ib_undo_dir $DATA -mindepth 1 -regex $cpat -prune -o -exec rm -rfv {} 1>&2 \+ + find $ib_home_dir $ib_log_dir $ib_undo_dir $DATA -mindepth 1 -prune -regex $cpat -o -exec rm -rfv {} 1>&2 \+ tempdir=$(parse_cnf mysqld log-bin "") if [[ -n ${tempdir:-} ]];then diff --git a/sql-common/client.c b/sql-common/client.c index ea686a79..da18a0fd 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -1232,11 +1232,12 @@ void mysql_read_default_options(struct st_mysql_options *options, options->max_allowed_packet= atoi(opt_arg); break; case OPT_protocol: - if ((options->protocol= find_type(opt_arg, &sql_protocol_typelib, + if (options->protocol != UINT_MAX32 && + (options->protocol= find_type(opt_arg, &sql_protocol_typelib, FIND_TYPE_BASIC)) <= 0) { fprintf(stderr, "Unknown option to protocol: %s\n", opt_arg); - exit(1); + options->protocol= UINT_MAX32; } break; case OPT_shared_memory_base_name: @@ -3133,6 +3134,8 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user, my_free(mysql->options.my_cnf_file); my_free(mysql->options.my_cnf_group); mysql->options.my_cnf_file=mysql->options.my_cnf_group=0; + if (mysql->options.protocol == UINT_MAX32) + goto error; } /* Some empty-string-tests are done because of ODBC */ diff --git a/sql/event_data_objects.cc b/sql/event_data_objects.cc index 9e1ee6f3..6ef9fa9f 100644 --- a/sql/event_data_objects.cc +++ b/sql/event_data_objects.cc @@ -1472,19 +1472,33 @@ Event_job_data::execute(THD *thd, bool drop) bool save_tx_read_only= thd->tx_read_only; thd->tx_read_only= false; - if (WSREP(thd)) - { + /* + This code is processing event execution and does not have client + connection. Here, event execution will now execute a prepared + DROP EVENT statement, but thd->lex->sql_command is set to + SQLCOM_CREATE_PROCEDURE + DROP EVENT will be logged in binlog, and we have to + replicate it to make all nodes have consistent event definitions + Wsrep DDL replication is triggered inside Events::drop_event(), + and here we need to prepare the THD so that DDL replication is + possible, essentially it requires setting sql_command to + SQLCOMM_DROP_EVENT, we will switch sql_command for the duration + of DDL replication only. + */ + const enum_sql_command sql_command_save= thd->lex->sql_command; + const bool sql_command_set= WSREP(thd); + + if (sql_command_set) thd->lex->sql_command = SQLCOM_DROP_EVENT; - WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL); - } ret= Events::drop_event(thd, dbname, name, FALSE); - WSREP_TO_ISOLATION_END; + if (sql_command_set) + { + WSREP_TO_ISOLATION_END; + thd->lex->sql_command = sql_command_save; + } -#ifdef WITH_WSREP - error: -#endif thd->tx_read_only= save_tx_read_only; thd->security_ctx->master_access= saved_master_access; } diff --git a/sql/events.cc b/sql/events.cc index 51f68ca4..cb81e98a 100644 --- a/sql/events.cc +++ b/sql/events.cc @@ -335,6 +335,7 @@ Events::create_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) if (lock_object_name(thd, MDL_key::EVENT, parse_data->dbname.str, parse_data->name.str)) @@ -417,6 +418,10 @@ Events::create_event(THD *thd, Event_parse_data *parse_data) thd->restore_stmt_binlog_format(save_binlog_format); DBUG_RETURN(ret); +#ifdef WITH_WSREP + error: + DBUG_RETURN(TRUE); +#endif /* WITH_WSREP */ } @@ -457,6 +462,9 @@ 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) + if (lock_object_name(thd, MDL_key::EVENT, parse_data->dbname.str, parse_data->name.str)) DBUG_RETURN(TRUE); @@ -541,6 +549,10 @@ Events::update_event(THD *thd, Event_parse_data *parse_data, thd->restore_stmt_binlog_format(save_binlog_format); DBUG_RETURN(ret); +#ifdef WITH_WSREP +error: + DBUG_RETURN(TRUE); +#endif /* WITH_WSREP */ } @@ -581,6 +593,8 @@ 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) + /* Turn off row binlogging of this statement and use statement-based so that all supporting tables are updated for DROP EVENT command. @@ -602,6 +616,10 @@ Events::drop_event(THD *thd, LEX_STRING dbname, LEX_STRING name, bool if_exists) thd->restore_stmt_binlog_format(save_binlog_format); DBUG_RETURN(ret); +#ifdef WITH_WSREP +error: + DBUG_RETURN(TRUE); +#endif } diff --git a/sql/field.cc b/sql/field.cc index 1ffe2ce7..141a7354 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -4729,7 +4729,7 @@ double Field_double::val_real(void) return j; } -longlong Field_double::val_int(void) +longlong Field_double::val_int_from_real(bool want_unsigned_result) { ASSERT_COLUMN_MARKED_FOR_READ; double j; @@ -4737,8 +4737,15 @@ longlong Field_double::val_int(void) bool error; float8get(j,ptr); - res= double_to_longlong(j, 0, &error); - if (error) + res= double_to_longlong(j, want_unsigned_result, &error); + /* + Note, val_uint() is currently used for auto_increment purposes only, + and we want to suppress all warnings in such cases. + If we ever start using val_uint() for other purposes, + val_int_from_real() will need a new separate parameter to + suppress warnings. + */ + if (error && !want_unsigned_result) { THD *thd= get_thd(); ErrConvDouble err(j); diff --git a/sql/field.h b/sql/field.h index 154037df..530f6d08 100644 --- a/sql/field.h +++ b/sql/field.h @@ -745,6 +745,10 @@ class Field: public Value_source { return store(ls->str, ls->length, cs); } virtual double val_real(void)=0; virtual longlong val_int(void)=0; + virtual ulonglong val_uint(void) + { + return (ulonglong) val_int(); + } virtual bool val_bool(void)= 0; virtual my_decimal *val_decimal(my_decimal *); inline String *val_str(String *str) { return val_str(str, str); } @@ -1999,6 +2003,7 @@ class Field_float :public Field_real { class Field_double :public Field_real { + longlong val_int_from_real(bool want_unsigned_result); public: Field_double(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, @@ -2025,7 +2030,8 @@ class Field_double :public Field_real { int store(longlong nr, bool unsigned_val); int reset(void) { bzero(ptr,sizeof(double)); return 0; } double val_real(void); - longlong val_int(void); + longlong val_int(void) { return val_int_from_real(false); } + ulonglong val_uint(void) { return (ulonglong) val_int_from_real(true); } String *val_str(String*,String *); bool send_binary(Protocol *protocol); int cmp(const uchar *,const uchar *); diff --git a/sql/filesort.cc b/sql/filesort.cc index 3f174029..7f7407fc 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -998,7 +998,8 @@ static void make_sortkey(register Sort_param *param, if (maybe_null) *to++=1; char *tmp_buffer= param->tmp_buffer ? param->tmp_buffer : (char*)to; - String tmp(tmp_buffer, param->sort_length, cs); + String tmp(tmp_buffer, param->tmp_buffer ? param->sort_length : + sort_field->length, cs); String *res= item->str_result(&tmp); if (!res) { diff --git a/sql/filesort_utils.cc b/sql/filesort_utils.cc index 370a4e65..1e0cf096 100644 --- a/sql/filesort_utils.cc +++ b/sql/filesort_utils.cc @@ -96,7 +96,7 @@ uchar **Filesort_buffer::alloc_sort_buffer(uint num_records, uint record_length) if (m_idx_array.is_null()) { - sort_buff_sz= num_records * (record_length + sizeof(uchar*)); + sort_buff_sz= ((size_t)num_records) * (record_length + sizeof(uchar*)); set_if_bigger(sort_buff_sz, record_length * MERGEBUFF2); uchar **sort_keys= (uchar**) my_malloc(sort_buff_sz, MYF(MY_THREAD_SPECIFIC)); diff --git a/sql/handler.h b/sql/handler.h index 1d4dded3..68de7563 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -1764,6 +1764,13 @@ struct HA_CREATE_INFO: public Table_scope_and_contents_source_st, used_fields|= (HA_CREATE_USED_CHARSET | HA_CREATE_USED_DEFAULT_CHARSET); return false; } + ulong table_options_with_row_type() + { + if (row_type == ROW_TYPE_DYNAMIC || row_type == ROW_TYPE_PAGE) + return table_options | HA_OPTION_PACK_RECORD; + else + return table_options; + } }; diff --git a/sql/item.cc b/sql/item.cc index 8c64a10c..97bd15b6 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -4623,7 +4623,8 @@ resolve_ref_in_select_and_group(THD *thd, Item_ident *ref, SELECT_LEX *select) if (thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY && select->having_fix_field && - select_ref != not_found_item && !group_by_ref) + select_ref != not_found_item && !group_by_ref && + !ref->alias_name_used) { /* Report the error if fields was found only in the SELECT item list and diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index fcb78ca0..c7e95773 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -1849,6 +1849,19 @@ bool Item_func_opt_neg::eq(const Item *item, bool binary_cmp) const } +bool Item_func_interval::fix_fields(THD *thd, Item **ref) +{ + if (Item_int_func::fix_fields(thd, ref)) + return true; + for (uint i= 0 ; i < row->cols(); i++) + { + if (row->element_index(i)->check_cols(1)) + return true; + } + return false; +} + + void Item_func_interval::fix_length_and_dec() { uint rows= row->cols(); @@ -6890,7 +6903,7 @@ longlong Item_func_dyncol_exists::val_int() null_value= 1; return 1; } - if (my_charset_same(nm->charset(), &my_charset_utf8_general_ci)) + if (my_charset_same(nm->charset(), DYNCOL_UTF)) { buf.str= (char *) nm->ptr(); buf.length= nm->length(); @@ -6900,11 +6913,11 @@ longlong Item_func_dyncol_exists::val_int() uint strlen; uint dummy_errors; buf.str= (char *)sql_alloc((strlen= nm->length() * - my_charset_utf8_general_ci.mbmaxlen + 1)); + DYNCOL_UTF->mbmaxlen + 1)); if (buf.str) { buf.length= - copy_and_convert(buf.str, strlen, &my_charset_utf8_general_ci, + copy_and_convert(buf.str, strlen, DYNCOL_UTF, nm->ptr(), nm->length(), nm->charset(), &dummy_errors); } diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index cc336289..361e4b35 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -878,6 +878,7 @@ class Item_func_interval :public Item_int_func { allowed_arg_cols= 0; // Fetch this value from first argument } + bool fix_fields(THD *, Item **); longlong val_int(); void fix_length_and_dec(); const char *func_name() const { return "interval"; } diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index a89c51ad..04927f88 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -2849,6 +2849,20 @@ String *Item_func_make_set::val_str(String *str) } +void Item_func_char::print(String *str, enum_query_type query_type) +{ + str->append(Item_func_char::func_name()); + str->append('('); + print_args(str, 0, query_type); + if (collation.collation != &my_charset_bin) + { + str->append(C_STRING_WITH_LEN(" using ")); + str->append(collation.collation->csname); + } + str->append(')'); +} + + String *Item_func_char::val_str(String *str) { DBUG_ASSERT(fixed == 1); @@ -4414,7 +4428,7 @@ bool Item_func_dyncol_create::prepare_arguments(bool force_names_arg) if (res) { // guaranty UTF-8 string for names - if (my_charset_same(res->charset(), &my_charset_utf8_general_ci)) + if (my_charset_same(res->charset(), DYNCOL_UTF)) { keys_str[i].length= res->length(); keys_str[i].str= sql_strmake(res->ptr(), res->length()); @@ -4425,11 +4439,11 @@ bool Item_func_dyncol_create::prepare_arguments(bool force_names_arg) uint dummy_errors; char *str= (char *)sql_alloc((strlen= res->length() * - my_charset_utf8_general_ci.mbmaxlen + 1)); + DYNCOL_UTF->mbmaxlen + 1)); if (str) { keys_str[i].length= - copy_and_convert(str, strlen, &my_charset_utf8_general_ci, + copy_and_convert(str, strlen, DYNCOL_UTF, res->ptr(), res->length(), res->charset(), &dummy_errors); keys_str[i].str= str; @@ -4648,9 +4662,10 @@ String *Item_func_dyncol_json::val_str(String *str) char *ptr; size_t length, alloc_length; dynstr_reassociate(&json, &ptr, &length, &alloc_length); - str->reset(ptr, length, alloc_length, &my_charset_utf8_general_ci); + str->reset(ptr, length, alloc_length, DYNCOL_UTF); null_value= FALSE; } + str->set_charset(DYNCOL_UTF); return str; null: @@ -4748,7 +4763,7 @@ bool Item_dyncol_get::get_dyn_value(DYNAMIC_COLUMN_VALUE *val, String *tmp) return 1; } - if (my_charset_same(nm->charset(), &my_charset_utf8_general_ci)) + if (my_charset_same(nm->charset(), DYNCOL_UTF)) { buf.str= (char *) nm->ptr(); buf.length= nm->length(); @@ -4758,11 +4773,11 @@ bool Item_dyncol_get::get_dyn_value(DYNAMIC_COLUMN_VALUE *val, String *tmp) uint strlen; uint dummy_errors; buf.str= (char *)sql_alloc((strlen= nm->length() * - my_charset_utf8_general_ci.mbmaxlen + 1)); + DYNCOL_UTF->mbmaxlen + 1)); if (buf.str) { buf.length= - copy_and_convert(buf.str, strlen, &my_charset_utf8_general_ci, + copy_and_convert(buf.str, strlen, DYNCOL_UTF, nm->ptr(), nm->length(), nm->charset(), &dummy_errors); } @@ -5201,7 +5216,6 @@ String *Item_func_dyncol_list::val_str(String *str) goto null; str->length(0); - str->set_charset(&my_charset_utf8_general_ci); for (i= 0; i < count; i++) { append_identifier(current_thd, str, names[i].str, names[i].length); @@ -5211,6 +5225,7 @@ String *Item_func_dyncol_list::val_str(String *str) null_value= FALSE; if (names) my_free(names); + str->set_charset(DYNCOL_UTF); return str; null: diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 95eac328..467e2bd5 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -784,6 +784,7 @@ class Item_func_char :public Item_str_func max_length= arg_count * 4; } const char *func_name() const { return "char"; } + void print(String *str, enum_query_type query_type); }; @@ -1283,14 +1284,14 @@ class Item_func_dyncol_add: public Item_func_dyncol_create class Item_func_dyncol_json: public Item_str_func { public: - Item_func_dyncol_json(THD *thd, Item *str): Item_str_func(thd, str) {} + Item_func_dyncol_json(THD *thd, Item *str): Item_str_func(thd, str) + {collation.set(DYNCOL_UTF);} const char *func_name() const{ return "column_json"; } String *val_str(String *); void fix_length_and_dec() { max_length= MAX_BLOB_WIDTH; maybe_null= 1; - collation.set(&my_charset_bin); decimals= 0; } }; @@ -1323,7 +1324,8 @@ class Item_dyncol_get: public Item_str_func class Item_func_dyncol_list: public Item_str_func { public: - Item_func_dyncol_list(THD *thd, Item *str): Item_str_func(thd, str) {}; + Item_func_dyncol_list(THD *thd, Item *str): Item_str_func(thd, str) + {collation.set(DYNCOL_UTF);} void fix_length_and_dec() { maybe_null= 1; max_length= MAX_BLOB_WIDTH; }; const char *func_name() const{ return "column_list"; } String *val_str(String *); diff --git a/sql/item_sum.cc b/sql/item_sum.cc index 1a4fe3b0..0e2e9f07 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -3594,7 +3594,7 @@ void Item_func_group_concat::print(String *str, enum_query_type query_type) } } str->append(STRING_WITH_LEN(" separator \'")); - str->append(*separator); + str->append_for_single_quote(separator->ptr(), separator->length()); str->append(STRING_WITH_LEN("\')")); } diff --git a/sql/lex.h b/sql/lex.h index 85bd20a5..6a1cb665 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -179,6 +179,7 @@ static SYMBOL symbols[] = { { "DELAYED", SYM(DELAYED_SYM)}, { "DELAY_KEY_WRITE", SYM(DELAY_KEY_WRITE_SYM)}, { "DELETE", SYM(DELETE_SYM)}, + { "DELETE_DOMAIN_ID", SYM(DELETE_DOMAIN_ID_SYM)}, { "DESC", SYM(DESC)}, { "DESCRIBE", SYM(DESCRIBE)}, { "DES_KEY_FILE", SYM(DES_KEY_FILE)}, diff --git a/sql/log.cc b/sql/log.cc index a9f486d8..07d4074c 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -6622,6 +6622,120 @@ void MYSQL_BIN_LOG::checkpoint_and_purge(ulong binlog_id) purge(); } + +/** + Searches for the first (oldest) binlog file name in in the binlog index. + + @param[in,out] buf_arg pointer to a buffer to hold found + the first binary log file name + @return NULL on success, otherwise error message +*/ +static const char* get_first_binlog(char* buf_arg) +{ + IO_CACHE *index_file; + size_t length; + char fname[FN_REFLEN]; + const char* errmsg= NULL; + + DBUG_ENTER("get_first_binlog"); + + DBUG_ASSERT(mysql_bin_log.is_open()); + + mysql_bin_log.lock_index(); + + index_file=mysql_bin_log.get_index_file(); + if (reinit_io_cache(index_file, READ_CACHE, (my_off_t) 0, 0, 0)) + { + errmsg= "failed to create a cache on binlog index"; + goto end; + } + /* The file ends with EOF or empty line */ + if ((length=my_b_gets(index_file, fname, sizeof(fname))) <= 1) + { + errmsg= "empty binlog index"; + goto end; + } + else + { + fname[length-1]= 0; // Remove end \n + } + if (normalize_binlog_name(buf_arg, fname, false)) + { + errmsg= "cound not normalize the first file name in the binlog index"; + goto end; + } +end: + mysql_bin_log.unlock_index(); + + DBUG_RETURN(errmsg); +} + +/** + Check weather the gtid binlog state can safely remove gtid + domains passed as the argument. A safety condition is satisfied when + there are no events from the being deleted domains in the currently existing + binlog files. Upon successful check the supplied domains are removed + from @@gtid_binlog_state. The caller is supposed to rotate binlog so that + the active latest file won't have the deleted domains in its Gtid_list header. + + @param domain_drop_lex gtid domain id sequence from lex. + Passed as a pointer to dynamic array must be not empty + unless pointer value NULL. + @retval zero on success + @retval > 0 ineffective call none from the *non* empty + gtid domain sequence is deleted + @retval < 0 on error +*/ +static int do_delete_gtid_domain(DYNAMIC_ARRAY *domain_drop_lex) +{ + int rc= 0; + Gtid_list_log_event *glev= NULL; + char buf[FN_REFLEN]; + File file; + IO_CACHE cache; + const char* errmsg= NULL; + char errbuf[MYSQL_ERRMSG_SIZE]= {0}; + + if (!domain_drop_lex) + return 0; // still "effective" having empty domain sequence to delete + + DBUG_ASSERT(domain_drop_lex->elements > 0); + mysql_mutex_assert_owner(mysql_bin_log.get_log_lock()); + + if ((errmsg= get_first_binlog(buf)) != NULL) + goto end; + bzero((char*) &cache, sizeof(cache)); + if ((file= open_binlog(&cache, buf, &errmsg)) == (File) -1) + goto end; + errmsg= get_gtid_list_event(&cache, &glev); + end_io_cache(&cache); + mysql_file_close(file, MYF(MY_WME)); + + DBUG_EXECUTE_IF("inject_binlog_delete_domain_init_error", + errmsg= "injected error";); + if (errmsg) + goto end; + errmsg= rpl_global_gtid_binlog_state.drop_domain(domain_drop_lex, + glev, errbuf); + +end: + if (errmsg) + { + if (strlen(errmsg) > 0) + { + my_error(ER_BINLOG_CANT_DELETE_GTID_DOMAIN, MYF(0), errmsg); + rc= -1; + } + else + { + rc= 1; + } + } + delete glev; + + return rc; +} + /** The method is a shortcut of @c rotate() and @c purge(). LOCK_log is acquired prior to rotate and is released after it. @@ -6631,9 +6745,10 @@ void MYSQL_BIN_LOG::checkpoint_and_purge(ulong binlog_id) @retval nonzero - error in rotating routine. */ -int MYSQL_BIN_LOG::rotate_and_purge(bool force_rotate) +int MYSQL_BIN_LOG::rotate_and_purge(bool force_rotate, + DYNAMIC_ARRAY *domain_drop_lex) { - int error= 0; + int err_gtid=0, error= 0; ulong prev_binlog_id; DBUG_ENTER("MYSQL_BIN_LOG::rotate_and_purge"); bool check_purge= false; @@ -6641,7 +6756,14 @@ int MYSQL_BIN_LOG::rotate_and_purge(bool force_rotate) //todo: fix the macro def and restore safe_mutex_assert_not_owner(&LOCK_log); mysql_mutex_lock(&LOCK_log); prev_binlog_id= current_binlog_id; - if ((error= rotate(force_rotate, &check_purge))) + + if ((err_gtid= do_delete_gtid_domain(domain_drop_lex))) + { + // inffective attempt to delete merely skips rotate and purge + if (err_gtid < 0) + error= 1; // otherwise error is propagated the user + } + else if ((error= rotate(force_rotate, &check_purge))) check_purge= false; /* NOTE: Run purge_logs wo/ holding LOCK_log because it does not need @@ -7043,8 +7165,15 @@ MYSQL_BIN_LOG::write_transaction_to_binlog(THD *thd, mode. Also, do not write the cached updates to binlog if binary logging is disabled (log-bin/sql_log_bin). */ - if (wsrep_emulate_bin_log || !(thd->variables.option_bits & OPTION_BIN_LOG)) + if (wsrep_emulate_bin_log) + { DBUG_RETURN(0); + } + else if (!(thd->variables.option_bits & OPTION_BIN_LOG)) + { + cache_mngr->need_unlog= false; + DBUG_RETURN(0); + } entry.thd= thd; entry.cache_mngr= cache_mngr; @@ -9367,11 +9496,19 @@ TC_LOG_BINLOG::log_and_order(THD *thd, my_xid xid, bool all, if (err) DBUG_RETURN(0); + + bool need_unlog= cache_mngr->need_unlog; + /* + The transaction won't need the flag anymore. + Todo/fixme: consider to move the statement into cache_mngr->reset() + relocated to the current or later point. + */ + cache_mngr->need_unlog= false; /* If using explicit user XA, we will not have XID. We must still return a non-zero cookie (as zero cookie signals error). */ - if (!xid || !cache_mngr->need_unlog) + if (!xid || !need_unlog) DBUG_RETURN(BINLOG_COOKIE_DUMMY(cache_mngr->delayed_error)); else DBUG_RETURN(BINLOG_COOKIE_MAKE(cache_mngr->binlog_id, @@ -9444,6 +9581,9 @@ TC_LOG_BINLOG::mark_xid_done(ulong binlog_id, bool write_checkpoint) if (b->binlog_id == binlog_id) { --b->xid_count; + + DBUG_ASSERT(b->xid_count >= 0); // catch unmatched (++) decrement + break; } first= false; @@ -10219,6 +10359,73 @@ TC_LOG_BINLOG::set_status_variables(THD *thd) } } + +/* + Find the Gtid_list_log_event at the start of a binlog. + + NULL for ok, non-NULL error message for error. + + If ok, then the event is returned in *out_gtid_list. This can be NULL if we + get back to binlogs written by old server version without GTID support. If + so, it means we have reached the point to start from, as no GTID events can + exist in earlier binlogs. +*/ +const char * +get_gtid_list_event(IO_CACHE *cache, Gtid_list_log_event **out_gtid_list) +{ + Format_description_log_event init_fdle(BINLOG_VERSION); + Format_description_log_event *fdle; + Log_event *ev; + const char *errormsg = NULL; + + *out_gtid_list= NULL; + + if (!(ev= Log_event::read_log_event(cache, 0, &init_fdle, + opt_master_verify_checksum)) || + ev->get_type_code() != FORMAT_DESCRIPTION_EVENT) + { + if (ev) + delete ev; + return "Could not read format description log event while looking for " + "GTID position in binlog"; + } + + fdle= static_cast(ev); + + for (;;) + { + Log_event_type typ; + + ev= Log_event::read_log_event(cache, 0, fdle, opt_master_verify_checksum); + if (!ev) + { + errormsg= "Could not read GTID list event while looking for GTID " + "position in binlog"; + break; + } + typ= ev->get_type_code(); + if (typ == GTID_LIST_EVENT) + break; /* Done, found it */ + if (typ == START_ENCRYPTION_EVENT) + { + if (fdle->start_decryption((Start_encryption_log_event*) ev)) + errormsg= "Could not set up decryption for binlog."; + } + delete ev; + if (typ == ROTATE_EVENT || typ == STOP_EVENT || + typ == FORMAT_DESCRIPTION_EVENT || typ == START_ENCRYPTION_EVENT) + continue; /* Continue looking */ + + /* We did not find any Gtid_list_log_event, must be old binlog. */ + ev= NULL; + break; + } + + delete fdle; + *out_gtid_list= static_cast(ev); + return errormsg; +} + struct st_mysql_storage_engine binlog_storage_engine= { MYSQL_HANDLERTON_INTERFACE_VERSION }; diff --git a/sql/log.h b/sql/log.h index bf076fae..3026ca11 100644 --- a/sql/log.h +++ b/sql/log.h @@ -755,7 +755,7 @@ class MYSQL_BIN_LOG: public TC_LOG, private MYSQL_LOG int update_log_index(LOG_INFO* linfo, bool need_update_threads); int rotate(bool force_rotate, bool* check_purge); void checkpoint_and_purge(ulong binlog_id); - int rotate_and_purge(bool force_rotate); + int rotate_and_purge(bool force_rotate, DYNAMIC_ARRAY* drop_gtid_domain= NULL); /** Flush binlog cache and synchronize to disk. @@ -1165,4 +1165,9 @@ static inline TC_LOG *get_tc_log_implementation() return &tc_log_mmap; } + +class Gtid_list_log_event; +const char * +get_gtid_list_event(IO_CACHE *cache, Gtid_list_log_event **out_gtid_list); + #endif /* LOG_H */ diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 8b7fdd2f..227c3eb6 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -3542,8 +3542,6 @@ void my_message_sql(uint error, const char *str, myf MyFlags) extern "C" void *my_str_malloc_mysqld(size_t size); -extern "C" void my_str_free_mysqld(void *ptr); -extern "C" void *my_str_realloc_mysqld(void *ptr, size_t size); void *my_str_malloc_mysqld(size_t size) { @@ -3551,17 +3549,6 @@ void *my_str_malloc_mysqld(size_t size) } -void my_str_free_mysqld(void *ptr) -{ - my_free(ptr); -} - -void *my_str_realloc_mysqld(void *ptr, size_t size) -{ - return my_realloc(ptr, size, MYF(MY_FAE)); -} - - #ifdef __WIN__ pthread_handler_t handle_shutdown(void *arg) @@ -3617,14 +3604,8 @@ check_enough_stack_size(int recurse_level) } -/* - Initialize my_str_malloc() and my_str_free() -*/ static void init_libstrings() { - my_str_malloc= &my_str_malloc_mysqld; - my_str_free= &my_str_free_mysqld; - my_str_realloc= &my_str_realloc_mysqld; #ifndef EMBEDDED_LIBRARY my_string_stack_guard= check_enough_stack_size; #endif @@ -3635,7 +3616,7 @@ ulonglong my_pcre_frame_size; static void init_pcre() { pcre_malloc= pcre_stack_malloc= my_str_malloc_mysqld; - pcre_free= pcre_stack_free= my_str_free_mysqld; + pcre_free= pcre_stack_free= my_free; pcre_stack_guard= check_enough_stack_size_slow; /* See http://pcre.org/original/doc/html/pcrestack.html */ my_pcre_frame_size= -pcre_exec(NULL, NULL, NULL, -999, -999, 0, NULL, 0); diff --git a/sql/partition_info.cc b/sql/partition_info.cc index ce9329e8..14f301e2 100644 --- a/sql/partition_info.cc +++ b/sql/partition_info.cc @@ -2743,6 +2743,24 @@ bool partition_info::fix_column_value_functions(THD *thd, DBUG_RETURN(result); } + +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. @@ -2832,6 +2850,8 @@ bool partition_info::fix_parser_data(THD *thd) part_elem= it++; List_iterator list_val_it(part_elem->list_val_list); num_elements= part_elem->list_val_list.elements; + if (!num_elements && error_if_requires_values()) + DBUG_RETURN(true); DBUG_ASSERT(part_type == RANGE_PARTITION ? num_elements == 1U : TRUE); for (j= 0; j < num_elements; j++) diff --git a/sql/partition_info.h b/sql/partition_info.h index ec7374b3..b271ff08 100644 --- a/sql/partition_info.h +++ b/sql/partition_info.h @@ -368,6 +368,7 @@ class partition_info : public Sql_alloc bool *prune_needs_default_values, MY_BITMAP *used_partitions); bool has_same_partitioning(partition_info *new_part_info); + bool error_if_requires_values() const; private: static int list_part_cmp(const void* a, const void* b); bool set_up_default_partitions(handler *file, HA_CREATE_INFO *info, diff --git a/sql/rpl_gtid.cc b/sql/rpl_gtid.cc index 51df8f1a..7b1acf17 100644 --- a/sql/rpl_gtid.cc +++ b/sql/rpl_gtid.cc @@ -26,7 +26,7 @@ #include "key.h" #include "rpl_gtid.h" #include "rpl_rli.h" - +#include "log_event.h" const LEX_STRING rpl_gtid_slave_state_table_name= { C_STRING_WITH_LEN("gtid_slave_pos") }; @@ -1728,6 +1728,155 @@ rpl_binlog_state::append_state(String *str) return res; } +/** + Remove domains supplied by the first argument from binlog state. + Removal is done for any domain whose last gtids (from all its servers) match + ones in Gtid list event of the 2nd argument. + + @param ids gtid domain id sequence, may contain dups + @param glev pointer to Gtid list event describing + the match condition + @param errbuf [out] pointer to possible error message array + + @retval NULL as success when at least one domain is removed + @retval "" empty string to indicate ineffective call + when no domains removed + @retval NOT EMPTY string otherwise an error message +*/ +const char* +rpl_binlog_state::drop_domain(DYNAMIC_ARRAY *ids, + Gtid_list_log_event *glev, + char* errbuf) +{ + DYNAMIC_ARRAY domain_unique; // sequece (unsorted) of unique element*:s + rpl_binlog_state::element* domain_unique_buffer[16]; + ulong k, l; + const char* errmsg= NULL; + + DBUG_ENTER("rpl_binlog_state::drop_domain"); + + my_init_dynamic_array2(&domain_unique, + sizeof(element*), domain_unique_buffer, + sizeof(domain_unique_buffer) / sizeof(element*), 4, 0); + + mysql_mutex_lock(&LOCK_binlog_state); + + /* + Gtid list is supposed to come from a binlog's Gtid_list event and + therefore should be a subset of the current binlog state. That is + for every domain in the list the binlog state contains a gtid with + sequence number not less than that of the list. + Exceptions of this inclusion rule are: + A. the list may still refer to gtids from already deleted domains. + Files containing them must have been purged whereas the file + with the list is not yet. + B. out of order groups were injected + C. manually build list of binlog files violating the inclusion + constraint. + While A is a normal case (not necessarily distinguishable from C though), + B and C may require the user's attention so any (incl the A's suspected) + inconsistency is diagnosed and *warned*. + */ + for (l= 0, errbuf[0]= 0; l < glev->count; l++, errbuf[0]= 0) + { + rpl_gtid* rb_state_gtid= find_nolock(glev->list[l].domain_id, + glev->list[l].server_id); + if (!rb_state_gtid) + sprintf(errbuf, + "missing gtids from the '%u-%u' domain-server pair which is " + "referred to in the gtid list describing an earlier state. Ignore " + "if the domain ('%u') was already explicitly deleted", + glev->list[l].domain_id, glev->list[l].server_id, + glev->list[l].domain_id); + else if (rb_state_gtid->seq_no < glev->list[l].seq_no) + sprintf(errbuf, + "having a gtid '%u-%u-%llu' which is less than " + "the '%u-%u-%llu' of the gtid list describing an earlier state. " + "The state may have been affected by manually injecting " + "a lower sequence number gtid or via replication", + rb_state_gtid->domain_id, rb_state_gtid->server_id, + rb_state_gtid->seq_no, glev->list[l].domain_id, + glev->list[l].server_id, glev->list[l].seq_no); + if (strlen(errbuf)) // use strlen() as cheap flag + push_warning_printf(current_thd, Sql_condition::WARN_LEVEL_WARN, + ER_BINLOG_CANT_DELETE_GTID_DOMAIN, + "The current gtid binlog state is incompatible with " + "a former one %s.", errbuf); + } + + /* + For each domain_id from ids + when no such domain in binlog state + warn && continue + For each domain.server's last gtid + when not locate the last gtid in glev.list + error out binlog state can't change + otherwise continue + */ + for (ulong i= 0; i < ids->elements; i++) + { + rpl_binlog_state::element *elem= NULL; + ulong *ptr_domain_id; + bool not_match; + + ptr_domain_id= (ulong*) dynamic_array_ptr(ids, i); + elem= (rpl_binlog_state::element *) + my_hash_search(&hash, (const uchar *) ptr_domain_id, 0); + if (!elem) + { + push_warning_printf(current_thd, Sql_condition::WARN_LEVEL_WARN, + ER_BINLOG_CANT_DELETE_GTID_DOMAIN, + "The gtid domain being deleted ('%lu') is not in " + "the current binlog state", *ptr_domain_id); + continue; + } + + for (not_match= true, k= 0; k < elem->hash.records; k++) + { + rpl_gtid *d_gtid= (rpl_gtid *)my_hash_element(&elem->hash, k); + for (ulong l= 0; l < glev->count && not_match; l++) + not_match= !(*d_gtid == glev->list[l]); + } + + if (not_match) + { + sprintf(errbuf, "binlog files may contain gtids from the domain ('%lu') " + "being deleted. Make sure to first purge those files", + *ptr_domain_id); + errmsg= errbuf; + goto end; + } + // compose a sequence of unique pointers to domain object + for (k= 0; k < domain_unique.elements; k++) + { + if ((rpl_binlog_state::element*) dynamic_array_ptr(&domain_unique, k) + == elem) + break; // domain_id's elem has been already in + } + if (k == domain_unique.elements) // proven not to have duplicates + insert_dynamic(&domain_unique, (uchar*) &elem); + } + + // Domain removal from binlog state + for (k= 0; k < domain_unique.elements; k++) + { + rpl_binlog_state::element *elem= *(rpl_binlog_state::element**) + dynamic_array_ptr(&domain_unique, k); + my_hash_free(&elem->hash); + my_hash_delete(&hash, (uchar*) elem); + } + + DBUG_ASSERT(strlen(errbuf) == 0); + + if (domain_unique.elements == 0) + errmsg= ""; + +end: + mysql_mutex_unlock(&LOCK_binlog_state); + delete_dynamic(&domain_unique); + + DBUG_RETURN(errmsg); +} slave_connection_state::slave_connection_state() { diff --git a/sql/rpl_gtid.h b/sql/rpl_gtid.h index ece6effb..79d566bd 100644 --- a/sql/rpl_gtid.h +++ b/sql/rpl_gtid.h @@ -34,6 +34,13 @@ struct rpl_gtid uint64 seq_no; }; +inline bool operator==(const rpl_gtid& lhs, const rpl_gtid& rhs) +{ + return + lhs.domain_id == rhs.domain_id && + lhs.server_id == rhs.server_id && + lhs.seq_no == rhs.seq_no; +}; enum enum_gtid_skip_type { GTID_SKIP_NOT, GTID_SKIP_STANDALONE, GTID_SKIP_TRANSACTION @@ -93,6 +100,7 @@ struct gtid_waiting { class Relay_log_info; struct rpl_group_info; +class Gtid_list_log_event; /* Replication slave state. @@ -256,6 +264,7 @@ struct rpl_binlog_state rpl_gtid *find_nolock(uint32 domain_id, uint32 server_id); rpl_gtid *find(uint32 domain_id, uint32 server_id); rpl_gtid *find_most_recent(uint32 domain_id); + const char* drop_domain(DYNAMIC_ARRAY *ids, Gtid_list_log_event *glev, char*); }; diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index d335b0b4..52be5e14 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -1732,32 +1732,32 @@ ER_WRONG_AUTO_KEY 42000 S1009 spa "Puede ser solamente un campo automatico y este debe ser definido como una clave" swe "Det får finnas endast ett AUTO_INCREMENT-fält och detta måste vara en nyckel" ukr "Невірне визначення таблиці; Може бути лише один автоматичний стовбець, що повинен бути визначений як ключ" -ER_UNUSED_9 - eng "You should never see it" +ER_BINLOG_CANT_DELETE_GTID_DOMAIN + eng "Could not delete gtid domain. Reason: %s." ER_NORMAL_SHUTDOWN - cze "%s: normální ukončení\n" - dan "%s: Normal nedlukning\n" - nla "%s: Normaal afgesloten \n" - eng "%s: Normal shutdown\n" - est "%s: MariaDB lõpetas\n" - fre "%s: Arrêt normal du serveur\n" - ger "%s: Normal heruntergefahren\n" - greek "%s: Φυσιολογική διαδικασία shutdown\n" - hun "%s: Normal leallitas\n" - ita "%s: Shutdown normale\n" - jpn "%s: 通常シャットダウン\n" - kor "%s: 정상적인 shutdown\n" - nor "%s: Normal avslutning\n" - norwegian-ny "%s: Normal nedkopling\n" - pol "%s: Standardowe zakończenie działania\n" - por "%s: 'Shutdown' normal\n" - rum "%s: Terminare normala\n" - rus "%s: Корректная остановка\n" - serbian "%s: Normalno gašenje\n" - slo "%s: normálne ukončenie\n" - spa "%s: Apagado normal\n" - swe "%s: Normal avslutning\n" - ukr "%s: Нормальне завершення\n" + cze "%s: norm-Bální ukončení" + dan "%s: Normal nedlukning" + nla "%s: Normaal afgesloten" + eng "%s: Normal shutdown" + est "%s: MariaDB lõpetas" + fre "%s: Arrêt normal du serveur" + ger "%s: Normal heruntergefahren" + greek "%s: Φυσιολογική διαδικασία shutdown" + hun "%s: Normal leallitas" + ita "%s: Shutdown normale" + jpn "%s: 通常シャットダウン" + kor "%s: 정상적인 shutdown" + nor "%s: Normal avslutning" + norwegian-ny "%s: Normal nedkopling" + pol "%s: Standardowe zakończenie działania" + por "%s: 'Shutdown' normal" + rum "%s: Terminare normala" + rus "%s: Корректная остановка" + serbian "%s: Normalno gašenje" + slo "%s: normálne ukončenie" + spa "%s: Apagado normal" + swe "%s: Normal avslutning" + ukr "%s: Нормальне завершення" ER_GOT_SIGNAL cze "%s: přijat signal %d, končím\n" dan "%s: Fangede signal %d. Afslutter!!\n" @@ -7118,7 +7118,7 @@ ER_SUBQUERIES_NOT_SUPPORTED 42000 eng "%s does not support subqueries or stored functions." ER_SET_STATEMENT_NOT_SUPPORTED 42000 eng "The system variable %.200s cannot be set in SET STATEMENT." -ER_UNUSED_17 +ER_UNUSED_9 eng "You should never see it" ER_USER_CREATE_EXISTS eng "Can't create user '%-.64s'@'%-.64s'; it already exists" diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 257a1d36..eceebd1d 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -1136,6 +1136,19 @@ sp_head::execute(THD *thd, bool merge_da_on_success) if (check_stack_overrun(thd, 7 * STACK_MIN_SIZE, (uchar*)&old_packet)) DBUG_RETURN(TRUE); + /* + Normally the counter is not reset between parsing and first execution, + but it is possible in case of error to have parsing on one CALL and + first execution (where VIEW will be parsed and added). So we store the + counter after parsing and restore it before execution just to avoid + repeating SELECT numbers. + + Other problem is that it can be more SELECTs parsed in case of fixing + error causes previous interruption of the SP. So it is save not just + assign old value but add it. + */ + thd->select_number+= m_select_number; + /* init per-instruction memroot */ init_sql_alloc(&execute_mem_root, MEM_ROOT_BLOCK_SIZE, 0, MYF(0)); @@ -1469,6 +1482,16 @@ sp_head::execute(THD *thd, bool merge_da_on_success) m_recursion_level + 1)); m_first_instance->m_first_free_instance= this; + /* + This execution of the SP was aborted with an error (e.g. "Table not + found"). However it might still have consumed some numbers from the + thd->select_number counter. The next sp->exec() call must not use the + consumed numbers, so we remember the first free number (We know that + nobody will use it as this execution has stopped with an error). + */ + if (err_status) + set_select_number(thd->select_number); + DBUG_RETURN(err_status); } @@ -2099,26 +2122,7 @@ sp_head::execute_procedure(THD *thd, List *args) if (!err_status) { - /* - Normally the counter is not reset between parsing and first execution, - but it is possible in case of error to have parsing on one CALL and - first execution (where VIEW will be parsed and added). So we store the - counter after parsing and restore it before execution just to avoid - repeating SELECT numbers. - */ - thd->select_number= m_select_number; - err_status= execute(thd, TRUE); - DBUG_PRINT("info", ("execute returned %d", (int) err_status)); - /* - This execution of the SP was aborted with an error (e.g. "Table not - found"). However it might still have consumed some numbers from the - thd->select_number counter. The next sp->exec() call must not use the - consumed numbers, so we remember the first free number (We know that - nobody will use it as this execution has stopped with an error). - */ - if (err_status) - set_select_number(thd->select_number); } if (save_log_general) diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 5ccc5f75..503b65f2 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -2282,37 +2282,42 @@ static void acl_insert_user(const char *user, const char *host, } -static void acl_update_db(const char *user, const char *host, const char *db, +static bool acl_update_db(const char *user, const char *host, const char *db, ulong privileges) { mysql_mutex_assert_owner(&acl_cache->lock); + bool updated= false; + for (uint i=0 ; i < acl_dbs.elements ; i++) { ACL_DB *acl_db=dynamic_element(&acl_dbs,i,ACL_DB*); if ((!acl_db->user && !user[0]) || - (acl_db->user && - !strcmp(user,acl_db->user))) + (acl_db->user && + !strcmp(user,acl_db->user))) { if ((!acl_db->host.hostname && !host[0]) || - (acl_db->host.hostname && - !strcmp(host, acl_db->host.hostname))) + (acl_db->host.hostname && + !strcmp(host, acl_db->host.hostname))) { - if ((!acl_db->db && !db[0]) || - (acl_db->db && !strcmp(db,acl_db->db))) + if ((!acl_db->db && !db[0]) || + (acl_db->db && !strcmp(db,acl_db->db))) - { - if (privileges) + { + if (privileges) { acl_db->access= privileges; acl_db->initial_access= acl_db->access; } - else - delete_dynamic_element(&acl_dbs,i); - } + else + delete_dynamic_element(&acl_dbs,i); + updated= true; + } } } } + + return updated; } @@ -3746,9 +3751,21 @@ static int replace_db_table(TABLE *table, const char *db, acl_cache->clear(1); // Clear privilege cache if (old_row_exists) acl_update_db(combo.user.str,combo.host.str,db,rights); - else - if (rights) - acl_insert_db(combo.user.str,combo.host.str,db,rights); + else if (rights) + { + /* + If we did not have an already existing row, for users, we must always + insert an ACL_DB entry. For roles however, it is possible that one was + already created when DB privileges were propagated from other granted + roles onto the current role. For this case, first try to update the + existing entry, otherwise insert a new one. + */ + if (!combo.is_role() || + !acl_update_db(combo.user.str, combo.host.str, db, rights)) + { + acl_insert_db(combo.user.str,combo.host.str,db,rights); + } + } DBUG_RETURN(0); /* This could only happen if the grant tables got corrupted */ @@ -5651,6 +5668,7 @@ static int merge_role_privileges(ACL_ROLE *role __attribute__((unused)), { PRIVS_TO_MERGE *data= (PRIVS_TO_MERGE *)context; + DBUG_ASSERT(grantee->counter > 0); if (--grantee->counter) return 1; // don't recurse into grantee just yet @@ -6743,17 +6761,14 @@ static bool grant_load(THD *thd, TABLE_LIST *tables) DBUG_RETURN(return_val); } - -static my_bool role_propagate_grants_action(void *ptr, - void *unused __attribute__((unused))) +static my_bool collect_leaf_roles(void *role_ptr, + void *roles_array) { - ACL_ROLE *role= (ACL_ROLE *)ptr; - if (role->counter) - return 0; - - mysql_mutex_assert_owner(&acl_cache->lock); - PRIVS_TO_MERGE data= { PRIVS_TO_MERGE::ALL, 0, 0 }; - traverse_role_graph_up(role, &data, NULL, merge_role_privileges); + ACL_ROLE *role= static_cast(role_ptr); + Dynamic_array *array= + static_cast *>(roles_array); + if (!role->counter) + array->push(role); return 0; } @@ -6820,7 +6835,15 @@ bool grant_reload(THD *thd) } mysql_mutex_lock(&acl_cache->lock); - my_hash_iterate(&acl_roles, role_propagate_grants_action, NULL); + Dynamic_array leaf_roles; + my_hash_iterate(&acl_roles, collect_leaf_roles, &leaf_roles); + PRIVS_TO_MERGE data= { PRIVS_TO_MERGE::ALL, 0, 0 }; + for (size_t i= 0; i < leaf_roles.elements(); i++) + { + traverse_role_graph_up(leaf_roles.at(i), &data, NULL, + merge_role_privileges); + } + mysql_mutex_unlock(&acl_cache->lock); mysql_rwlock_unlock(&LOCK_grant); @@ -9507,13 +9530,13 @@ bool mysql_create_user(THD *thd, List &list, bool handle_as_role) } } - binlog= true; if (replace_user_table(thd, tables[USER_TABLE].table, *user_name, 0, 0, 1, 0)) { append_user(thd, &wrong_users, user_name); result= TRUE; continue; } + binlog= true; // every created role is automatically granted to its creator-admin if (handle_as_role) diff --git a/sql/sql_connect.cc b/sql/sql_connect.cc index ac5b6ab2..d3ef2452 100644 --- a/sql/sql_connect.cc +++ b/sql/sql_connect.cc @@ -314,13 +314,9 @@ extern "C" void free_user(struct user_conn *uc) void init_max_user_conn(void) { #ifndef NO_EMBEDDED_ACCESS_CHECKS - if (my_hash_init(&hash_user_connections,system_charset_info,max_connections, - 0,0, (my_hash_get_key) get_key_conn, - (my_hash_free_key) free_user, 0)) - { - sql_print_error("Initializing hash_user_connections failed."); - exit(1); - } + my_hash_init(&hash_user_connections, system_charset_info, max_connections, + 0, 0, (my_hash_get_key) get_key_conn, + (my_hash_free_key) free_user, 0); #endif } @@ -479,24 +475,16 @@ void init_user_stats(USER_STATS *user_stats, void init_global_user_stats(void) { - if (my_hash_init(&global_user_stats, system_charset_info, max_connections, - 0, 0, (my_hash_get_key) get_key_user_stats, - (my_hash_free_key)free_user_stats, 0)) - { - sql_print_error("Initializing global_user_stats failed."); - exit(1); - } + my_hash_init(&global_user_stats, system_charset_info, max_connections, + 0, 0, (my_hash_get_key) get_key_user_stats, + (my_hash_free_key) free_user_stats, 0); } void init_global_client_stats(void) { - if (my_hash_init(&global_client_stats, system_charset_info, max_connections, - 0, 0, (my_hash_get_key) get_key_user_stats, - (my_hash_free_key)free_user_stats, 0)) - { - sql_print_error("Initializing global_client_stats failed."); - exit(1); - } + my_hash_init(&global_client_stats, system_charset_info, max_connections, + 0, 0, (my_hash_get_key) get_key_user_stats, + (my_hash_free_key) free_user_stats, 0); } extern "C" uchar *get_key_table_stats(TABLE_STATS *table_stats, size_t *length, @@ -513,12 +501,9 @@ extern "C" void free_table_stats(TABLE_STATS* table_stats) void init_global_table_stats(void) { - if (my_hash_init(&global_table_stats, system_charset_info, max_connections, - 0, 0, (my_hash_get_key) get_key_table_stats, - (my_hash_free_key)free_table_stats, 0)) { - sql_print_error("Initializing global_table_stats failed."); - exit(1); - } + my_hash_init(&global_table_stats, system_charset_info, max_connections, + 0, 0, (my_hash_get_key) get_key_table_stats, + (my_hash_free_key) free_table_stats, 0); } extern "C" uchar *get_key_index_stats(INDEX_STATS *index_stats, size_t *length, @@ -535,13 +520,9 @@ extern "C" void free_index_stats(INDEX_STATS* index_stats) void init_global_index_stats(void) { - if (my_hash_init(&global_index_stats, system_charset_info, max_connections, - 0, 0, (my_hash_get_key) get_key_index_stats, - (my_hash_free_key)free_index_stats, 0)) - { - sql_print_error("Initializing global_index_stats failed."); - exit(1); - } + my_hash_init(&global_index_stats, system_charset_info, max_connections, + 0, 0, (my_hash_get_key) get_key_index_stats, + (my_hash_free_key) free_index_stats, 0); } diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 8edd9b3f..63ab6b5d 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -800,6 +800,7 @@ void lex_end_stage2(LEX *lex) /* Reset LEX_MASTER_INFO */ lex->mi.reset(lex->sql_command == SQLCOM_CHANGE_MASTER); + delete_dynamic(&lex->delete_gtid_domain); DBUG_VOID_RETURN; } @@ -2878,6 +2879,10 @@ LEX::LEX() INITIAL_LEX_PLUGIN_LIST_SIZE, 0); reset_query_tables_list(TRUE); mi.init(); + init_dynamic_array2(&delete_gtid_domain, sizeof(ulong*), + gtid_domain_static_buffer, + initial_gtid_domain_buffer_size, + initial_gtid_domain_buffer_size, 0); } diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 116ac815..b57fba08 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -2726,6 +2726,13 @@ struct LEX: public Query_tables_list */ Item *limit_rows_examined; ulonglong limit_rows_examined_cnt; + /** + Holds a set of domain_ids for deletion at FLUSH..DELETE_DOMAIN_ID + */ + DYNAMIC_ARRAY delete_gtid_domain; + static const ulong initial_gtid_domain_buffer_size= 16; + ulong gtid_domain_static_buffer[initial_gtid_domain_buffer_size]; + inline void set_limit_rows_examined() { if (limit_rows_examined) diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 7337a8ae..6084c59a 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1957,11 +1957,12 @@ bool dispatch_command(enum enum_server_command command, THD *thd, THD_STAGE_INFO(thd, stage_cleaning_up); thd->reset_query(); - thd->set_examined_row_count(0); // For processlist - thd->set_command(COM_SLEEP); /* Performance Schema Interface instrumentation, end */ MYSQL_END_STATEMENT(thd->m_statement_psi, thd->get_stmt_da()); + thd->set_examined_row_count(0); // For processlist + thd->set_command(COM_SLEEP); + thd->m_statement_psi= NULL; thd->m_digest= NULL; @@ -4564,7 +4565,6 @@ mysql_execute_command(THD *thd) if (res) break; - WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL) switch (lex->sql_command) { case SQLCOM_CREATE_EVENT: { @@ -4598,7 +4598,6 @@ mysql_execute_command(THD *thd) lex->spname->m_name); break; case SQLCOM_DROP_EVENT: - WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL) if (!(res= Events::drop_event(thd, lex->spname->m_db, lex->spname->m_name, lex->if_exists()))) @@ -5041,14 +5040,19 @@ mysql_execute_command(THD *thd) thd->print_aborted_warning(3, "RELEASE"); } #ifdef WITH_WSREP - if (WSREP(thd) && (thd->wsrep_conflict_state != NO_CONFLICT && - thd->wsrep_conflict_state != REPLAYING)) - { - DBUG_ASSERT(thd->is_error()); // the error is already issued + if (WSREP(thd)) { + + if (thd->wsrep_conflict_state == NO_CONFLICT || + thd->wsrep_conflict_state == REPLAYING) + { + my_ok(thd); + } + } else { +#endif /* WITH_WSREP */ + my_ok(thd); +#ifdef WITH_WSREP } - else #endif /* WITH_WSREP */ - my_ok(thd); break; } case SQLCOM_ROLLBACK: @@ -5085,13 +5089,16 @@ mysql_execute_command(THD *thd) if (tx_release) thd->set_killed(KILL_CONNECTION); #ifdef WITH_WSREP - if (WSREP(thd) && thd->wsrep_conflict_state != NO_CONFLICT) - { - DBUG_ASSERT(thd->is_error()); // the error is already issued + if (WSREP(thd)) { + if (thd->wsrep_conflict_state == NO_CONFLICT) { + my_ok(thd); + } + } else { +#endif /* WITH_WSREP */ + my_ok(thd); +#ifdef WITH_WSREP } - else #endif /* WITH_WSREP */ - my_ok(thd); break; } case SQLCOM_RELEASE_SAVEPOINT: @@ -5496,7 +5503,6 @@ mysql_execute_command(THD *thd) Note: SQLCOM_CREATE_VIEW also handles 'ALTER VIEW' commands as specified through the thd->lex->create_view_mode flag. */ - WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL) res= mysql_create_view(thd, first_table, thd->lex->create_view_mode); break; } @@ -5512,7 +5518,6 @@ mysql_execute_command(THD *thd) case SQLCOM_CREATE_TRIGGER: { /* Conditionally writes to binlog. */ - WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL) res= mysql_create_or_drop_trigger(thd, all_tables, 1); break; @@ -5520,7 +5525,6 @@ mysql_execute_command(THD *thd) case SQLCOM_DROP_TRIGGER: { /* Conditionally writes to binlog. */ - WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL) res= mysql_create_or_drop_trigger(thd, all_tables, 0); break; } @@ -5585,13 +5589,11 @@ mysql_execute_command(THD *thd) my_ok(thd); break; case SQLCOM_INSTALL_PLUGIN: - WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL) if (! (res= mysql_install_plugin(thd, &thd->lex->comment, &thd->lex->ident))) my_ok(thd); break; case SQLCOM_UNINSTALL_PLUGIN: - WSREP_TO_ISOLATION_BEGIN(WSREP_MYSQL_DB, NULL, NULL) if (! (res= mysql_uninstall_plugin(thd, &thd->lex->comment, &thd->lex->ident))) my_ok(thd); @@ -5720,8 +5722,9 @@ mysql_execute_command(THD *thd) if (thd->is_error() || (thd->variables.option_bits & OPTION_MASTER_SQL_ERROR)) trans_rollback_stmt(thd); #ifdef WITH_WSREP - else if (thd->spcont && + if (thd->spcont && (thd->wsrep_conflict_state == MUST_ABORT || + thd->wsrep_conflict_state == ABORTED || thd->wsrep_conflict_state == CERT_FAILURE)) { /* diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index dc5e7fe1..941182dd 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -4882,16 +4882,11 @@ uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info, my_error(ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), "LIST", "IN"); } - else if (tab_part_info->part_type == RANGE_PARTITION) - { - my_error(ER_PARTITION_REQUIRES_VALUES_ERROR, MYF(0), - "RANGE", "LESS THAN"); - } else { - DBUG_ASSERT(tab_part_info->part_type == LIST_PARTITION); - my_error(ER_PARTITION_REQUIRES_VALUES_ERROR, MYF(0), - "LIST", "IN"); + DBUG_ASSERT(tab_part_info->part_type == RANGE_PARTITION || + tab_part_info->part_type == LIST_PARTITION); + (void) tab_part_info->error_if_requires_values(); } goto err; } @@ -6831,10 +6826,7 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, lpt->part_info= part_info; lpt->alter_info= alter_info; lpt->create_info= create_info; - lpt->db_options= create_info->table_options; - if (create_info->row_type != ROW_TYPE_FIXED && - create_info->row_type != ROW_TYPE_DEFAULT) - lpt->db_options|= HA_OPTION_PACK_RECORD; + lpt->db_options= create_info->table_options_with_row_type(); lpt->table= table; lpt->key_info_buffer= 0; lpt->key_count= 0; diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index f41d1e0f..3a409773 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -2108,12 +2108,16 @@ bool mysql_install_plugin(THD *thd, const LEX_STRING *name, bool error; int argc=orig_argc; char **argv=orig_argv; + unsigned long event_class_mask[MYSQL_AUDIT_CLASS_MASK_SIZE] = + { MYSQL_AUDIT_GENERAL_CLASSMASK }; DBUG_ENTER("mysql_install_plugin"); 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) + /* need to open before acquiring LOCK_plugin or it will deadlock */ if (! (table = open_ltable(thd, &tables, TL_WRITE, MYSQL_LOCK_IGNORE_TIMEOUT))) @@ -2146,8 +2150,6 @@ bool mysql_install_plugin(THD *thd, const LEX_STRING *name, See also mysql_uninstall_plugin() and initialize_audit_plugin() */ - unsigned long event_class_mask[MYSQL_AUDIT_CLASS_MASK_SIZE] = - { MYSQL_AUDIT_GENERAL_CLASSMASK }; mysql_audit_acquire_plugins(thd, event_class_mask); mysql_mutex_lock(&LOCK_plugin); @@ -2178,6 +2180,10 @@ bool mysql_install_plugin(THD *thd, const LEX_STRING *name, if (argv) free_defaults(argv); DBUG_RETURN(error); +#ifdef WITH_WSREP +error: + DBUG_RETURN(TRUE); +#endif /* WITH_WSREP */ } @@ -2244,6 +2250,8 @@ bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name, TABLE_LIST tables; LEX_STRING dl= *dl_arg; bool error= false; + unsigned long event_class_mask[MYSQL_AUDIT_CLASS_MASK_SIZE] = + { MYSQL_AUDIT_GENERAL_CLASSMASK }; DBUG_ENTER("mysql_uninstall_plugin"); tables.init_one_table("mysql", 5, "plugin", 6, "plugin", TL_WRITE); @@ -2251,6 +2259,8 @@ 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) + /* need to open before acquiring LOCK_plugin or it will deadlock */ if (! (table= open_ltable(thd, &tables, TL_WRITE, MYSQL_LOCK_IGNORE_TIMEOUT))) DBUG_RETURN(TRUE); @@ -2276,8 +2286,6 @@ bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name, See also mysql_install_plugin() and initialize_audit_plugin() */ - unsigned long event_class_mask[MYSQL_AUDIT_CLASS_MASK_SIZE] = - { MYSQL_AUDIT_GENERAL_CLASSMASK }; mysql_audit_acquire_plugins(thd, event_class_mask); mysql_mutex_lock(&LOCK_plugin); @@ -2307,6 +2315,10 @@ bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name, mysql_mutex_unlock(&LOCK_plugin); DBUG_RETURN(error); +#ifdef WITH_WSREP +error: + DBUG_RETURN(TRUE); +#endif /* WITH_WSREP */ } diff --git a/sql/sql_reload.cc b/sql/sql_reload.cc index d68ce96d..73dd9679 100644 --- a/sql/sql_reload.cc +++ b/sql/sql_reload.cc @@ -153,7 +153,10 @@ bool reload_acl_and_cache(THD *thd, unsigned long long options, tmp_write_to_binlog= 0; if (mysql_bin_log.is_open()) { - if (mysql_bin_log.rotate_and_purge(true)) + DYNAMIC_ARRAY *drop_gtid_domain= + (thd && (thd->lex->delete_gtid_domain.elements > 0)) ? + &thd->lex->delete_gtid_domain : NULL; + if (mysql_bin_log.rotate_and_purge(true, drop_gtid_domain)) *write_to_binlog= -1; if (WSREP_ON) diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc index 764047e4..b5cca334 100644 --- a/sql/sql_repl.cc +++ b/sql/sql_repl.cc @@ -30,7 +30,7 @@ #include #include "rpl_handler.h" #include "debug_sync.h" - +#include "log.h" // get_gtid_list_event enum enum_gtid_until_state { GTID_UNTIL_NOT_DONE, @@ -875,72 +875,6 @@ get_binlog_list(MEM_ROOT *memroot) DBUG_RETURN(current_list); } -/* - Find the Gtid_list_log_event at the start of a binlog. - - NULL for ok, non-NULL error message for error. - - If ok, then the event is returned in *out_gtid_list. This can be NULL if we - get back to binlogs written by old server version without GTID support. If - so, it means we have reached the point to start from, as no GTID events can - exist in earlier binlogs. -*/ -static const char * -get_gtid_list_event(IO_CACHE *cache, Gtid_list_log_event **out_gtid_list) -{ - Format_description_log_event init_fdle(BINLOG_VERSION); - Format_description_log_event *fdle; - Log_event *ev; - const char *errormsg = NULL; - - *out_gtid_list= NULL; - - if (!(ev= Log_event::read_log_event(cache, 0, &init_fdle, - opt_master_verify_checksum)) || - ev->get_type_code() != FORMAT_DESCRIPTION_EVENT) - { - if (ev) - delete ev; - return "Could not read format description log event while looking for " - "GTID position in binlog"; - } - - fdle= static_cast(ev); - - for (;;) - { - Log_event_type typ; - - ev= Log_event::read_log_event(cache, 0, fdle, opt_master_verify_checksum); - if (!ev) - { - errormsg= "Could not read GTID list event while looking for GTID " - "position in binlog"; - break; - } - typ= ev->get_type_code(); - if (typ == GTID_LIST_EVENT) - break; /* Done, found it */ - if (typ == START_ENCRYPTION_EVENT) - { - if (fdle->start_decryption((Start_encryption_log_event*) ev)) - errormsg= "Could not set up decryption for binlog."; - } - delete ev; - if (typ == ROTATE_EVENT || typ == STOP_EVENT || - typ == FORMAT_DESCRIPTION_EVENT || typ == START_ENCRYPTION_EVENT) - continue; /* Continue looking */ - - /* We did not find any Gtid_list_log_event, must be old binlog. */ - ev= NULL; - break; - } - - delete fdle; - *out_gtid_list= static_cast(ev); - return errormsg; -} - /* Check if every GTID requested by the slave is contained in this (or a later) diff --git a/sql/sql_repl.h b/sql/sql_repl.h index e2000bbc..37acff31 100644 --- a/sql/sql_repl.h +++ b/sql/sql_repl.h @@ -82,7 +82,6 @@ int rpl_append_gtid_state(String *dest, bool use_binlog); int rpl_load_gtid_state(slave_connection_state *state, bool use_binlog); bool rpl_gtid_pos_check(THD *thd, char *str, size_t len); bool rpl_gtid_pos_update(THD *thd, char *str, size_t len); - #else struct LOAD_FILE_IO_CACHE : public IO_CACHE { }; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 24b86169..277d8370 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -4414,10 +4414,7 @@ handler *mysql_create_frm_image(THD *thd, set_table_default_charset(thd, create_info, (char*) db); - db_options= create_info->table_options; - if (create_info->row_type == ROW_TYPE_DYNAMIC || - create_info->row_type == ROW_TYPE_PAGE) - db_options|= HA_OPTION_PACK_RECORD; + db_options= create_info->table_options_with_row_type(); if (!(file= get_new_handler((TABLE_SHARE*) 0, thd->mem_root, create_info->db_type))) diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index 28e59319..0b4978b2 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -441,6 +441,7 @@ 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) { @@ -606,6 +607,10 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) my_ok(thd); DBUG_RETURN(result); +#ifdef WITH_WSREP + error: + DBUG_RETURN(true); +#endif /* WITH_WSREP */ } /** diff --git a/sql/sql_view.cc b/sql/sql_view.cc index 90c94e6a..0f088836 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -429,6 +429,8 @@ 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) + /* ignore lock specs for CREATE statement */ @@ -695,6 +697,10 @@ bool mysql_create_view(THD *thd, TABLE_LIST *views, 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 */ } diff --git a/sql/sql_yacc.cc b/sql/sql_yacc.cc index 27d63955..99944f1a 100644 --- a/sql/sql_yacc.cc +++ b/sql/sql_yacc.cc @@ -1161,513 +1161,514 @@ extern int MYSQLdebug; DELAYED_SYM = 389, DELAY_KEY_WRITE_SYM = 390, DELETE_SYM = 391, - DESC = 392, - DESCRIBE = 393, - DES_KEY_FILE = 394, - DETERMINISTIC_SYM = 395, - DIAGNOSTICS_SYM = 396, - DIRECTORY_SYM = 397, - DISABLE_SYM = 398, - DISCARD = 399, - DISK_SYM = 400, - DISTINCT = 401, - DIV_SYM = 402, - DOUBLE_SYM = 403, - DO_DOMAIN_IDS_SYM = 404, - DO_SYM = 405, - DROP = 406, - DUAL_SYM = 407, - DUMPFILE = 408, - DUPLICATE_SYM = 409, - DYNAMIC_SYM = 410, - EACH_SYM = 411, - ELSE = 412, - ELSEIF_SYM = 413, - ENABLE_SYM = 414, - ENCLOSED = 415, - END = 416, - ENDS_SYM = 417, - END_OF_INPUT = 418, - ENGINES_SYM = 419, - ENGINE_SYM = 420, - ENUM = 421, - EQUAL_SYM = 422, - ERROR_SYM = 423, - ERRORS = 424, - ESCAPED = 425, - ESCAPE_SYM = 426, - EVENTS_SYM = 427, - EVENT_SYM = 428, - EVERY_SYM = 429, - EXCHANGE_SYM = 430, - EXAMINED_SYM = 431, - EXECUTE_SYM = 432, - EXISTS = 433, - EXIT_SYM = 434, - EXPANSION_SYM = 435, - EXPORT_SYM = 436, - EXTENDED_SYM = 437, - EXTENT_SIZE_SYM = 438, - EXTRACT_SYM = 439, - FALSE_SYM = 440, - FAST_SYM = 441, - FAULTS_SYM = 442, - FETCH_SYM = 443, - FILE_SYM = 444, - FIRST_SYM = 445, - FIXED_SYM = 446, - FLOAT_NUM = 447, - FLOAT_SYM = 448, - FLUSH_SYM = 449, - FORCE_SYM = 450, - FOREIGN = 451, - FOR_SYM = 452, - FORMAT_SYM = 453, - FOUND_SYM = 454, - FROM = 455, - FULL = 456, - FULLTEXT_SYM = 457, - FUNCTION_SYM = 458, - GE = 459, - GENERAL = 460, - GENERATED_SYM = 461, - GEOMETRYCOLLECTION = 462, - GEOMETRY_SYM = 463, - GET_FORMAT = 464, - GET_SYM = 465, - GLOBAL_SYM = 466, - GRANT = 467, - GRANTS = 468, - GROUP_SYM = 469, - GROUP_CONCAT_SYM = 470, - HANDLER_SYM = 471, - HARD_SYM = 472, - HASH_SYM = 473, - HAVING = 474, - HELP_SYM = 475, - HEX_NUM = 476, - HEX_STRING = 477, - HIGH_PRIORITY = 478, - HOST_SYM = 479, - HOSTS_SYM = 480, - HOUR_MICROSECOND_SYM = 481, - HOUR_MINUTE_SYM = 482, - HOUR_SECOND_SYM = 483, - HOUR_SYM = 484, - ID_SYM = 485, - IDENT = 486, - IDENTIFIED_SYM = 487, - IDENT_QUOTED = 488, - IF_SYM = 489, - IGNORE_DOMAIN_IDS_SYM = 490, - IGNORE_SYM = 491, - IGNORE_SERVER_IDS_SYM = 492, - IMPORT = 493, - INDEXES = 494, - INDEX_SYM = 495, - INFILE = 496, - INITIAL_SIZE_SYM = 497, - INNER_SYM = 498, - INOUT_SYM = 499, - INSENSITIVE_SYM = 500, - INSERT = 501, - INSERT_METHOD = 502, - INSTALL_SYM = 503, - INTERVAL_SYM = 504, - INTO = 505, - INT_SYM = 506, - INVOKER_SYM = 507, - IN_SYM = 508, - IO_SYM = 509, - IPC_SYM = 510, - IS = 511, - ISOLATION = 512, - ISSUER_SYM = 513, - ITERATE_SYM = 514, - JOIN_SYM = 515, - KEYS = 516, - KEY_BLOCK_SIZE = 517, - KEY_SYM = 518, - KILL_SYM = 519, - LANGUAGE_SYM = 520, - LAST_SYM = 521, - LAST_VALUE = 522, - LE = 523, - LEADING = 524, - LEAVES = 525, - LEAVE_SYM = 526, - LEFT = 527, - LESS_SYM = 528, - LEVEL_SYM = 529, - LEX_HOSTNAME = 530, - LIKE = 531, - LIMIT = 532, - LINEAR_SYM = 533, - LINES = 534, - LINESTRING = 535, - LIST_SYM = 536, - LOAD = 537, - LOCAL_SYM = 538, - LOCATOR_SYM = 539, - LOCKS_SYM = 540, - LOCK_SYM = 541, - LOGFILE_SYM = 542, - LOGS_SYM = 543, - LONGBLOB = 544, - LONGTEXT = 545, - LONG_NUM = 546, - LONG_SYM = 547, - LOOP_SYM = 548, - LOW_PRIORITY = 549, - MASTER_CONNECT_RETRY_SYM = 550, - MASTER_GTID_POS_SYM = 551, - MASTER_HOST_SYM = 552, - MASTER_LOG_FILE_SYM = 553, - MASTER_LOG_POS_SYM = 554, - MASTER_PASSWORD_SYM = 555, - MASTER_PORT_SYM = 556, - MASTER_SERVER_ID_SYM = 557, - MASTER_SSL_CAPATH_SYM = 558, - MASTER_SSL_CA_SYM = 559, - MASTER_SSL_CERT_SYM = 560, - MASTER_SSL_CIPHER_SYM = 561, - MASTER_SSL_CRL_SYM = 562, - MASTER_SSL_CRLPATH_SYM = 563, - MASTER_SSL_KEY_SYM = 564, - MASTER_SSL_SYM = 565, - MASTER_SSL_VERIFY_SERVER_CERT_SYM = 566, - MASTER_SYM = 567, - MASTER_USER_SYM = 568, - MASTER_USE_GTID_SYM = 569, - MASTER_HEARTBEAT_PERIOD_SYM = 570, - MATCH = 571, - MAX_CONNECTIONS_PER_HOUR = 572, - MAX_QUERIES_PER_HOUR = 573, - MAX_ROWS = 574, - MAX_SIZE_SYM = 575, - MAX_SYM = 576, - MAX_UPDATES_PER_HOUR = 577, - MAX_STATEMENT_TIME_SYM = 578, - MAX_USER_CONNECTIONS_SYM = 579, - MAX_VALUE_SYM = 580, - MEDIUMBLOB = 581, - MEDIUMINT = 582, - MEDIUMTEXT = 583, - MEDIUM_SYM = 584, - MEMORY_SYM = 585, - MERGE_SYM = 586, - MESSAGE_TEXT_SYM = 587, - MICROSECOND_SYM = 588, - MIGRATE_SYM = 589, - MINUTE_MICROSECOND_SYM = 590, - MINUTE_SECOND_SYM = 591, - MINUTE_SYM = 592, - MIN_ROWS = 593, - MIN_SYM = 594, - MODE_SYM = 595, - MODIFIES_SYM = 596, - MODIFY_SYM = 597, - MOD_SYM = 598, - MONTH_SYM = 599, - MULTILINESTRING = 600, - MULTIPOINT = 601, - MULTIPOLYGON = 602, - MUTEX_SYM = 603, - MYSQL_SYM = 604, - MYSQL_ERRNO_SYM = 605, - NAMES_SYM = 606, - NAME_SYM = 607, - NATIONAL_SYM = 608, - NATURAL = 609, - NCHAR_STRING = 610, - NCHAR_SYM = 611, - NE = 612, - NEG = 613, - NEW_SYM = 614, - NEXT_SYM = 615, - NODEGROUP_SYM = 616, - NONE_SYM = 617, - NOT2_SYM = 618, - NOT_SYM = 619, - NOW_SYM = 620, - NO_SYM = 621, - NO_WAIT_SYM = 622, - NO_WRITE_TO_BINLOG = 623, - NULL_SYM = 624, - NUM = 625, - NUMBER_SYM = 626, - NUMERIC_SYM = 627, - NVARCHAR_SYM = 628, - OFFSET_SYM = 629, - OLD_PASSWORD_SYM = 630, - ON = 631, - ONE_SYM = 632, - ONLY_SYM = 633, - ONLINE_SYM = 634, - OPEN_SYM = 635, - OPTIMIZE = 636, - OPTIONS_SYM = 637, - OPTION = 638, - OPTIONALLY = 639, - OR2_SYM = 640, - ORDER_SYM = 641, - OR_OR_SYM = 642, - OR_SYM = 643, - OUTER = 644, - OUTFILE = 645, - OUT_SYM = 646, - OWNER_SYM = 647, - PACK_KEYS_SYM = 648, - PAGE_SYM = 649, - PAGE_CHECKSUM_SYM = 650, - PARAM_MARKER = 651, - PARSER_SYM = 652, - PARSE_VCOL_EXPR_SYM = 653, - PARTIAL = 654, - PARTITION_SYM = 655, - PARTITIONS_SYM = 656, - PARTITIONING_SYM = 657, - PASSWORD_SYM = 658, - PERSISTENT_SYM = 659, - PHASE_SYM = 660, - PLUGINS_SYM = 661, - PLUGIN_SYM = 662, - POINT_SYM = 663, - POLYGON = 664, - PORT_SYM = 665, - POSITION_SYM = 666, - PRECISION = 667, - PREPARE_SYM = 668, - PRESERVE_SYM = 669, - PREV_SYM = 670, - PRIMARY_SYM = 671, - PRIVILEGES = 672, - PROCEDURE_SYM = 673, - PROCESS = 674, - PROCESSLIST_SYM = 675, - PROFILE_SYM = 676, - PROFILES_SYM = 677, - PROXY_SYM = 678, - PURGE = 679, - QUARTER_SYM = 680, - QUERY_SYM = 681, - QUICK = 682, - RANGE_SYM = 683, - READS_SYM = 684, - READ_ONLY_SYM = 685, - READ_SYM = 686, - READ_WRITE_SYM = 687, - REAL = 688, - REBUILD_SYM = 689, - RECOVER_SYM = 690, - REDOFILE_SYM = 691, - REDO_BUFFER_SIZE_SYM = 692, - REDUNDANT_SYM = 693, - REFERENCES = 694, - REGEXP = 695, - RELAY = 696, - RELAYLOG_SYM = 697, - RELAY_LOG_FILE_SYM = 698, - RELAY_LOG_POS_SYM = 699, - RELAY_THREAD = 700, - RELEASE_SYM = 701, - RELOAD = 702, - REMOVE_SYM = 703, - RENAME = 704, - REORGANIZE_SYM = 705, - REPAIR = 706, - REPEATABLE_SYM = 707, - REPEAT_SYM = 708, - REPLACE = 709, - REPLICATION = 710, - REQUIRE_SYM = 711, - RESET_SYM = 712, - RESIGNAL_SYM = 713, - RESOURCES = 714, - RESTORE_SYM = 715, - RESTRICT = 716, - RESUME_SYM = 717, - RETURNED_SQLSTATE_SYM = 718, - RETURNING_SYM = 719, - RETURNS_SYM = 720, - RETURN_SYM = 721, - REVERSE_SYM = 722, - REVOKE = 723, - RIGHT = 724, - ROLE_SYM = 725, - ROLLBACK_SYM = 726, - ROLLUP_SYM = 727, - ROUTINE_SYM = 728, - ROWS_SYM = 729, - ROW_FORMAT_SYM = 730, - ROW_SYM = 731, - ROW_COUNT_SYM = 732, - RTREE_SYM = 733, - SAVEPOINT_SYM = 734, - SCHEDULE_SYM = 735, - SCHEMA_NAME_SYM = 736, - SECOND_MICROSECOND_SYM = 737, - SECOND_SYM = 738, - SECURITY_SYM = 739, - SELECT_SYM = 740, - SENSITIVE_SYM = 741, - SEPARATOR_SYM = 742, - SERIALIZABLE_SYM = 743, - SERIAL_SYM = 744, - SESSION_SYM = 745, - SERVER_SYM = 746, - SERVER_OPTIONS = 747, - SET = 748, - SET_VAR = 749, - SHARE_SYM = 750, - SHIFT_LEFT = 751, - SHIFT_RIGHT = 752, - SHOW = 753, - SHUTDOWN = 754, - SIGNAL_SYM = 755, - SIGNED_SYM = 756, - SIMPLE_SYM = 757, - SLAVE = 758, - SLAVES = 759, - SLAVE_POS_SYM = 760, - SLOW = 761, - SMALLINT = 762, - SNAPSHOT_SYM = 763, - SOCKET_SYM = 764, - SOFT_SYM = 765, - SONAME_SYM = 766, - SOUNDS_SYM = 767, - SOURCE_SYM = 768, - SPATIAL_SYM = 769, - SPECIFIC_SYM = 770, - SQLEXCEPTION_SYM = 771, - SQLSTATE_SYM = 772, - SQLWARNING_SYM = 773, - SQL_BIG_RESULT = 774, - SQL_BUFFER_RESULT = 775, - SQL_CACHE_SYM = 776, - SQL_CALC_FOUND_ROWS = 777, - SQL_NO_CACHE_SYM = 778, - SQL_SMALL_RESULT = 779, - SQL_SYM = 780, - SQL_THREAD = 781, - REF_SYSTEM_ID_SYM = 782, - SSL_SYM = 783, - STARTING = 784, - STARTS_SYM = 785, - START_SYM = 786, - STATEMENT_SYM = 787, - STATS_AUTO_RECALC_SYM = 788, - STATS_PERSISTENT_SYM = 789, - STATS_SAMPLE_PAGES_SYM = 790, - STATUS_SYM = 791, - STDDEV_SAMP_SYM = 792, - STD_SYM = 793, - STOP_SYM = 794, - STORAGE_SYM = 795, - STRAIGHT_JOIN = 796, - STRING_SYM = 797, - SUBCLASS_ORIGIN_SYM = 798, - SUBDATE_SYM = 799, - SUBJECT_SYM = 800, - SUBPARTITIONS_SYM = 801, - SUBPARTITION_SYM = 802, - SUBSTRING = 803, - SUM_SYM = 804, - SUPER_SYM = 805, - SUSPEND_SYM = 806, - SWAPS_SYM = 807, - SWITCHES_SYM = 808, - SYSDATE = 809, - TABLES = 810, - TABLESPACE = 811, - TABLE_REF_PRIORITY = 812, - TABLE_SYM = 813, - TABLE_CHECKSUM_SYM = 814, - TABLE_NAME_SYM = 815, - TEMPORARY = 816, - TEMPTABLE_SYM = 817, - TERMINATED = 818, - TEXT_STRING = 819, - TEXT_SYM = 820, - THAN_SYM = 821, - THEN_SYM = 822, - TIMESTAMP = 823, - TIMESTAMP_ADD = 824, - TIMESTAMP_DIFF = 825, - TIME_SYM = 826, - TINYBLOB = 827, - TINYINT = 828, - TINYTEXT = 829, - TO_SYM = 830, - TRAILING = 831, - TRANSACTION_SYM = 832, - TRANSACTIONAL_SYM = 833, - TRIGGERS_SYM = 834, - TRIGGER_SYM = 835, - TRIM = 836, - TRUE_SYM = 837, - TRUNCATE_SYM = 838, - TYPES_SYM = 839, - TYPE_SYM = 840, - UDF_RETURNS_SYM = 841, - ULONGLONG_NUM = 842, - UNCOMMITTED_SYM = 843, - UNDEFINED_SYM = 844, - UNDERSCORE_CHARSET = 845, - UNDOFILE_SYM = 846, - UNDO_BUFFER_SIZE_SYM = 847, - UNDO_SYM = 848, - UNICODE_SYM = 849, - UNINSTALL_SYM = 850, - UNION_SYM = 851, - UNIQUE_SYM = 852, - UNKNOWN_SYM = 853, - UNLOCK_SYM = 854, - UNSIGNED = 855, - UNTIL_SYM = 856, - UPDATE_SYM = 857, - UPGRADE_SYM = 858, - USAGE = 859, - USER = 860, - USE_FRM = 861, - USE_SYM = 862, - USING = 863, - UTC_DATE_SYM = 864, - UTC_TIMESTAMP_SYM = 865, - UTC_TIME_SYM = 866, - VALUES = 867, - VALUE_SYM = 868, - VARBINARY = 869, - VARCHAR = 870, - VARIABLES = 871, - VARIANCE_SYM = 872, - VARYING = 873, - VAR_SAMP_SYM = 874, - VIA_SYM = 875, - VIEW_SYM = 876, - VIRTUAL_SYM = 877, - WAIT_SYM = 878, - WARNINGS = 879, - WEEK_SYM = 880, - WEIGHT_STRING_SYM = 881, - WHEN_SYM = 882, - WHERE = 883, - WHILE_SYM = 884, - WITH = 885, - WITH_CUBE_SYM = 886, - WITH_ROLLUP_SYM = 887, - WORK_SYM = 888, - WRAPPER_SYM = 889, - WRITE_SYM = 890, - X509_SYM = 891, - XA_SYM = 892, - XML_SYM = 893, - XOR = 894, - YEAR_MONTH_SYM = 895, - YEAR_SYM = 896, - ZEROFILL = 897, - IMPOSSIBLE_ACTION = 898 + DELETE_DOMAIN_ID_SYM = 392, + DESC = 393, + DESCRIBE = 394, + DES_KEY_FILE = 395, + DETERMINISTIC_SYM = 396, + DIAGNOSTICS_SYM = 397, + DIRECTORY_SYM = 398, + DISABLE_SYM = 399, + DISCARD = 400, + DISK_SYM = 401, + DISTINCT = 402, + DIV_SYM = 403, + DOUBLE_SYM = 404, + DO_DOMAIN_IDS_SYM = 405, + DO_SYM = 406, + DROP = 407, + DUAL_SYM = 408, + DUMPFILE = 409, + DUPLICATE_SYM = 410, + DYNAMIC_SYM = 411, + EACH_SYM = 412, + ELSE = 413, + ELSEIF_SYM = 414, + ENABLE_SYM = 415, + ENCLOSED = 416, + END = 417, + ENDS_SYM = 418, + END_OF_INPUT = 419, + ENGINES_SYM = 420, + ENGINE_SYM = 421, + ENUM = 422, + EQUAL_SYM = 423, + ERROR_SYM = 424, + ERRORS = 425, + ESCAPED = 426, + ESCAPE_SYM = 427, + EVENTS_SYM = 428, + EVENT_SYM = 429, + EVERY_SYM = 430, + EXCHANGE_SYM = 431, + EXAMINED_SYM = 432, + EXECUTE_SYM = 433, + EXISTS = 434, + EXIT_SYM = 435, + EXPANSION_SYM = 436, + EXPORT_SYM = 437, + EXTENDED_SYM = 438, + EXTENT_SIZE_SYM = 439, + EXTRACT_SYM = 440, + FALSE_SYM = 441, + FAST_SYM = 442, + FAULTS_SYM = 443, + FETCH_SYM = 444, + FILE_SYM = 445, + FIRST_SYM = 446, + FIXED_SYM = 447, + FLOAT_NUM = 448, + FLOAT_SYM = 449, + FLUSH_SYM = 450, + FORCE_SYM = 451, + FOREIGN = 452, + FOR_SYM = 453, + FORMAT_SYM = 454, + FOUND_SYM = 455, + FROM = 456, + FULL = 457, + FULLTEXT_SYM = 458, + FUNCTION_SYM = 459, + GE = 460, + GENERAL = 461, + GENERATED_SYM = 462, + GEOMETRYCOLLECTION = 463, + GEOMETRY_SYM = 464, + GET_FORMAT = 465, + GET_SYM = 466, + GLOBAL_SYM = 467, + GRANT = 468, + GRANTS = 469, + GROUP_SYM = 470, + GROUP_CONCAT_SYM = 471, + HANDLER_SYM = 472, + HARD_SYM = 473, + HASH_SYM = 474, + HAVING = 475, + HELP_SYM = 476, + HEX_NUM = 477, + HEX_STRING = 478, + HIGH_PRIORITY = 479, + HOST_SYM = 480, + HOSTS_SYM = 481, + HOUR_MICROSECOND_SYM = 482, + HOUR_MINUTE_SYM = 483, + HOUR_SECOND_SYM = 484, + HOUR_SYM = 485, + ID_SYM = 486, + IDENT = 487, + IDENTIFIED_SYM = 488, + IDENT_QUOTED = 489, + IF_SYM = 490, + IGNORE_DOMAIN_IDS_SYM = 491, + IGNORE_SYM = 492, + IGNORE_SERVER_IDS_SYM = 493, + IMPORT = 494, + INDEXES = 495, + INDEX_SYM = 496, + INFILE = 497, + INITIAL_SIZE_SYM = 498, + INNER_SYM = 499, + INOUT_SYM = 500, + INSENSITIVE_SYM = 501, + INSERT = 502, + INSERT_METHOD = 503, + INSTALL_SYM = 504, + INTERVAL_SYM = 505, + INTO = 506, + INT_SYM = 507, + INVOKER_SYM = 508, + IN_SYM = 509, + IO_SYM = 510, + IPC_SYM = 511, + IS = 512, + ISOLATION = 513, + ISSUER_SYM = 514, + ITERATE_SYM = 515, + JOIN_SYM = 516, + KEYS = 517, + KEY_BLOCK_SIZE = 518, + KEY_SYM = 519, + KILL_SYM = 520, + LANGUAGE_SYM = 521, + LAST_SYM = 522, + LAST_VALUE = 523, + LE = 524, + LEADING = 525, + LEAVES = 526, + LEAVE_SYM = 527, + LEFT = 528, + LESS_SYM = 529, + LEVEL_SYM = 530, + LEX_HOSTNAME = 531, + LIKE = 532, + LIMIT = 533, + LINEAR_SYM = 534, + LINES = 535, + LINESTRING = 536, + LIST_SYM = 537, + LOAD = 538, + LOCAL_SYM = 539, + LOCATOR_SYM = 540, + LOCKS_SYM = 541, + LOCK_SYM = 542, + LOGFILE_SYM = 543, + LOGS_SYM = 544, + LONGBLOB = 545, + LONGTEXT = 546, + LONG_NUM = 547, + LONG_SYM = 548, + LOOP_SYM = 549, + LOW_PRIORITY = 550, + MASTER_CONNECT_RETRY_SYM = 551, + MASTER_GTID_POS_SYM = 552, + MASTER_HOST_SYM = 553, + MASTER_LOG_FILE_SYM = 554, + MASTER_LOG_POS_SYM = 555, + MASTER_PASSWORD_SYM = 556, + MASTER_PORT_SYM = 557, + MASTER_SERVER_ID_SYM = 558, + MASTER_SSL_CAPATH_SYM = 559, + MASTER_SSL_CA_SYM = 560, + MASTER_SSL_CERT_SYM = 561, + MASTER_SSL_CIPHER_SYM = 562, + MASTER_SSL_CRL_SYM = 563, + MASTER_SSL_CRLPATH_SYM = 564, + MASTER_SSL_KEY_SYM = 565, + MASTER_SSL_SYM = 566, + MASTER_SSL_VERIFY_SERVER_CERT_SYM = 567, + MASTER_SYM = 568, + MASTER_USER_SYM = 569, + MASTER_USE_GTID_SYM = 570, + MASTER_HEARTBEAT_PERIOD_SYM = 571, + MATCH = 572, + MAX_CONNECTIONS_PER_HOUR = 573, + MAX_QUERIES_PER_HOUR = 574, + MAX_ROWS = 575, + MAX_SIZE_SYM = 576, + MAX_SYM = 577, + MAX_UPDATES_PER_HOUR = 578, + MAX_STATEMENT_TIME_SYM = 579, + MAX_USER_CONNECTIONS_SYM = 580, + MAX_VALUE_SYM = 581, + MEDIUMBLOB = 582, + MEDIUMINT = 583, + MEDIUMTEXT = 584, + MEDIUM_SYM = 585, + MEMORY_SYM = 586, + MERGE_SYM = 587, + MESSAGE_TEXT_SYM = 588, + MICROSECOND_SYM = 589, + MIGRATE_SYM = 590, + MINUTE_MICROSECOND_SYM = 591, + MINUTE_SECOND_SYM = 592, + MINUTE_SYM = 593, + MIN_ROWS = 594, + MIN_SYM = 595, + MODE_SYM = 596, + MODIFIES_SYM = 597, + MODIFY_SYM = 598, + MOD_SYM = 599, + MONTH_SYM = 600, + MULTILINESTRING = 601, + MULTIPOINT = 602, + MULTIPOLYGON = 603, + MUTEX_SYM = 604, + MYSQL_SYM = 605, + MYSQL_ERRNO_SYM = 606, + NAMES_SYM = 607, + NAME_SYM = 608, + NATIONAL_SYM = 609, + NATURAL = 610, + NCHAR_STRING = 611, + NCHAR_SYM = 612, + NE = 613, + NEG = 614, + NEW_SYM = 615, + NEXT_SYM = 616, + NODEGROUP_SYM = 617, + NONE_SYM = 618, + NOT2_SYM = 619, + NOT_SYM = 620, + NOW_SYM = 621, + NO_SYM = 622, + NO_WAIT_SYM = 623, + NO_WRITE_TO_BINLOG = 624, + NULL_SYM = 625, + NUM = 626, + NUMBER_SYM = 627, + NUMERIC_SYM = 628, + NVARCHAR_SYM = 629, + OFFSET_SYM = 630, + OLD_PASSWORD_SYM = 631, + ON = 632, + ONE_SYM = 633, + ONLY_SYM = 634, + ONLINE_SYM = 635, + OPEN_SYM = 636, + OPTIMIZE = 637, + OPTIONS_SYM = 638, + OPTION = 639, + OPTIONALLY = 640, + OR2_SYM = 641, + ORDER_SYM = 642, + OR_OR_SYM = 643, + OR_SYM = 644, + OUTER = 645, + OUTFILE = 646, + OUT_SYM = 647, + OWNER_SYM = 648, + PACK_KEYS_SYM = 649, + PAGE_SYM = 650, + PAGE_CHECKSUM_SYM = 651, + PARAM_MARKER = 652, + PARSER_SYM = 653, + PARSE_VCOL_EXPR_SYM = 654, + PARTIAL = 655, + PARTITION_SYM = 656, + PARTITIONS_SYM = 657, + PARTITIONING_SYM = 658, + PASSWORD_SYM = 659, + PERSISTENT_SYM = 660, + PHASE_SYM = 661, + PLUGINS_SYM = 662, + PLUGIN_SYM = 663, + POINT_SYM = 664, + POLYGON = 665, + PORT_SYM = 666, + POSITION_SYM = 667, + PRECISION = 668, + PREPARE_SYM = 669, + PRESERVE_SYM = 670, + PREV_SYM = 671, + PRIMARY_SYM = 672, + PRIVILEGES = 673, + PROCEDURE_SYM = 674, + PROCESS = 675, + PROCESSLIST_SYM = 676, + PROFILE_SYM = 677, + PROFILES_SYM = 678, + PROXY_SYM = 679, + PURGE = 680, + QUARTER_SYM = 681, + QUERY_SYM = 682, + QUICK = 683, + RANGE_SYM = 684, + READS_SYM = 685, + READ_ONLY_SYM = 686, + READ_SYM = 687, + READ_WRITE_SYM = 688, + REAL = 689, + REBUILD_SYM = 690, + RECOVER_SYM = 691, + REDOFILE_SYM = 692, + REDO_BUFFER_SIZE_SYM = 693, + REDUNDANT_SYM = 694, + REFERENCES = 695, + REGEXP = 696, + RELAY = 697, + RELAYLOG_SYM = 698, + RELAY_LOG_FILE_SYM = 699, + RELAY_LOG_POS_SYM = 700, + RELAY_THREAD = 701, + RELEASE_SYM = 702, + RELOAD = 703, + REMOVE_SYM = 704, + RENAME = 705, + REORGANIZE_SYM = 706, + REPAIR = 707, + REPEATABLE_SYM = 708, + REPEAT_SYM = 709, + REPLACE = 710, + REPLICATION = 711, + REQUIRE_SYM = 712, + RESET_SYM = 713, + RESIGNAL_SYM = 714, + RESOURCES = 715, + RESTORE_SYM = 716, + RESTRICT = 717, + RESUME_SYM = 718, + RETURNED_SQLSTATE_SYM = 719, + RETURNING_SYM = 720, + RETURNS_SYM = 721, + RETURN_SYM = 722, + REVERSE_SYM = 723, + REVOKE = 724, + RIGHT = 725, + ROLE_SYM = 726, + ROLLBACK_SYM = 727, + ROLLUP_SYM = 728, + ROUTINE_SYM = 729, + ROWS_SYM = 730, + ROW_FORMAT_SYM = 731, + ROW_SYM = 732, + ROW_COUNT_SYM = 733, + RTREE_SYM = 734, + SAVEPOINT_SYM = 735, + SCHEDULE_SYM = 736, + SCHEMA_NAME_SYM = 737, + SECOND_MICROSECOND_SYM = 738, + SECOND_SYM = 739, + SECURITY_SYM = 740, + SELECT_SYM = 741, + SENSITIVE_SYM = 742, + SEPARATOR_SYM = 743, + SERIALIZABLE_SYM = 744, + SERIAL_SYM = 745, + SESSION_SYM = 746, + SERVER_SYM = 747, + SERVER_OPTIONS = 748, + SET = 749, + SET_VAR = 750, + SHARE_SYM = 751, + SHIFT_LEFT = 752, + SHIFT_RIGHT = 753, + SHOW = 754, + SHUTDOWN = 755, + SIGNAL_SYM = 756, + SIGNED_SYM = 757, + SIMPLE_SYM = 758, + SLAVE = 759, + SLAVES = 760, + SLAVE_POS_SYM = 761, + SLOW = 762, + SMALLINT = 763, + SNAPSHOT_SYM = 764, + SOCKET_SYM = 765, + SOFT_SYM = 766, + SONAME_SYM = 767, + SOUNDS_SYM = 768, + SOURCE_SYM = 769, + SPATIAL_SYM = 770, + SPECIFIC_SYM = 771, + SQLEXCEPTION_SYM = 772, + SQLSTATE_SYM = 773, + SQLWARNING_SYM = 774, + SQL_BIG_RESULT = 775, + SQL_BUFFER_RESULT = 776, + SQL_CACHE_SYM = 777, + SQL_CALC_FOUND_ROWS = 778, + SQL_NO_CACHE_SYM = 779, + SQL_SMALL_RESULT = 780, + SQL_SYM = 781, + SQL_THREAD = 782, + REF_SYSTEM_ID_SYM = 783, + SSL_SYM = 784, + STARTING = 785, + STARTS_SYM = 786, + START_SYM = 787, + STATEMENT_SYM = 788, + STATS_AUTO_RECALC_SYM = 789, + STATS_PERSISTENT_SYM = 790, + STATS_SAMPLE_PAGES_SYM = 791, + STATUS_SYM = 792, + STDDEV_SAMP_SYM = 793, + STD_SYM = 794, + STOP_SYM = 795, + STORAGE_SYM = 796, + STRAIGHT_JOIN = 797, + STRING_SYM = 798, + SUBCLASS_ORIGIN_SYM = 799, + SUBDATE_SYM = 800, + SUBJECT_SYM = 801, + SUBPARTITIONS_SYM = 802, + SUBPARTITION_SYM = 803, + SUBSTRING = 804, + SUM_SYM = 805, + SUPER_SYM = 806, + SUSPEND_SYM = 807, + SWAPS_SYM = 808, + SWITCHES_SYM = 809, + SYSDATE = 810, + TABLES = 811, + TABLESPACE = 812, + TABLE_REF_PRIORITY = 813, + TABLE_SYM = 814, + TABLE_CHECKSUM_SYM = 815, + TABLE_NAME_SYM = 816, + TEMPORARY = 817, + TEMPTABLE_SYM = 818, + TERMINATED = 819, + TEXT_STRING = 820, + TEXT_SYM = 821, + THAN_SYM = 822, + THEN_SYM = 823, + TIMESTAMP = 824, + TIMESTAMP_ADD = 825, + TIMESTAMP_DIFF = 826, + TIME_SYM = 827, + TINYBLOB = 828, + TINYINT = 829, + TINYTEXT = 830, + TO_SYM = 831, + TRAILING = 832, + TRANSACTION_SYM = 833, + TRANSACTIONAL_SYM = 834, + TRIGGERS_SYM = 835, + TRIGGER_SYM = 836, + TRIM = 837, + TRUE_SYM = 838, + TRUNCATE_SYM = 839, + TYPES_SYM = 840, + TYPE_SYM = 841, + UDF_RETURNS_SYM = 842, + ULONGLONG_NUM = 843, + UNCOMMITTED_SYM = 844, + UNDEFINED_SYM = 845, + UNDERSCORE_CHARSET = 846, + UNDOFILE_SYM = 847, + UNDO_BUFFER_SIZE_SYM = 848, + UNDO_SYM = 849, + UNICODE_SYM = 850, + UNINSTALL_SYM = 851, + UNION_SYM = 852, + UNIQUE_SYM = 853, + UNKNOWN_SYM = 854, + UNLOCK_SYM = 855, + UNSIGNED = 856, + UNTIL_SYM = 857, + UPDATE_SYM = 858, + UPGRADE_SYM = 859, + USAGE = 860, + USER = 861, + USE_FRM = 862, + USE_SYM = 863, + USING = 864, + UTC_DATE_SYM = 865, + UTC_TIMESTAMP_SYM = 866, + UTC_TIME_SYM = 867, + VALUES = 868, + VALUE_SYM = 869, + VARBINARY = 870, + VARCHAR = 871, + VARIABLES = 872, + VARIANCE_SYM = 873, + VARYING = 874, + VAR_SAMP_SYM = 875, + VIA_SYM = 876, + VIEW_SYM = 877, + VIRTUAL_SYM = 878, + WAIT_SYM = 879, + WARNINGS = 880, + WEEK_SYM = 881, + WEIGHT_STRING_SYM = 882, + WHEN_SYM = 883, + WHERE = 884, + WHILE_SYM = 885, + WITH = 886, + WITH_CUBE_SYM = 887, + WITH_ROLLUP_SYM = 888, + WORK_SYM = 889, + WRAPPER_SYM = 890, + WRITE_SYM = 891, + X509_SYM = 892, + XA_SYM = 893, + XML_SYM = 894, + XOR = 895, + YEAR_MONTH_SYM = 896, + YEAR_SYM = 897, + ZEROFILL = 898, + IMPOSSIBLE_ACTION = 899 }; #endif /* Tokens. */ @@ -1805,513 +1806,514 @@ extern int MYSQLdebug; #define DELAYED_SYM 389 #define DELAY_KEY_WRITE_SYM 390 #define DELETE_SYM 391 -#define DESC 392 -#define DESCRIBE 393 -#define DES_KEY_FILE 394 -#define DETERMINISTIC_SYM 395 -#define DIAGNOSTICS_SYM 396 -#define DIRECTORY_SYM 397 -#define DISABLE_SYM 398 -#define DISCARD 399 -#define DISK_SYM 400 -#define DISTINCT 401 -#define DIV_SYM 402 -#define DOUBLE_SYM 403 -#define DO_DOMAIN_IDS_SYM 404 -#define DO_SYM 405 -#define DROP 406 -#define DUAL_SYM 407 -#define DUMPFILE 408 -#define DUPLICATE_SYM 409 -#define DYNAMIC_SYM 410 -#define EACH_SYM 411 -#define ELSE 412 -#define ELSEIF_SYM 413 -#define ENABLE_SYM 414 -#define ENCLOSED 415 -#define END 416 -#define ENDS_SYM 417 -#define END_OF_INPUT 418 -#define ENGINES_SYM 419 -#define ENGINE_SYM 420 -#define ENUM 421 -#define EQUAL_SYM 422 -#define ERROR_SYM 423 -#define ERRORS 424 -#define ESCAPED 425 -#define ESCAPE_SYM 426 -#define EVENTS_SYM 427 -#define EVENT_SYM 428 -#define EVERY_SYM 429 -#define EXCHANGE_SYM 430 -#define EXAMINED_SYM 431 -#define EXECUTE_SYM 432 -#define EXISTS 433 -#define EXIT_SYM 434 -#define EXPANSION_SYM 435 -#define EXPORT_SYM 436 -#define EXTENDED_SYM 437 -#define EXTENT_SIZE_SYM 438 -#define EXTRACT_SYM 439 -#define FALSE_SYM 440 -#define FAST_SYM 441 -#define FAULTS_SYM 442 -#define FETCH_SYM 443 -#define FILE_SYM 444 -#define FIRST_SYM 445 -#define FIXED_SYM 446 -#define FLOAT_NUM 447 -#define FLOAT_SYM 448 -#define FLUSH_SYM 449 -#define FORCE_SYM 450 -#define FOREIGN 451 -#define FOR_SYM 452 -#define FORMAT_SYM 453 -#define FOUND_SYM 454 -#define FROM 455 -#define FULL 456 -#define FULLTEXT_SYM 457 -#define FUNCTION_SYM 458 -#define GE 459 -#define GENERAL 460 -#define GENERATED_SYM 461 -#define GEOMETRYCOLLECTION 462 -#define GEOMETRY_SYM 463 -#define GET_FORMAT 464 -#define GET_SYM 465 -#define GLOBAL_SYM 466 -#define GRANT 467 -#define GRANTS 468 -#define GROUP_SYM 469 -#define GROUP_CONCAT_SYM 470 -#define HANDLER_SYM 471 -#define HARD_SYM 472 -#define HASH_SYM 473 -#define HAVING 474 -#define HELP_SYM 475 -#define HEX_NUM 476 -#define HEX_STRING 477 -#define HIGH_PRIORITY 478 -#define HOST_SYM 479 -#define HOSTS_SYM 480 -#define HOUR_MICROSECOND_SYM 481 -#define HOUR_MINUTE_SYM 482 -#define HOUR_SECOND_SYM 483 -#define HOUR_SYM 484 -#define ID_SYM 485 -#define IDENT 486 -#define IDENTIFIED_SYM 487 -#define IDENT_QUOTED 488 -#define IF_SYM 489 -#define IGNORE_DOMAIN_IDS_SYM 490 -#define IGNORE_SYM 491 -#define IGNORE_SERVER_IDS_SYM 492 -#define IMPORT 493 -#define INDEXES 494 -#define INDEX_SYM 495 -#define INFILE 496 -#define INITIAL_SIZE_SYM 497 -#define INNER_SYM 498 -#define INOUT_SYM 499 -#define INSENSITIVE_SYM 500 -#define INSERT 501 -#define INSERT_METHOD 502 -#define INSTALL_SYM 503 -#define INTERVAL_SYM 504 -#define INTO 505 -#define INT_SYM 506 -#define INVOKER_SYM 507 -#define IN_SYM 508 -#define IO_SYM 509 -#define IPC_SYM 510 -#define IS 511 -#define ISOLATION 512 -#define ISSUER_SYM 513 -#define ITERATE_SYM 514 -#define JOIN_SYM 515 -#define KEYS 516 -#define KEY_BLOCK_SIZE 517 -#define KEY_SYM 518 -#define KILL_SYM 519 -#define LANGUAGE_SYM 520 -#define LAST_SYM 521 -#define LAST_VALUE 522 -#define LE 523 -#define LEADING 524 -#define LEAVES 525 -#define LEAVE_SYM 526 -#define LEFT 527 -#define LESS_SYM 528 -#define LEVEL_SYM 529 -#define LEX_HOSTNAME 530 -#define LIKE 531 -#define LIMIT 532 -#define LINEAR_SYM 533 -#define LINES 534 -#define LINESTRING 535 -#define LIST_SYM 536 -#define LOAD 537 -#define LOCAL_SYM 538 -#define LOCATOR_SYM 539 -#define LOCKS_SYM 540 -#define LOCK_SYM 541 -#define LOGFILE_SYM 542 -#define LOGS_SYM 543 -#define LONGBLOB 544 -#define LONGTEXT 545 -#define LONG_NUM 546 -#define LONG_SYM 547 -#define LOOP_SYM 548 -#define LOW_PRIORITY 549 -#define MASTER_CONNECT_RETRY_SYM 550 -#define MASTER_GTID_POS_SYM 551 -#define MASTER_HOST_SYM 552 -#define MASTER_LOG_FILE_SYM 553 -#define MASTER_LOG_POS_SYM 554 -#define MASTER_PASSWORD_SYM 555 -#define MASTER_PORT_SYM 556 -#define MASTER_SERVER_ID_SYM 557 -#define MASTER_SSL_CAPATH_SYM 558 -#define MASTER_SSL_CA_SYM 559 -#define MASTER_SSL_CERT_SYM 560 -#define MASTER_SSL_CIPHER_SYM 561 -#define MASTER_SSL_CRL_SYM 562 -#define MASTER_SSL_CRLPATH_SYM 563 -#define MASTER_SSL_KEY_SYM 564 -#define MASTER_SSL_SYM 565 -#define MASTER_SSL_VERIFY_SERVER_CERT_SYM 566 -#define MASTER_SYM 567 -#define MASTER_USER_SYM 568 -#define MASTER_USE_GTID_SYM 569 -#define MASTER_HEARTBEAT_PERIOD_SYM 570 -#define MATCH 571 -#define MAX_CONNECTIONS_PER_HOUR 572 -#define MAX_QUERIES_PER_HOUR 573 -#define MAX_ROWS 574 -#define MAX_SIZE_SYM 575 -#define MAX_SYM 576 -#define MAX_UPDATES_PER_HOUR 577 -#define MAX_STATEMENT_TIME_SYM 578 -#define MAX_USER_CONNECTIONS_SYM 579 -#define MAX_VALUE_SYM 580 -#define MEDIUMBLOB 581 -#define MEDIUMINT 582 -#define MEDIUMTEXT 583 -#define MEDIUM_SYM 584 -#define MEMORY_SYM 585 -#define MERGE_SYM 586 -#define MESSAGE_TEXT_SYM 587 -#define MICROSECOND_SYM 588 -#define MIGRATE_SYM 589 -#define MINUTE_MICROSECOND_SYM 590 -#define MINUTE_SECOND_SYM 591 -#define MINUTE_SYM 592 -#define MIN_ROWS 593 -#define MIN_SYM 594 -#define MODE_SYM 595 -#define MODIFIES_SYM 596 -#define MODIFY_SYM 597 -#define MOD_SYM 598 -#define MONTH_SYM 599 -#define MULTILINESTRING 600 -#define MULTIPOINT 601 -#define MULTIPOLYGON 602 -#define MUTEX_SYM 603 -#define MYSQL_SYM 604 -#define MYSQL_ERRNO_SYM 605 -#define NAMES_SYM 606 -#define NAME_SYM 607 -#define NATIONAL_SYM 608 -#define NATURAL 609 -#define NCHAR_STRING 610 -#define NCHAR_SYM 611 -#define NE 612 -#define NEG 613 -#define NEW_SYM 614 -#define NEXT_SYM 615 -#define NODEGROUP_SYM 616 -#define NONE_SYM 617 -#define NOT2_SYM 618 -#define NOT_SYM 619 -#define NOW_SYM 620 -#define NO_SYM 621 -#define NO_WAIT_SYM 622 -#define NO_WRITE_TO_BINLOG 623 -#define NULL_SYM 624 -#define NUM 625 -#define NUMBER_SYM 626 -#define NUMERIC_SYM 627 -#define NVARCHAR_SYM 628 -#define OFFSET_SYM 629 -#define OLD_PASSWORD_SYM 630 -#define ON 631 -#define ONE_SYM 632 -#define ONLY_SYM 633 -#define ONLINE_SYM 634 -#define OPEN_SYM 635 -#define OPTIMIZE 636 -#define OPTIONS_SYM 637 -#define OPTION 638 -#define OPTIONALLY 639 -#define OR2_SYM 640 -#define ORDER_SYM 641 -#define OR_OR_SYM 642 -#define OR_SYM 643 -#define OUTER 644 -#define OUTFILE 645 -#define OUT_SYM 646 -#define OWNER_SYM 647 -#define PACK_KEYS_SYM 648 -#define PAGE_SYM 649 -#define PAGE_CHECKSUM_SYM 650 -#define PARAM_MARKER 651 -#define PARSER_SYM 652 -#define PARSE_VCOL_EXPR_SYM 653 -#define PARTIAL 654 -#define PARTITION_SYM 655 -#define PARTITIONS_SYM 656 -#define PARTITIONING_SYM 657 -#define PASSWORD_SYM 658 -#define PERSISTENT_SYM 659 -#define PHASE_SYM 660 -#define PLUGINS_SYM 661 -#define PLUGIN_SYM 662 -#define POINT_SYM 663 -#define POLYGON 664 -#define PORT_SYM 665 -#define POSITION_SYM 666 -#define PRECISION 667 -#define PREPARE_SYM 668 -#define PRESERVE_SYM 669 -#define PREV_SYM 670 -#define PRIMARY_SYM 671 -#define PRIVILEGES 672 -#define PROCEDURE_SYM 673 -#define PROCESS 674 -#define PROCESSLIST_SYM 675 -#define PROFILE_SYM 676 -#define PROFILES_SYM 677 -#define PROXY_SYM 678 -#define PURGE 679 -#define QUARTER_SYM 680 -#define QUERY_SYM 681 -#define QUICK 682 -#define RANGE_SYM 683 -#define READS_SYM 684 -#define READ_ONLY_SYM 685 -#define READ_SYM 686 -#define READ_WRITE_SYM 687 -#define REAL 688 -#define REBUILD_SYM 689 -#define RECOVER_SYM 690 -#define REDOFILE_SYM 691 -#define REDO_BUFFER_SIZE_SYM 692 -#define REDUNDANT_SYM 693 -#define REFERENCES 694 -#define REGEXP 695 -#define RELAY 696 -#define RELAYLOG_SYM 697 -#define RELAY_LOG_FILE_SYM 698 -#define RELAY_LOG_POS_SYM 699 -#define RELAY_THREAD 700 -#define RELEASE_SYM 701 -#define RELOAD 702 -#define REMOVE_SYM 703 -#define RENAME 704 -#define REORGANIZE_SYM 705 -#define REPAIR 706 -#define REPEATABLE_SYM 707 -#define REPEAT_SYM 708 -#define REPLACE 709 -#define REPLICATION 710 -#define REQUIRE_SYM 711 -#define RESET_SYM 712 -#define RESIGNAL_SYM 713 -#define RESOURCES 714 -#define RESTORE_SYM 715 -#define RESTRICT 716 -#define RESUME_SYM 717 -#define RETURNED_SQLSTATE_SYM 718 -#define RETURNING_SYM 719 -#define RETURNS_SYM 720 -#define RETURN_SYM 721 -#define REVERSE_SYM 722 -#define REVOKE 723 -#define RIGHT 724 -#define ROLE_SYM 725 -#define ROLLBACK_SYM 726 -#define ROLLUP_SYM 727 -#define ROUTINE_SYM 728 -#define ROWS_SYM 729 -#define ROW_FORMAT_SYM 730 -#define ROW_SYM 731 -#define ROW_COUNT_SYM 732 -#define RTREE_SYM 733 -#define SAVEPOINT_SYM 734 -#define SCHEDULE_SYM 735 -#define SCHEMA_NAME_SYM 736 -#define SECOND_MICROSECOND_SYM 737 -#define SECOND_SYM 738 -#define SECURITY_SYM 739 -#define SELECT_SYM 740 -#define SENSITIVE_SYM 741 -#define SEPARATOR_SYM 742 -#define SERIALIZABLE_SYM 743 -#define SERIAL_SYM 744 -#define SESSION_SYM 745 -#define SERVER_SYM 746 -#define SERVER_OPTIONS 747 -#define SET 748 -#define SET_VAR 749 -#define SHARE_SYM 750 -#define SHIFT_LEFT 751 -#define SHIFT_RIGHT 752 -#define SHOW 753 -#define SHUTDOWN 754 -#define SIGNAL_SYM 755 -#define SIGNED_SYM 756 -#define SIMPLE_SYM 757 -#define SLAVE 758 -#define SLAVES 759 -#define SLAVE_POS_SYM 760 -#define SLOW 761 -#define SMALLINT 762 -#define SNAPSHOT_SYM 763 -#define SOCKET_SYM 764 -#define SOFT_SYM 765 -#define SONAME_SYM 766 -#define SOUNDS_SYM 767 -#define SOURCE_SYM 768 -#define SPATIAL_SYM 769 -#define SPECIFIC_SYM 770 -#define SQLEXCEPTION_SYM 771 -#define SQLSTATE_SYM 772 -#define SQLWARNING_SYM 773 -#define SQL_BIG_RESULT 774 -#define SQL_BUFFER_RESULT 775 -#define SQL_CACHE_SYM 776 -#define SQL_CALC_FOUND_ROWS 777 -#define SQL_NO_CACHE_SYM 778 -#define SQL_SMALL_RESULT 779 -#define SQL_SYM 780 -#define SQL_THREAD 781 -#define REF_SYSTEM_ID_SYM 782 -#define SSL_SYM 783 -#define STARTING 784 -#define STARTS_SYM 785 -#define START_SYM 786 -#define STATEMENT_SYM 787 -#define STATS_AUTO_RECALC_SYM 788 -#define STATS_PERSISTENT_SYM 789 -#define STATS_SAMPLE_PAGES_SYM 790 -#define STATUS_SYM 791 -#define STDDEV_SAMP_SYM 792 -#define STD_SYM 793 -#define STOP_SYM 794 -#define STORAGE_SYM 795 -#define STRAIGHT_JOIN 796 -#define STRING_SYM 797 -#define SUBCLASS_ORIGIN_SYM 798 -#define SUBDATE_SYM 799 -#define SUBJECT_SYM 800 -#define SUBPARTITIONS_SYM 801 -#define SUBPARTITION_SYM 802 -#define SUBSTRING 803 -#define SUM_SYM 804 -#define SUPER_SYM 805 -#define SUSPEND_SYM 806 -#define SWAPS_SYM 807 -#define SWITCHES_SYM 808 -#define SYSDATE 809 -#define TABLES 810 -#define TABLESPACE 811 -#define TABLE_REF_PRIORITY 812 -#define TABLE_SYM 813 -#define TABLE_CHECKSUM_SYM 814 -#define TABLE_NAME_SYM 815 -#define TEMPORARY 816 -#define TEMPTABLE_SYM 817 -#define TERMINATED 818 -#define TEXT_STRING 819 -#define TEXT_SYM 820 -#define THAN_SYM 821 -#define THEN_SYM 822 -#define TIMESTAMP 823 -#define TIMESTAMP_ADD 824 -#define TIMESTAMP_DIFF 825 -#define TIME_SYM 826 -#define TINYBLOB 827 -#define TINYINT 828 -#define TINYTEXT 829 -#define TO_SYM 830 -#define TRAILING 831 -#define TRANSACTION_SYM 832 -#define TRANSACTIONAL_SYM 833 -#define TRIGGERS_SYM 834 -#define TRIGGER_SYM 835 -#define TRIM 836 -#define TRUE_SYM 837 -#define TRUNCATE_SYM 838 -#define TYPES_SYM 839 -#define TYPE_SYM 840 -#define UDF_RETURNS_SYM 841 -#define ULONGLONG_NUM 842 -#define UNCOMMITTED_SYM 843 -#define UNDEFINED_SYM 844 -#define UNDERSCORE_CHARSET 845 -#define UNDOFILE_SYM 846 -#define UNDO_BUFFER_SIZE_SYM 847 -#define UNDO_SYM 848 -#define UNICODE_SYM 849 -#define UNINSTALL_SYM 850 -#define UNION_SYM 851 -#define UNIQUE_SYM 852 -#define UNKNOWN_SYM 853 -#define UNLOCK_SYM 854 -#define UNSIGNED 855 -#define UNTIL_SYM 856 -#define UPDATE_SYM 857 -#define UPGRADE_SYM 858 -#define USAGE 859 -#define USER 860 -#define USE_FRM 861 -#define USE_SYM 862 -#define USING 863 -#define UTC_DATE_SYM 864 -#define UTC_TIMESTAMP_SYM 865 -#define UTC_TIME_SYM 866 -#define VALUES 867 -#define VALUE_SYM 868 -#define VARBINARY 869 -#define VARCHAR 870 -#define VARIABLES 871 -#define VARIANCE_SYM 872 -#define VARYING 873 -#define VAR_SAMP_SYM 874 -#define VIA_SYM 875 -#define VIEW_SYM 876 -#define VIRTUAL_SYM 877 -#define WAIT_SYM 878 -#define WARNINGS 879 -#define WEEK_SYM 880 -#define WEIGHT_STRING_SYM 881 -#define WHEN_SYM 882 -#define WHERE 883 -#define WHILE_SYM 884 -#define WITH 885 -#define WITH_CUBE_SYM 886 -#define WITH_ROLLUP_SYM 887 -#define WORK_SYM 888 -#define WRAPPER_SYM 889 -#define WRITE_SYM 890 -#define X509_SYM 891 -#define XA_SYM 892 -#define XML_SYM 893 -#define XOR 894 -#define YEAR_MONTH_SYM 895 -#define YEAR_SYM 896 -#define ZEROFILL 897 -#define IMPOSSIBLE_ACTION 898 +#define DELETE_DOMAIN_ID_SYM 392 +#define DESC 393 +#define DESCRIBE 394 +#define DES_KEY_FILE 395 +#define DETERMINISTIC_SYM 396 +#define DIAGNOSTICS_SYM 397 +#define DIRECTORY_SYM 398 +#define DISABLE_SYM 399 +#define DISCARD 400 +#define DISK_SYM 401 +#define DISTINCT 402 +#define DIV_SYM 403 +#define DOUBLE_SYM 404 +#define DO_DOMAIN_IDS_SYM 405 +#define DO_SYM 406 +#define DROP 407 +#define DUAL_SYM 408 +#define DUMPFILE 409 +#define DUPLICATE_SYM 410 +#define DYNAMIC_SYM 411 +#define EACH_SYM 412 +#define ELSE 413 +#define ELSEIF_SYM 414 +#define ENABLE_SYM 415 +#define ENCLOSED 416 +#define END 417 +#define ENDS_SYM 418 +#define END_OF_INPUT 419 +#define ENGINES_SYM 420 +#define ENGINE_SYM 421 +#define ENUM 422 +#define EQUAL_SYM 423 +#define ERROR_SYM 424 +#define ERRORS 425 +#define ESCAPED 426 +#define ESCAPE_SYM 427 +#define EVENTS_SYM 428 +#define EVENT_SYM 429 +#define EVERY_SYM 430 +#define EXCHANGE_SYM 431 +#define EXAMINED_SYM 432 +#define EXECUTE_SYM 433 +#define EXISTS 434 +#define EXIT_SYM 435 +#define EXPANSION_SYM 436 +#define EXPORT_SYM 437 +#define EXTENDED_SYM 438 +#define EXTENT_SIZE_SYM 439 +#define EXTRACT_SYM 440 +#define FALSE_SYM 441 +#define FAST_SYM 442 +#define FAULTS_SYM 443 +#define FETCH_SYM 444 +#define FILE_SYM 445 +#define FIRST_SYM 446 +#define FIXED_SYM 447 +#define FLOAT_NUM 448 +#define FLOAT_SYM 449 +#define FLUSH_SYM 450 +#define FORCE_SYM 451 +#define FOREIGN 452 +#define FOR_SYM 453 +#define FORMAT_SYM 454 +#define FOUND_SYM 455 +#define FROM 456 +#define FULL 457 +#define FULLTEXT_SYM 458 +#define FUNCTION_SYM 459 +#define GE 460 +#define GENERAL 461 +#define GENERATED_SYM 462 +#define GEOMETRYCOLLECTION 463 +#define GEOMETRY_SYM 464 +#define GET_FORMAT 465 +#define GET_SYM 466 +#define GLOBAL_SYM 467 +#define GRANT 468 +#define GRANTS 469 +#define GROUP_SYM 470 +#define GROUP_CONCAT_SYM 471 +#define HANDLER_SYM 472 +#define HARD_SYM 473 +#define HASH_SYM 474 +#define HAVING 475 +#define HELP_SYM 476 +#define HEX_NUM 477 +#define HEX_STRING 478 +#define HIGH_PRIORITY 479 +#define HOST_SYM 480 +#define HOSTS_SYM 481 +#define HOUR_MICROSECOND_SYM 482 +#define HOUR_MINUTE_SYM 483 +#define HOUR_SECOND_SYM 484 +#define HOUR_SYM 485 +#define ID_SYM 486 +#define IDENT 487 +#define IDENTIFIED_SYM 488 +#define IDENT_QUOTED 489 +#define IF_SYM 490 +#define IGNORE_DOMAIN_IDS_SYM 491 +#define IGNORE_SYM 492 +#define IGNORE_SERVER_IDS_SYM 493 +#define IMPORT 494 +#define INDEXES 495 +#define INDEX_SYM 496 +#define INFILE 497 +#define INITIAL_SIZE_SYM 498 +#define INNER_SYM 499 +#define INOUT_SYM 500 +#define INSENSITIVE_SYM 501 +#define INSERT 502 +#define INSERT_METHOD 503 +#define INSTALL_SYM 504 +#define INTERVAL_SYM 505 +#define INTO 506 +#define INT_SYM 507 +#define INVOKER_SYM 508 +#define IN_SYM 509 +#define IO_SYM 510 +#define IPC_SYM 511 +#define IS 512 +#define ISOLATION 513 +#define ISSUER_SYM 514 +#define ITERATE_SYM 515 +#define JOIN_SYM 516 +#define KEYS 517 +#define KEY_BLOCK_SIZE 518 +#define KEY_SYM 519 +#define KILL_SYM 520 +#define LANGUAGE_SYM 521 +#define LAST_SYM 522 +#define LAST_VALUE 523 +#define LE 524 +#define LEADING 525 +#define LEAVES 526 +#define LEAVE_SYM 527 +#define LEFT 528 +#define LESS_SYM 529 +#define LEVEL_SYM 530 +#define LEX_HOSTNAME 531 +#define LIKE 532 +#define LIMIT 533 +#define LINEAR_SYM 534 +#define LINES 535 +#define LINESTRING 536 +#define LIST_SYM 537 +#define LOAD 538 +#define LOCAL_SYM 539 +#define LOCATOR_SYM 540 +#define LOCKS_SYM 541 +#define LOCK_SYM 542 +#define LOGFILE_SYM 543 +#define LOGS_SYM 544 +#define LONGBLOB 545 +#define LONGTEXT 546 +#define LONG_NUM 547 +#define LONG_SYM 548 +#define LOOP_SYM 549 +#define LOW_PRIORITY 550 +#define MASTER_CONNECT_RETRY_SYM 551 +#define MASTER_GTID_POS_SYM 552 +#define MASTER_HOST_SYM 553 +#define MASTER_LOG_FILE_SYM 554 +#define MASTER_LOG_POS_SYM 555 +#define MASTER_PASSWORD_SYM 556 +#define MASTER_PORT_SYM 557 +#define MASTER_SERVER_ID_SYM 558 +#define MASTER_SSL_CAPATH_SYM 559 +#define MASTER_SSL_CA_SYM 560 +#define MASTER_SSL_CERT_SYM 561 +#define MASTER_SSL_CIPHER_SYM 562 +#define MASTER_SSL_CRL_SYM 563 +#define MASTER_SSL_CRLPATH_SYM 564 +#define MASTER_SSL_KEY_SYM 565 +#define MASTER_SSL_SYM 566 +#define MASTER_SSL_VERIFY_SERVER_CERT_SYM 567 +#define MASTER_SYM 568 +#define MASTER_USER_SYM 569 +#define MASTER_USE_GTID_SYM 570 +#define MASTER_HEARTBEAT_PERIOD_SYM 571 +#define MATCH 572 +#define MAX_CONNECTIONS_PER_HOUR 573 +#define MAX_QUERIES_PER_HOUR 574 +#define MAX_ROWS 575 +#define MAX_SIZE_SYM 576 +#define MAX_SYM 577 +#define MAX_UPDATES_PER_HOUR 578 +#define MAX_STATEMENT_TIME_SYM 579 +#define MAX_USER_CONNECTIONS_SYM 580 +#define MAX_VALUE_SYM 581 +#define MEDIUMBLOB 582 +#define MEDIUMINT 583 +#define MEDIUMTEXT 584 +#define MEDIUM_SYM 585 +#define MEMORY_SYM 586 +#define MERGE_SYM 587 +#define MESSAGE_TEXT_SYM 588 +#define MICROSECOND_SYM 589 +#define MIGRATE_SYM 590 +#define MINUTE_MICROSECOND_SYM 591 +#define MINUTE_SECOND_SYM 592 +#define MINUTE_SYM 593 +#define MIN_ROWS 594 +#define MIN_SYM 595 +#define MODE_SYM 596 +#define MODIFIES_SYM 597 +#define MODIFY_SYM 598 +#define MOD_SYM 599 +#define MONTH_SYM 600 +#define MULTILINESTRING 601 +#define MULTIPOINT 602 +#define MULTIPOLYGON 603 +#define MUTEX_SYM 604 +#define MYSQL_SYM 605 +#define MYSQL_ERRNO_SYM 606 +#define NAMES_SYM 607 +#define NAME_SYM 608 +#define NATIONAL_SYM 609 +#define NATURAL 610 +#define NCHAR_STRING 611 +#define NCHAR_SYM 612 +#define NE 613 +#define NEG 614 +#define NEW_SYM 615 +#define NEXT_SYM 616 +#define NODEGROUP_SYM 617 +#define NONE_SYM 618 +#define NOT2_SYM 619 +#define NOT_SYM 620 +#define NOW_SYM 621 +#define NO_SYM 622 +#define NO_WAIT_SYM 623 +#define NO_WRITE_TO_BINLOG 624 +#define NULL_SYM 625 +#define NUM 626 +#define NUMBER_SYM 627 +#define NUMERIC_SYM 628 +#define NVARCHAR_SYM 629 +#define OFFSET_SYM 630 +#define OLD_PASSWORD_SYM 631 +#define ON 632 +#define ONE_SYM 633 +#define ONLY_SYM 634 +#define ONLINE_SYM 635 +#define OPEN_SYM 636 +#define OPTIMIZE 637 +#define OPTIONS_SYM 638 +#define OPTION 639 +#define OPTIONALLY 640 +#define OR2_SYM 641 +#define ORDER_SYM 642 +#define OR_OR_SYM 643 +#define OR_SYM 644 +#define OUTER 645 +#define OUTFILE 646 +#define OUT_SYM 647 +#define OWNER_SYM 648 +#define PACK_KEYS_SYM 649 +#define PAGE_SYM 650 +#define PAGE_CHECKSUM_SYM 651 +#define PARAM_MARKER 652 +#define PARSER_SYM 653 +#define PARSE_VCOL_EXPR_SYM 654 +#define PARTIAL 655 +#define PARTITION_SYM 656 +#define PARTITIONS_SYM 657 +#define PARTITIONING_SYM 658 +#define PASSWORD_SYM 659 +#define PERSISTENT_SYM 660 +#define PHASE_SYM 661 +#define PLUGINS_SYM 662 +#define PLUGIN_SYM 663 +#define POINT_SYM 664 +#define POLYGON 665 +#define PORT_SYM 666 +#define POSITION_SYM 667 +#define PRECISION 668 +#define PREPARE_SYM 669 +#define PRESERVE_SYM 670 +#define PREV_SYM 671 +#define PRIMARY_SYM 672 +#define PRIVILEGES 673 +#define PROCEDURE_SYM 674 +#define PROCESS 675 +#define PROCESSLIST_SYM 676 +#define PROFILE_SYM 677 +#define PROFILES_SYM 678 +#define PROXY_SYM 679 +#define PURGE 680 +#define QUARTER_SYM 681 +#define QUERY_SYM 682 +#define QUICK 683 +#define RANGE_SYM 684 +#define READS_SYM 685 +#define READ_ONLY_SYM 686 +#define READ_SYM 687 +#define READ_WRITE_SYM 688 +#define REAL 689 +#define REBUILD_SYM 690 +#define RECOVER_SYM 691 +#define REDOFILE_SYM 692 +#define REDO_BUFFER_SIZE_SYM 693 +#define REDUNDANT_SYM 694 +#define REFERENCES 695 +#define REGEXP 696 +#define RELAY 697 +#define RELAYLOG_SYM 698 +#define RELAY_LOG_FILE_SYM 699 +#define RELAY_LOG_POS_SYM 700 +#define RELAY_THREAD 701 +#define RELEASE_SYM 702 +#define RELOAD 703 +#define REMOVE_SYM 704 +#define RENAME 705 +#define REORGANIZE_SYM 706 +#define REPAIR 707 +#define REPEATABLE_SYM 708 +#define REPEAT_SYM 709 +#define REPLACE 710 +#define REPLICATION 711 +#define REQUIRE_SYM 712 +#define RESET_SYM 713 +#define RESIGNAL_SYM 714 +#define RESOURCES 715 +#define RESTORE_SYM 716 +#define RESTRICT 717 +#define RESUME_SYM 718 +#define RETURNED_SQLSTATE_SYM 719 +#define RETURNING_SYM 720 +#define RETURNS_SYM 721 +#define RETURN_SYM 722 +#define REVERSE_SYM 723 +#define REVOKE 724 +#define RIGHT 725 +#define ROLE_SYM 726 +#define ROLLBACK_SYM 727 +#define ROLLUP_SYM 728 +#define ROUTINE_SYM 729 +#define ROWS_SYM 730 +#define ROW_FORMAT_SYM 731 +#define ROW_SYM 732 +#define ROW_COUNT_SYM 733 +#define RTREE_SYM 734 +#define SAVEPOINT_SYM 735 +#define SCHEDULE_SYM 736 +#define SCHEMA_NAME_SYM 737 +#define SECOND_MICROSECOND_SYM 738 +#define SECOND_SYM 739 +#define SECURITY_SYM 740 +#define SELECT_SYM 741 +#define SENSITIVE_SYM 742 +#define SEPARATOR_SYM 743 +#define SERIALIZABLE_SYM 744 +#define SERIAL_SYM 745 +#define SESSION_SYM 746 +#define SERVER_SYM 747 +#define SERVER_OPTIONS 748 +#define SET 749 +#define SET_VAR 750 +#define SHARE_SYM 751 +#define SHIFT_LEFT 752 +#define SHIFT_RIGHT 753 +#define SHOW 754 +#define SHUTDOWN 755 +#define SIGNAL_SYM 756 +#define SIGNED_SYM 757 +#define SIMPLE_SYM 758 +#define SLAVE 759 +#define SLAVES 760 +#define SLAVE_POS_SYM 761 +#define SLOW 762 +#define SMALLINT 763 +#define SNAPSHOT_SYM 764 +#define SOCKET_SYM 765 +#define SOFT_SYM 766 +#define SONAME_SYM 767 +#define SOUNDS_SYM 768 +#define SOURCE_SYM 769 +#define SPATIAL_SYM 770 +#define SPECIFIC_SYM 771 +#define SQLEXCEPTION_SYM 772 +#define SQLSTATE_SYM 773 +#define SQLWARNING_SYM 774 +#define SQL_BIG_RESULT 775 +#define SQL_BUFFER_RESULT 776 +#define SQL_CACHE_SYM 777 +#define SQL_CALC_FOUND_ROWS 778 +#define SQL_NO_CACHE_SYM 779 +#define SQL_SMALL_RESULT 780 +#define SQL_SYM 781 +#define SQL_THREAD 782 +#define REF_SYSTEM_ID_SYM 783 +#define SSL_SYM 784 +#define STARTING 785 +#define STARTS_SYM 786 +#define START_SYM 787 +#define STATEMENT_SYM 788 +#define STATS_AUTO_RECALC_SYM 789 +#define STATS_PERSISTENT_SYM 790 +#define STATS_SAMPLE_PAGES_SYM 791 +#define STATUS_SYM 792 +#define STDDEV_SAMP_SYM 793 +#define STD_SYM 794 +#define STOP_SYM 795 +#define STORAGE_SYM 796 +#define STRAIGHT_JOIN 797 +#define STRING_SYM 798 +#define SUBCLASS_ORIGIN_SYM 799 +#define SUBDATE_SYM 800 +#define SUBJECT_SYM 801 +#define SUBPARTITIONS_SYM 802 +#define SUBPARTITION_SYM 803 +#define SUBSTRING 804 +#define SUM_SYM 805 +#define SUPER_SYM 806 +#define SUSPEND_SYM 807 +#define SWAPS_SYM 808 +#define SWITCHES_SYM 809 +#define SYSDATE 810 +#define TABLES 811 +#define TABLESPACE 812 +#define TABLE_REF_PRIORITY 813 +#define TABLE_SYM 814 +#define TABLE_CHECKSUM_SYM 815 +#define TABLE_NAME_SYM 816 +#define TEMPORARY 817 +#define TEMPTABLE_SYM 818 +#define TERMINATED 819 +#define TEXT_STRING 820 +#define TEXT_SYM 821 +#define THAN_SYM 822 +#define THEN_SYM 823 +#define TIMESTAMP 824 +#define TIMESTAMP_ADD 825 +#define TIMESTAMP_DIFF 826 +#define TIME_SYM 827 +#define TINYBLOB 828 +#define TINYINT 829 +#define TINYTEXT 830 +#define TO_SYM 831 +#define TRAILING 832 +#define TRANSACTION_SYM 833 +#define TRANSACTIONAL_SYM 834 +#define TRIGGERS_SYM 835 +#define TRIGGER_SYM 836 +#define TRIM 837 +#define TRUE_SYM 838 +#define TRUNCATE_SYM 839 +#define TYPES_SYM 840 +#define TYPE_SYM 841 +#define UDF_RETURNS_SYM 842 +#define ULONGLONG_NUM 843 +#define UNCOMMITTED_SYM 844 +#define UNDEFINED_SYM 845 +#define UNDERSCORE_CHARSET 846 +#define UNDOFILE_SYM 847 +#define UNDO_BUFFER_SIZE_SYM 848 +#define UNDO_SYM 849 +#define UNICODE_SYM 850 +#define UNINSTALL_SYM 851 +#define UNION_SYM 852 +#define UNIQUE_SYM 853 +#define UNKNOWN_SYM 854 +#define UNLOCK_SYM 855 +#define UNSIGNED 856 +#define UNTIL_SYM 857 +#define UPDATE_SYM 858 +#define UPGRADE_SYM 859 +#define USAGE 860 +#define USER 861 +#define USE_FRM 862 +#define USE_SYM 863 +#define USING 864 +#define UTC_DATE_SYM 865 +#define UTC_TIMESTAMP_SYM 866 +#define UTC_TIME_SYM 867 +#define VALUES 868 +#define VALUE_SYM 869 +#define VARBINARY 870 +#define VARCHAR 871 +#define VARIABLES 872 +#define VARIANCE_SYM 873 +#define VARYING 874 +#define VAR_SAMP_SYM 875 +#define VIA_SYM 876 +#define VIEW_SYM 877 +#define VIRTUAL_SYM 878 +#define WAIT_SYM 879 +#define WARNINGS 880 +#define WEEK_SYM 881 +#define WEIGHT_STRING_SYM 882 +#define WHEN_SYM 883 +#define WHERE 884 +#define WHILE_SYM 885 +#define WITH 886 +#define WITH_CUBE_SYM 887 +#define WITH_ROLLUP_SYM 888 +#define WORK_SYM 889 +#define WRAPPER_SYM 890 +#define WRITE_SYM 891 +#define X509_SYM 892 +#define XA_SYM 893 +#define XML_SYM 894 +#define XOR 895 +#define YEAR_MONTH_SYM 896 +#define YEAR_SYM 897 +#define ZEROFILL 898 +#define IMPOSSIBLE_ACTION 899 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED @@ -2391,7 +2393,7 @@ union YYSTYPE enum enum_mysql_timestamp_type date_time_type; DDL_options_st object_ddl_options; -#line 2395 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:355 */ +#line 2397 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:355 */ }; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 @@ -2408,7 +2410,7 @@ int MYSQLparse (THD *thd); bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); -#line 2412 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:358 */ +#line 2414 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:358 */ #ifdef short # undef short @@ -2650,21 +2652,21 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 635 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 66200 +#define YYLAST 66418 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 666 +#define YYNTOKENS 667 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 1028 +#define YYNNTS 1031 /* YYNRULES -- Number of rules. */ -#define YYNRULES 2854 +#define YYNRULES 2860 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 4891 +#define YYNSTATES 4901 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned by yylex, with out-of-bounds checking. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 898 +#define YYMAXUTOK 899 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -2676,16 +2678,16 @@ static const yytype_uint16 yytranslate[] = 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 659, 2, 2, 2, 653, 648, 2, - 656, 657, 651, 650, 658, 649, 664, 652, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 665, 662, - 646, 644, 645, 2, 663, 2, 2, 2, 2, 2, + 2, 2, 2, 660, 2, 2, 2, 654, 649, 2, + 657, 658, 652, 651, 659, 650, 665, 653, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 666, 663, + 647, 645, 646, 2, 664, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 654, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 655, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 660, 647, 661, 655, 2, 2, 2, + 2, 2, 2, 661, 648, 662, 656, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -2762,239 +2764,238 @@ static const yytype_uint16 yytranslate[] = 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, - 635, 636, 637, 638, 639, 640, 641, 642, 643 + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 2023, 2023, 2033, 2032, 2057, 2064, 2066, 2070, 2071, - 2072, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, - 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, - 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, - 2106, 2107, 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, - 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, - 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2136, 2145, 2146, - 2150, 2159, 2165, 2175, 2174, 2184, 2186, 2190, 2191, 2195, - 2209, 2208, 2225, 2224, 2233, 2234, 2238, 2242, 2246, 2250, - 2254, 2258, 2263, 2267, 2271, 2275, 2279, 2283, 2288, 2292, - 2297, 2324, 2328, 2332, 2337, 2340, 2342, 2343, 2347, 2353, - 2355, 2356, 2360, 2366, 2368, 2369, 2373, 2380, 2384, 2399, - 2403, 2409, 2415, 2421, 2431, 2435, 2439, 2453, 2452, 2491, - 2488, 2501, 2499, 2511, 2509, 2520, 2519, 2532, 2531, 2540, - 2545, 2551, 2555, 2559, 2559, 2566, 2565, 2577, 2578, 2582, - 2587, 2592, 2597, 2602, 2607, 2612, 2620, 2619, 2651, 2650, - 2657, 2664, 2665, 2671, 2677, 2687, 2693, 2699, 2701, 2708, - 2709, 2713, 2723, 2724, 2732, 2732, 2776, 2790, 2801, 2819, - 2820, 2824, 2825, 2830, 2832, 2834, 2836, 2838, 2840, 2842, - 2848, 2849, 2853, 2857, 2865, 2864, 2877, 2879, 2882, 2884, - 2888, 2892, 2899, 2901, 2905, 2906, 2911, 2910, 2943, 2945, - 2949, 2950, 2954, 2958, 2959, 2960, 2961, 2965, 2966, 2970, - 2971, 2976, 2979, 2998, 2997, 3069, 3082, 3081, 3140, 3162, - 3162, 3181, 3182, 3187, 3189, 3194, 3209, 3217, 3221, 3240, - 3241, 3245, 3249, 3255, 3261, 3267, 3276, 3290, 3305, 3311, - 3312, 3318, 3321, 3325, 3333, 3350, 3352, 3370, 3376, 3378, - 3380, 3382, 3384, 3386, 3388, 3390, 3392, 3394, 3396, 3398, - 3403, 3418, 3434, 3435, 3440, 3446, 3455, 3461, 3470, 3478, - 3487, 3496, 3498, 3507, 3512, 3518, 3527, 3535, 3537, 3539, - 3541, 3543, 3545, 3547, 3549, 3551, 3553, 3555, 3557, 3559, - 3564, 3576, 3591, 3592, 3596, 3597, 3598, 3599, 3600, 3601, - 3602, 3603, 3604, 3605, 3606, 3610, 3611, 3612, 3613, 3618, - 3617, 3628, 3628, 3681, 3680, 3705, 3755, 3796, 3815, 3814, - 3834, 3851, 3853, 3854, 3858, 3872, 3889, 3891, 3907, 3889, - 3926, 3928, 3929, 3934, 3933, 4003, 4005, 4003, 4014, 4019, - 4020, 4024, 4025, 4030, 4034, 4029, 4055, 4059, 4054, 4078, - 4088, 4092, 4093, 4098, 4097, 4119, 4118, 4128, 4127, 4138, - 4138, 4178, 4193, 4192, 4224, 4223, 4243, 4257, 4266, 4265, - 4273, 4272, 4281, 4280, 4291, 4290, 4299, 4298, 4308, 4307, - 4318, 4320, 4325, 4327, 4329, 4346, 4351, 4357, 4364, 4365, - 4373, 4379, 4388, 4394, 4400, 4401, 4405, 4405, 4410, 4411, - 4412, 4416, 4417, 4418, 4422, 4426, 4427, 4428, 4432, 4433, - 4434, 4435, 4436, 4437, 4438, 4439, 4443, 4447, 4448, 4449, - 4453, 4454, 4455, 4456, 4457, 4461, 4465, 4466, 4467, 4471, - 4472, 4473, 4474, 4475, 4476, 4477, 4481, 4485, 4486, 4487, - 4491, 4492, 4493, 4498, 4506, 4514, 4522, 4535, 4548, 4553, - 4558, 4566, 4574, 4582, 4590, 4598, 4606, 4614, 4624, 4634, - 4644, 4646, 4650, 4655, 4665, 4666, 4705, 4704, 4707, 4713, - 4713, 4714, 4728, 4729, 4733, 4735, 4734, 4738, 4737, 4743, - 4780, 4781, 4786, 4785, 4804, 4819, 4818, 4835, 4839, 4847, - 4846, 4849, 4851, 4853, 4855, 4860, 4861, 4867, 4868, 4885, - 4886, 4890, 4891, 4895, 4911, 4921, 4932, 4941, 4942, 4955, - 4957, 4956, 4961, 4959, 4970, 4971, 4975, 4990, 5006, 5007, - 5020, 5029, 5051, 5052, 5057, 5056, 5081, 5093, 5109, 5108, - 5123, 5122, 5139, 5161, 5165, 5194, 5206, 5207, 5212, 5223, - 5211, 5248, 5249, 5253, 5266, 5287, 5300, 5326, 5327, 5332, - 5331, 5369, 5378, 5379, 5383, 5384, 5388, 5390, 5396, 5402, - 5404, 5406, 5408, 5410, 5412, 5422, 5437, 5421, 5451, 5452, - 5456, 5457, 5461, 5462, 5466, 5467, 5472, 5475, 5483, 5486, - 5493, 5497, 5503, 5505, 5509, 5510, 5514, 5515, 5516, 5520, - 5525, 5530, 5535, 5540, 5545, 5550, 5555, 5570, 5576, 5591, - 5596, 5611, 5617, 5635, 5640, 5645, 5650, 5655, 5660, 5666, - 5665, 5691, 5692, 5693, 5698, 5703, 5708, 5710, 5712, 5714, - 5720, 5725, 5730, 5738, 5746, 5752, 5761, 5769, 5786, 5807, - 5818, 5819, 5820, 5821, 5822, 5823, 5824, 5828, 5829, 5830, - 5834, 5835, 5836, 5837, 5842, 5849, 5850, 5854, 5855, 5859, - 5860, 5865, 5864, 5872, 5871, 5879, 5878, 5886, 5885, 5895, - 5892, 5903, 5901, 5910, 5909, 5944, 5947, 5949, 5953, 5957, - 5958, 5962, 5967, 5980, 5966, 5999, 6000, 6006, 6007, 6012, - 6015, 6019, 6026, 6027, 6031, 6032, 6036, 6042, 6048, 6052, - 6065, 6082, 6083, 6084, 6099, 6104, 6108, 6113, 6118, 6122, - 6127, 6132, 6138, 6143, 6149, 6153, 6158, 6163, 6181, 6183, - 6186, 6203, 6206, 6211, 6216, 6227, 6232, 6237, 6242, 6244, - 6246, 6248, 6250, 6252, 6254, 6256, 6258, 6260, 6262, 6264, - 6273, 6274, 6275, 6281, 6282, 6283, 6284, 6285, 6289, 6293, - 6294, 6298, 6299, 6303, 6304, 6305, 6306, 6307, 6311, 6312, - 6313, 6314, 6315, 6319, 6324, 6326, 6332, 6334, 6342, 6343, - 6345, 6350, 6359, 6360, 6364, 6365, 6369, 6370, 6371, 6375, - 6376, 6377, 6378, 6381, 6382, 6386, 6387, 6391, 6392, 6396, - 6397, 6401, 6402, 6403, 6404, 6411, 6412, 6418, 6424, 6430, - 6436, 6437, 6444, 6452, 6460, 6466, 6475, 6490, 6496, 6501, - 6502, 6506, 6511, 6515, 6516, 6520, 6521, 6525, 6531, 6535, - 6536, 6540, 6548, 6549, 6553, 6554, 6558, 6559, 6563, 6564, - 6565, 6573, 6574, 6575, 6576, 6577, 6581, 6582, 6587, 6586, - 6599, 6600, 6604, 6607, 6608, 6609, 6610, 6614, 6622, 6629, - 6630, 6634, 6644, 6645, 6649, 6650, 6653, 6655, 6659, 6671, - 6672, 6676, 6683, 6696, 6697, 6699, 6701, 6707, 6712, 6718, - 6724, 6731, 6741, 6742, 6743, 6744, 6745, 6749, 6750, 6754, - 6755, 6759, 6760, 6764, 6765, 6766, 6770, 6771, 6775, 6779, - 6791, 6792, 6796, 6797, 6801, 6802, 6806, 6807, 6811, 6812, - 6816, 6817, 6821, 6822, 6826, 6827, 6828, 6831, 6833, 6838, - 6840, 6842, 6850, 6858, 6864, 6872, 6873, 6877, 6881, 6882, - 6892, 6893, 6894, 6898, 6902, 6909, 6915, 6927, 6928, 6932, - 6933, 6937, 6939, 6948, 6962, 6947, 6982, 6981, 6995, 7004, - 7003, 7019, 7018, 7034, 7033, 7049, 7043, 7060, 7059, 7094, - 7099, 7104, 7109, 7115, 7114, 7123, 7124, 7125, 7126, 7130, - 7131, 7143, 7144, 7148, 7149, 7152, 7154, 7162, 7170, 7172, - 7174, 7175, 7183, 7184, 7190, 7199, 7197, 7210, 7223, 7222, - 7235, 7233, 7246, 7253, 7263, 7264, 7291, 7298, 7302, 7308, - 7306, 7325, 7327, 7332, 7340, 7339, 7355, 7359, 7358, 7370, - 7371, 7375, 7391, 7392, 7396, 7404, 7408, 7413, 7418, 7425, - 7432, 7442, 7452, 7463, 7473, 7479, 7485, 7494, 7504, 7520, - 7534, 7544, 7548, 7553, 7554, 7557, 7559, 7560, 7561, 7562, - 7565, 7570, 7578, 7583, 7591, 7592, 7596, 7597, 7601, 7601, - 7604, 7606, 7610, 7611, 7615, 7616, 7624, 7625, 7626, 7630, - 7631, 7636, 7644, 7645, 7646, 7647, 7652, 7651, 7661, 7660, - 7667, 7674, 7684, 7701, 7704, 7711, 7715, 7722, 7726, 7730, - 7737, 7737, 7743, 7744, 7748, 7749, 7750, 7754, 7755, 7764, - 7771, 7772, 7777, 7776, 7788, 7789, 7790, 7794, 7795, 7795, - 7800, 7799, 7820, 7821, 7825, 7826, 7830, 7831, 7832, 7836, - 7837, 7842, 7841, 7862, 7863, 7867, 7872, 7873, 7880, 7882, - 7886, 7888, 7887, 7899, 7901, 7900, 7913, 7914, 7919, 7928, - 7929, 7930, 7934, 7941, 7951, 7959, 7960, 7960, 7964, 7963, - 7986, 7987, 7991, 7992, 7996, 7997, 7998, 7999, 8000, 8001, - 8005, 8006, 8011, 8010, 8031, 8032, 8033, 8038, 8037, 8043, - 8050, 8056, 8065, 8066, 8070, 8084, 8083, 8096, 8097, 8101, - 8102, 8106, 8116, 8126, 8127, 8132, 8131, 8142, 8143, 8147, - 8148, 8152, 8162, 8173, 8172, 8180, 8180, 8189, 8190, 8195, - 8196, 8205, 8214, 8215, 8219, 8219, 8231, 8236, 8236, 8245, - 8250, 8249, 8264, 8268, 8269, 8290, 8290, 8304, 8315, 8318, - 8320, 8324, 8330, 8337, 8339, 8347, 8348, 8352, 8353, 8370, - 8389, 8391, 8398, 8409, 8410, 8411, 8425, 8430, 8452, 8458, - 8464, 8470, 8471, 8472, 8473, 8474, 8478, 8479, 8480, 8484, - 8485, 8486, 8490, 8491, 8496, 8547, 8554, 8597, 8603, 8609, - 8615, 8621, 8627, 8633, 8639, 8643, 8649, 8655, 8661, 8667, - 8673, 8677, 8683, 8692, 8698, 8706, 8712, 8722, 8728, 8737, - 8747, 8754, 8764, 8770, 8779, 8783, 8789, 8795, 8801, 8807, - 8813, 8819, 8825, 8831, 8837, 8843, 8849, 8855, 8861, 8867, - 8871, 8872, 8876, 8877, 8881, 8882, 8886, 8887, 8891, 8892, - 8893, 8894, 8895, 8896, 8900, 8901, 8906, 8912, 8916, 8923, - 8930, 8937, 8944, 8951, 8957, 8956, 8964, 8971, 8978, 8986, - 8997, 9019, 9026, 9034, 9035, 9036, 9037, 9038, 9039, 9050, - 9051, 9052, 9053, 9054, 9060, 9064, 9070, 9076, 9082, 9088, - 9090, 9097, 9104, 9110, 9134, 9144, 9151, 9159, 9165, 9172, - 9178, 9188, 9195, 9211, 9217, 9223, 9232, 9241, 9247, 9253, - 9259, 9265, 9279, 9290, 9296, 9302, 9308, 9314, 9320, 9327, - 9334, 9340, 9346, 9352, 9358, 9364, 9370, 9376, 9382, 9388, - 9396, 9417, 9424, 9430, 9437, 9444, 9451, 9458, 9464, 9470, - 9477, 9483, 9490, 9496, 9502, 9508, 9514, 9520, 9538, 9544, - 9550, 9557, 9564, 9572, 9579, 9586, 9593, 9600, 9617, 9623, - 9629, 9635, 9641, 9648, 9654, 9660, 9666, 9672, 9678, 9684, - 9691, 9699, 9705, 9711, 9717, 9723, 9731, 9737, 9751, 9757, - 9763, 9771, 9783, 9790, 9805, 9811, 9818, 9825, 9832, 9839, - 9846, 9850, 9870, 9869, 9941, 9979, 9981, 9986, 9987, 9991, - 9992, 9996, 9997, 10001, 10008, 10016, 10043, 10049, 10055, 10061, - 10067, 10073, 10082, 10089, 10091, 10088, 10098, 10109, 10115, 10121, - 10127, 10133, 10139, 10145, 10151, 10157, 10164, 10163, 10183, 10182, - 10194, 10204, 10212, 10228, 10229, 10234, 10239, 10242, 10245, 10244, - 10260, 10262, 10268, 10267, 10284, 10287, 10286, 10290, 10292, 10294, - 10296, 10298, 10300, 10302, 10304, 10310, 10316, 10319, 10318, 10324, - 10325, 10329, 10336, 10344, 10345, 10349, 10356, 10364, 10365, 10369, - 10370, 10374, 10382, 10393, 10394, 10406, 10417, 10418, 10424, 10425, - 10445, 10449, 10447, 10465, 10463, 10474, 10484, 10482, 10500, 10499, - 10509, 10520, 10518, 10537, 10536, 10547, 10559, 10560, 10561, 10565, - 10566, 10574, 10575, 10579, 10594, 10594, 10609, 10645, 10730, 10741, - 10738, 10763, 10776, 10776, 10792, 10791, 10812, 10829, 10812, 10836, - 10840, 10863, 10864, 10869, 10872, 10873, 10874, 10878, 10879, 10884, - 10883, 10889, 10888, 10896, 10897, 10900, 10902, 10902, 10906, 10906, - 10911, 10912, 10916, 10918, 10923, 10924, 10928, 10939, 10952, 10953, - 10954, 10955, 10956, 10957, 10958, 10959, 10960, 10961, 10962, 10963, - 10967, 10968, 10969, 10970, 10971, 10972, 10973, 10974, 10975, 10979, - 10980, 10981, 10982, 10985, 10987, 10988, 10992, 10993, 11001, 11003, - 11007, 11009, 11008, 11022, 11025, 11024, 11039, 11045, 11059, 11061, - 11065, 11067, 11072, 11073, 11090, 11112, 11116, 11117, 11121, 11133, - 11135, 11140, 11139, 11189, 11191, 11196, 11197, 11198, 11202, 11203, - 11207, 11220, 11227, 11232, 11239, 11246, 11253, 11263, 11290, 11294, - 11300, 11306, 11315, 11323, 11327, 11334, 11335, 11339, 11340, 11341, - 11345, 11346, 11347, 11348, 11349, 11350, 11354, 11355, 11356, 11357, - 11358, 11362, 11363, 11364, 11365, 11366, 11370, 11371, 11372, 11373, - 11374, 11378, 11383, 11384, 11388, 11389, 11393, 11395, 11394, 11432, - 11433, 11437, 11438, 11442, 11452, 11452, 11463, 11464, 11467, 11487, - 11491, 11505, 11506, 11511, 11510, 11520, 11530, 11519, 11532, 11545, - 11557, 11556, 11574, 11573, 11582, 11582, 11599, 11605, 11620, 11636, - 11644, 11648, 11653, 11652, 11661, 11666, 11672, 11677, 11682, 11690, - 11691, 11695, 11706, 11719, 11720, 11724, 11736, 11740, 11749, 11752, - 11759, 11760, 11768, 11776, 11767, 11786, 11793, 11785, 11803, 11811, - 11812, 11820, 11824, 11825, 11836, 11837, 11841, 11850, 11851, 11852, - 11854, 11853, 11864, 11866, 11870, 11871, 11873, 11872, 11876, 11875, - 11881, 11882, 11886, 11887, 11891, 11901, 11902, 11906, 11907, 11912, - 11911, 11925, 11926, 11930, 11935, 11943, 11944, 11952, 11954, 11954, - 11962, 11970, 11961, 11992, 11993, 11997, 12005, 12006, 12010, 12020, - 12021, 12028, 12027, 12043, 12054, 12042, 12057, 12056, 12068, 12067, - 12080, 12082, 12086, 12087, 12091, 12104, 12120, 12121, 12125, 12126, - 12130, 12131, 12132, 12137, 12136, 12157, 12159, 12162, 12164, 12167, - 12168, 12171, 12175, 12179, 12183, 12187, 12191, 12195, 12199, 12203, - 12211, 12214, 12224, 12223, 12239, 12246, 12254, 12262, 12270, 12278, - 12286, 12293, 12300, 12306, 12308, 12310, 12319, 12323, 12328, 12327, - 12334, 12333, 12338, 12347, 12354, 12359, 12364, 12369, 12371, 12373, - 12375, 12377, 12379, 12386, 12394, 12396, 12404, 12411, 12418, 12425, - 12431, 12436, 12444, 12452, 12456, 12461, 12468, 12473, 12480, 12487, - 12493, 12500, 12507, 12512, 12517, 12522, 12529, 12551, 12553, 12555, - 12560, 12561, 12564, 12566, 12570, 12571, 12575, 12576, 12580, 12581, - 12585, 12586, 12590, 12591, 12595, 12596, 12604, 12616, 12615, 12631, - 12630, 12640, 12641, 12642, 12643, 12644, 12648, 12649, 12653, 12660, - 12661, 12662, 12666, 12667, 12679, 12680, 12681, 12696, 12695, 12708, - 12707, 12719, 12723, 12724, 12737, 12740, 12739, 12751, 12752, 12757, - 12759, 12761, 12763, 12765, 12767, 12775, 12777, 12779, 12781, 12786, - 12788, 12796, 12798, 12800, 12802, 12818, 12819, 12823, 12824, 12828, - 12827, 12837, 12838, 12842, 12842, 12846, 12845, 12851, 12855, 12856, - 12860, 12861, 12869, 12868, 12879, 12883, 12887, 12900, 12899, 12914, - 12915, 12916, 12919, 12920, 12921, 12922, 12930, 12934, 12943, 12949, - 12961, 12972, 12982, 12992, 12960, 13000, 13001, 13005, 13006, 13010, - 13011, 13019, 13023, 13024, 13025, 13028, 13030, 13034, 13035, 13039, - 13044, 13051, 13056, 13063, 13065, 13069, 13070, 13074, 13079, 13087, - 13088, 13091, 13093, 13101, 13102, 13106, 13107, 13108, 13112, 13114, - 13119, 13120, 13129, 13130, 13134, 13135, 13139, 13152, 13176, 13188, - 13195, 13214, 13222, 13227, 13240, 13249, 13265, 13282, 13283, 13284, - 13292, 13293, 13294, 13295, 13309, 13315, 13321, 13327, 13333, 13339, - 13357, 13367, 13377, 13383, 13392, 13404, 13410, 13416, 13432, 13433, - 13437, 13446, 13461, 13465, 13508, 13512, 13529, 13533, 13605, 13629, - 13659, 13660, 13670, 13677, 13681, 13687, 13693, 13703, 13709, 13718, - 13728, 13729, 13757, 13771, 13785, 13800, 13801, 13811, 13812, 13822, - 13823, 13824, 13828, 13841, 13871, 13881, 13881, 13883, 13893, 13894, - 13895, 13896, 13897, 13898, 13899, 13900, 13901, 13902, 13903, 13904, - 13905, 13906, 13907, 13908, 13909, 13910, 13911, 13912, 13913, 13914, + 0, 2025, 2025, 2035, 2034, 2059, 2066, 2068, 2072, 2073, + 2074, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, + 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, + 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, + 2108, 2109, 2110, 2111, 2112, 2113, 2114, 2115, 2116, 2117, + 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2127, + 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2138, 2147, 2148, + 2152, 2161, 2167, 2177, 2176, 2186, 2188, 2192, 2193, 2197, + 2211, 2210, 2227, 2226, 2235, 2236, 2240, 2244, 2248, 2252, + 2256, 2260, 2265, 2269, 2273, 2277, 2281, 2285, 2290, 2294, + 2299, 2326, 2330, 2334, 2339, 2342, 2344, 2345, 2349, 2355, + 2357, 2358, 2362, 2368, 2370, 2371, 2375, 2382, 2386, 2401, + 2405, 2411, 2417, 2423, 2433, 2437, 2441, 2455, 2454, 2493, + 2490, 2503, 2501, 2513, 2511, 2522, 2521, 2534, 2533, 2542, + 2547, 2553, 2557, 2561, 2561, 2568, 2567, 2579, 2580, 2584, + 2589, 2594, 2599, 2604, 2609, 2614, 2622, 2621, 2653, 2652, + 2659, 2666, 2667, 2673, 2679, 2689, 2695, 2701, 2703, 2710, + 2711, 2715, 2725, 2726, 2734, 2734, 2778, 2792, 2803, 2821, + 2822, 2826, 2827, 2832, 2834, 2836, 2838, 2840, 2842, 2844, + 2850, 2851, 2855, 2859, 2867, 2866, 2879, 2881, 2884, 2886, + 2890, 2894, 2901, 2903, 2907, 2908, 2913, 2912, 2945, 2947, + 2951, 2952, 2956, 2960, 2961, 2962, 2963, 2967, 2968, 2972, + 2973, 2978, 2981, 3000, 2999, 3071, 3084, 3083, 3142, 3164, + 3164, 3183, 3184, 3189, 3191, 3196, 3211, 3219, 3223, 3242, + 3243, 3247, 3251, 3257, 3263, 3269, 3278, 3292, 3307, 3313, + 3314, 3320, 3323, 3327, 3335, 3352, 3354, 3372, 3378, 3380, + 3382, 3384, 3386, 3388, 3390, 3392, 3394, 3396, 3398, 3400, + 3405, 3420, 3436, 3437, 3442, 3448, 3457, 3463, 3472, 3480, + 3489, 3498, 3500, 3509, 3514, 3520, 3529, 3537, 3539, 3541, + 3543, 3545, 3547, 3549, 3551, 3553, 3555, 3557, 3559, 3561, + 3566, 3578, 3593, 3594, 3598, 3599, 3600, 3601, 3602, 3603, + 3604, 3605, 3606, 3607, 3608, 3612, 3613, 3614, 3615, 3620, + 3619, 3630, 3630, 3683, 3682, 3707, 3757, 3798, 3817, 3816, + 3836, 3853, 3855, 3856, 3860, 3874, 3891, 3893, 3909, 3891, + 3928, 3930, 3931, 3936, 3935, 4005, 4007, 4005, 4016, 4021, + 4022, 4026, 4027, 4032, 4036, 4031, 4057, 4061, 4056, 4080, + 4090, 4094, 4095, 4100, 4099, 4121, 4120, 4130, 4129, 4140, + 4140, 4180, 4195, 4194, 4226, 4225, 4245, 4259, 4268, 4267, + 4275, 4274, 4283, 4282, 4293, 4292, 4301, 4300, 4310, 4309, + 4320, 4322, 4327, 4329, 4331, 4348, 4353, 4359, 4366, 4367, + 4375, 4381, 4390, 4396, 4402, 4403, 4407, 4407, 4412, 4413, + 4414, 4418, 4419, 4420, 4424, 4428, 4429, 4430, 4434, 4435, + 4436, 4437, 4438, 4439, 4440, 4441, 4445, 4449, 4450, 4451, + 4455, 4456, 4457, 4458, 4459, 4463, 4467, 4468, 4469, 4473, + 4474, 4475, 4476, 4477, 4478, 4479, 4483, 4487, 4488, 4489, + 4493, 4494, 4495, 4500, 4508, 4516, 4524, 4537, 4550, 4555, + 4560, 4568, 4576, 4584, 4592, 4600, 4608, 4616, 4626, 4636, + 4646, 4648, 4652, 4657, 4667, 4668, 4707, 4706, 4709, 4715, + 4715, 4716, 4730, 4731, 4735, 4737, 4736, 4740, 4739, 4745, + 4782, 4783, 4788, 4787, 4806, 4821, 4820, 4837, 4841, 4849, + 4848, 4851, 4853, 4855, 4857, 4862, 4863, 4869, 4870, 4887, + 4888, 4892, 4893, 4897, 4913, 4923, 4934, 4943, 4944, 4957, + 4959, 4958, 4963, 4961, 4972, 4973, 4977, 4992, 5008, 5009, + 5022, 5031, 5053, 5054, 5059, 5058, 5083, 5095, 5107, 5106, + 5121, 5120, 5137, 5159, 5163, 5192, 5204, 5205, 5210, 5221, + 5209, 5246, 5247, 5251, 5264, 5285, 5298, 5324, 5325, 5330, + 5329, 5367, 5376, 5377, 5381, 5382, 5386, 5388, 5394, 5400, + 5402, 5404, 5406, 5408, 5410, 5420, 5435, 5419, 5449, 5450, + 5454, 5455, 5459, 5460, 5464, 5465, 5470, 5473, 5481, 5484, + 5491, 5495, 5501, 5503, 5507, 5508, 5512, 5513, 5514, 5518, + 5523, 5528, 5533, 5538, 5543, 5548, 5553, 5568, 5574, 5589, + 5594, 5609, 5615, 5633, 5638, 5643, 5648, 5653, 5658, 5664, + 5663, 5689, 5690, 5691, 5696, 5701, 5706, 5708, 5710, 5712, + 5718, 5723, 5728, 5736, 5744, 5750, 5759, 5767, 5784, 5805, + 5816, 5817, 5818, 5819, 5820, 5821, 5822, 5826, 5827, 5828, + 5832, 5833, 5834, 5835, 5840, 5847, 5848, 5852, 5853, 5857, + 5858, 5863, 5862, 5870, 5869, 5877, 5876, 5884, 5883, 5893, + 5890, 5901, 5899, 5908, 5907, 5942, 5945, 5947, 5951, 5955, + 5956, 5960, 5965, 5978, 5964, 5997, 5998, 6004, 6005, 6010, + 6013, 6017, 6024, 6025, 6029, 6030, 6034, 6040, 6046, 6050, + 6063, 6080, 6081, 6082, 6097, 6102, 6106, 6111, 6116, 6120, + 6125, 6130, 6136, 6141, 6147, 6151, 6156, 6161, 6179, 6181, + 6184, 6201, 6204, 6209, 6214, 6225, 6230, 6235, 6240, 6242, + 6244, 6246, 6248, 6250, 6252, 6254, 6256, 6258, 6260, 6262, + 6271, 6272, 6273, 6279, 6280, 6281, 6282, 6283, 6287, 6291, + 6292, 6296, 6297, 6301, 6302, 6303, 6304, 6305, 6309, 6310, + 6311, 6312, 6313, 6317, 6322, 6324, 6330, 6332, 6340, 6341, + 6343, 6348, 6357, 6358, 6362, 6363, 6367, 6368, 6369, 6373, + 6374, 6375, 6376, 6379, 6380, 6384, 6385, 6389, 6390, 6394, + 6395, 6399, 6400, 6401, 6402, 6409, 6410, 6416, 6422, 6428, + 6434, 6435, 6442, 6450, 6458, 6464, 6473, 6488, 6494, 6499, + 6500, 6504, 6509, 6513, 6514, 6518, 6519, 6523, 6529, 6533, + 6534, 6538, 6546, 6547, 6551, 6552, 6556, 6557, 6561, 6562, + 6563, 6571, 6572, 6573, 6574, 6575, 6579, 6580, 6585, 6584, + 6597, 6598, 6602, 6605, 6606, 6607, 6608, 6612, 6620, 6627, + 6628, 6632, 6642, 6643, 6647, 6648, 6651, 6653, 6657, 6669, + 6670, 6674, 6681, 6694, 6695, 6697, 6699, 6705, 6710, 6716, + 6722, 6729, 6739, 6740, 6741, 6742, 6743, 6747, 6748, 6752, + 6753, 6757, 6758, 6762, 6763, 6764, 6768, 6769, 6773, 6777, + 6789, 6790, 6794, 6795, 6799, 6800, 6804, 6805, 6809, 6810, + 6814, 6815, 6819, 6820, 6824, 6825, 6826, 6829, 6831, 6836, + 6838, 6840, 6848, 6856, 6862, 6870, 6871, 6875, 6879, 6880, + 6890, 6891, 6892, 6896, 6900, 6907, 6913, 6925, 6926, 6930, + 6931, 6935, 6937, 6946, 6960, 6945, 6980, 6979, 6993, 7002, + 7001, 7017, 7016, 7032, 7031, 7047, 7041, 7058, 7057, 7092, + 7097, 7102, 7107, 7113, 7112, 7121, 7122, 7123, 7124, 7128, + 7129, 7141, 7142, 7146, 7147, 7150, 7152, 7160, 7168, 7170, + 7172, 7173, 7181, 7182, 7188, 7197, 7195, 7208, 7221, 7220, + 7233, 7231, 7244, 7251, 7261, 7262, 7289, 7296, 7300, 7306, + 7304, 7323, 7325, 7330, 7338, 7337, 7353, 7357, 7356, 7368, + 7369, 7373, 7389, 7390, 7394, 7402, 7406, 7411, 7416, 7423, + 7430, 7440, 7450, 7461, 7471, 7477, 7483, 7492, 7502, 7518, + 7532, 7542, 7546, 7551, 7552, 7555, 7557, 7558, 7559, 7560, + 7563, 7568, 7576, 7581, 7589, 7590, 7594, 7595, 7599, 7599, + 7602, 7604, 7608, 7609, 7613, 7614, 7622, 7623, 7624, 7628, + 7629, 7634, 7642, 7643, 7644, 7645, 7650, 7649, 7659, 7658, + 7665, 7672, 7682, 7699, 7702, 7709, 7713, 7720, 7724, 7728, + 7735, 7735, 7741, 7742, 7746, 7747, 7748, 7752, 7753, 7762, + 7769, 7770, 7775, 7774, 7786, 7787, 7788, 7792, 7793, 7793, + 7798, 7797, 7818, 7819, 7823, 7824, 7828, 7829, 7830, 7834, + 7835, 7840, 7839, 7860, 7861, 7865, 7870, 7871, 7878, 7880, + 7884, 7886, 7885, 7897, 7899, 7898, 7911, 7912, 7917, 7926, + 7927, 7928, 7932, 7939, 7949, 7957, 7958, 7958, 7962, 7961, + 7984, 7985, 7989, 7990, 7994, 7995, 7996, 7997, 7998, 7999, + 8003, 8004, 8009, 8008, 8029, 8030, 8031, 8036, 8035, 8041, + 8048, 8054, 8063, 8064, 8068, 8082, 8081, 8094, 8095, 8099, + 8100, 8104, 8114, 8124, 8125, 8130, 8129, 8140, 8141, 8145, + 8146, 8150, 8160, 8171, 8170, 8178, 8178, 8187, 8188, 8193, + 8194, 8203, 8212, 8213, 8217, 8217, 8229, 8234, 8234, 8243, + 8248, 8247, 8262, 8266, 8267, 8288, 8288, 8302, 8313, 8316, + 8318, 8322, 8328, 8335, 8337, 8345, 8346, 8350, 8351, 8368, + 8387, 8389, 8396, 8407, 8408, 8409, 8423, 8428, 8450, 8456, + 8462, 8468, 8469, 8470, 8471, 8472, 8476, 8477, 8478, 8482, + 8483, 8484, 8488, 8489, 8494, 8545, 8552, 8595, 8601, 8607, + 8613, 8619, 8625, 8631, 8637, 8641, 8647, 8653, 8659, 8665, + 8671, 8675, 8681, 8690, 8696, 8704, 8710, 8720, 8726, 8735, + 8745, 8752, 8762, 8768, 8777, 8781, 8787, 8793, 8799, 8805, + 8811, 8817, 8823, 8829, 8835, 8841, 8847, 8853, 8859, 8865, + 8869, 8870, 8874, 8875, 8879, 8880, 8884, 8885, 8889, 8890, + 8891, 8892, 8893, 8894, 8898, 8899, 8904, 8910, 8914, 8921, + 8928, 8935, 8942, 8949, 8955, 8954, 8962, 8969, 8976, 8984, + 8995, 9017, 9024, 9032, 9033, 9034, 9035, 9036, 9037, 9048, + 9049, 9050, 9051, 9052, 9058, 9062, 9068, 9074, 9080, 9086, + 9088, 9095, 9102, 9108, 9132, 9142, 9149, 9157, 9163, 9170, + 9176, 9186, 9193, 9209, 9215, 9221, 9230, 9239, 9245, 9251, + 9257, 9263, 9277, 9288, 9294, 9300, 9306, 9312, 9318, 9325, + 9332, 9338, 9344, 9350, 9356, 9362, 9368, 9374, 9380, 9386, + 9394, 9415, 9422, 9428, 9435, 9442, 9449, 9456, 9462, 9468, + 9475, 9481, 9488, 9494, 9500, 9506, 9512, 9518, 9536, 9542, + 9548, 9555, 9562, 9570, 9577, 9584, 9591, 9598, 9615, 9621, + 9627, 9633, 9639, 9646, 9652, 9658, 9664, 9670, 9676, 9682, + 9689, 9697, 9703, 9709, 9715, 9721, 9729, 9735, 9749, 9755, + 9761, 9769, 9781, 9788, 9803, 9809, 9816, 9823, 9830, 9837, + 9844, 9848, 9868, 9867, 9939, 9977, 9979, 9984, 9985, 9989, + 9990, 9994, 9995, 9999, 10006, 10014, 10041, 10047, 10053, 10059, + 10065, 10071, 10080, 10087, 10089, 10086, 10096, 10107, 10113, 10119, + 10125, 10131, 10137, 10143, 10149, 10155, 10162, 10161, 10181, 10180, + 10192, 10202, 10210, 10226, 10227, 10232, 10237, 10240, 10243, 10242, + 10258, 10260, 10266, 10265, 10282, 10285, 10284, 10288, 10290, 10292, + 10294, 10296, 10298, 10300, 10302, 10308, 10314, 10317, 10316, 10322, + 10323, 10327, 10334, 10342, 10343, 10347, 10354, 10362, 10363, 10367, + 10368, 10372, 10380, 10391, 10392, 10404, 10415, 10416, 10422, 10423, + 10443, 10447, 10445, 10463, 10461, 10472, 10482, 10480, 10498, 10497, + 10507, 10518, 10516, 10535, 10534, 10545, 10557, 10558, 10559, 10563, + 10564, 10572, 10573, 10577, 10592, 10592, 10607, 10643, 10728, 10739, + 10736, 10761, 10774, 10774, 10790, 10789, 10810, 10827, 10810, 10834, + 10838, 10861, 10862, 10867, 10870, 10871, 10872, 10876, 10877, 10882, + 10881, 10887, 10886, 10894, 10895, 10898, 10900, 10900, 10904, 10904, + 10909, 10910, 10914, 10916, 10921, 10922, 10926, 10937, 10950, 10951, + 10952, 10953, 10954, 10955, 10956, 10957, 10958, 10959, 10960, 10961, + 10965, 10966, 10967, 10968, 10969, 10970, 10971, 10972, 10973, 10977, + 10978, 10979, 10980, 10983, 10985, 10986, 10990, 10991, 10999, 11001, + 11005, 11007, 11006, 11020, 11023, 11022, 11037, 11043, 11057, 11059, + 11063, 11065, 11070, 11071, 11088, 11110, 11114, 11115, 11119, 11131, + 11133, 11138, 11137, 11187, 11189, 11194, 11195, 11196, 11200, 11201, + 11205, 11218, 11225, 11230, 11237, 11244, 11251, 11261, 11288, 11292, + 11298, 11304, 11313, 11321, 11325, 11332, 11333, 11337, 11338, 11339, + 11343, 11344, 11345, 11346, 11347, 11348, 11352, 11353, 11354, 11355, + 11356, 11360, 11361, 11362, 11363, 11364, 11368, 11369, 11370, 11371, + 11372, 11376, 11381, 11382, 11386, 11387, 11391, 11393, 11392, 11430, + 11431, 11435, 11436, 11440, 11450, 11450, 11461, 11462, 11465, 11485, + 11489, 11503, 11504, 11509, 11508, 11518, 11528, 11517, 11530, 11543, + 11555, 11554, 11572, 11571, 11580, 11580, 11597, 11603, 11618, 11634, + 11642, 11646, 11651, 11650, 11659, 11664, 11670, 11675, 11680, 11688, + 11689, 11693, 11704, 11717, 11718, 11722, 11734, 11738, 11747, 11750, + 11757, 11758, 11766, 11774, 11765, 11784, 11791, 11783, 11801, 11809, + 11810, 11818, 11822, 11823, 11834, 11835, 11839, 11848, 11849, 11850, + 11852, 11851, 11862, 11864, 11868, 11869, 11871, 11870, 11874, 11873, + 11879, 11880, 11884, 11885, 11889, 11899, 11900, 11904, 11905, 11910, + 11909, 11923, 11924, 11928, 11933, 11941, 11942, 11950, 11952, 11952, + 11960, 11968, 11959, 11990, 11991, 11995, 12003, 12004, 12008, 12018, + 12019, 12026, 12025, 12041, 12052, 12040, 12055, 12054, 12066, 12065, + 12078, 12080, 12084, 12085, 12089, 12102, 12118, 12119, 12123, 12124, + 12128, 12129, 12130, 12135, 12134, 12155, 12157, 12160, 12162, 12165, + 12166, 12169, 12173, 12177, 12181, 12185, 12189, 12193, 12197, 12201, + 12209, 12212, 12222, 12221, 12237, 12244, 12252, 12260, 12268, 12276, + 12284, 12291, 12298, 12304, 12306, 12308, 12317, 12321, 12326, 12325, + 12332, 12331, 12336, 12345, 12352, 12357, 12362, 12367, 12369, 12371, + 12373, 12375, 12377, 12384, 12392, 12394, 12402, 12409, 12416, 12423, + 12429, 12434, 12442, 12450, 12454, 12459, 12466, 12471, 12478, 12485, + 12491, 12498, 12505, 12510, 12515, 12520, 12527, 12549, 12551, 12553, + 12558, 12559, 12562, 12564, 12568, 12569, 12573, 12574, 12578, 12579, + 12583, 12584, 12588, 12589, 12593, 12594, 12602, 12614, 12613, 12629, + 12628, 12638, 12639, 12640, 12641, 12642, 12646, 12647, 12651, 12658, + 12659, 12660, 12664, 12665, 12677, 12678, 12679, 12694, 12693, 12706, + 12705, 12717, 12721, 12722, 12735, 12738, 12737, 12749, 12750, 12755, + 12757, 12759, 12761, 12763, 12765, 12773, 12775, 12777, 12779, 12784, + 12786, 12794, 12796, 12798, 12800, 12816, 12817, 12821, 12822, 12825, + 12827, 12828, 12832, 12839, 12840, 12844, 12843, 12853, 12854, 12858, + 12858, 12862, 12861, 12867, 12871, 12872, 12876, 12877, 12885, 12884, + 12895, 12899, 12903, 12916, 12915, 12930, 12931, 12932, 12935, 12936, + 12937, 12938, 12946, 12950, 12959, 12965, 12977, 12988, 12998, 13008, + 12976, 13016, 13017, 13021, 13022, 13026, 13027, 13035, 13039, 13040, + 13041, 13044, 13046, 13050, 13051, 13055, 13060, 13067, 13072, 13079, + 13081, 13085, 13086, 13090, 13095, 13103, 13104, 13107, 13109, 13117, + 13118, 13122, 13123, 13124, 13128, 13130, 13135, 13136, 13145, 13146, + 13150, 13151, 13155, 13168, 13192, 13204, 13211, 13230, 13238, 13243, + 13256, 13265, 13281, 13298, 13299, 13300, 13308, 13309, 13310, 13311, + 13325, 13331, 13337, 13343, 13349, 13355, 13373, 13383, 13393, 13399, + 13408, 13420, 13426, 13432, 13448, 13449, 13453, 13462, 13477, 13481, + 13524, 13528, 13545, 13549, 13621, 13645, 13675, 13676, 13686, 13693, + 13697, 13703, 13709, 13719, 13725, 13734, 13744, 13745, 13773, 13787, + 13801, 13816, 13817, 13827, 13828, 13838, 13839, 13840, 13844, 13857, + 13887, 13897, 13897, 13899, 13909, 13910, 13911, 13912, 13913, 13914, 13915, 13916, 13917, 13918, 13919, 13920, 13921, 13922, 13923, 13924, 13925, 13926, 13927, 13928, 13929, 13930, 13931, 13932, 13933, 13934, 13935, 13936, 13937, 13938, 13939, 13940, 13941, 13942, 13943, 13944, - 13945, 13946, 13947, 13948, 13949, 13950, 13951, 13952, 13953, 13963, - 13964, 13965, 13966, 13967, 13968, 13969, 13970, 13971, 13972, 13973, - 13974, 13975, 13976, 13977, 13978, 13979, 13980, 13981, 13982, 13983, + 13945, 13946, 13947, 13948, 13949, 13950, 13951, 13952, 13953, 13954, + 13955, 13956, 13957, 13958, 13959, 13960, 13961, 13962, 13963, 13964, + 13965, 13966, 13967, 13968, 13969, 13979, 13980, 13981, 13982, 13983, 13984, 13985, 13986, 13987, 13988, 13989, 13990, 13991, 13992, 13993, 13994, 13995, 13996, 13997, 13998, 13999, 14000, 14001, 14002, 14003, - 14004, 14005, 14006, 14007, 14008, 14009, 14010, 14011, 14012, 14017, - 14018, 14019, 14020, 14021, 14022, 14023, 14024, 14025, 14026, 14027, - 14028, 14029, 14030, 14031, 14032, 14033, 14034, 14035, 14036, 14037, + 14004, 14005, 14006, 14007, 14008, 14009, 14010, 14011, 14012, 14013, + 14014, 14015, 14016, 14017, 14018, 14019, 14020, 14021, 14022, 14023, + 14024, 14025, 14026, 14027, 14028, 14033, 14034, 14035, 14036, 14037, 14038, 14039, 14040, 14041, 14042, 14043, 14044, 14045, 14046, 14047, 14048, 14049, 14050, 14051, 14052, 14053, 14054, 14055, 14056, 14057, 14058, 14059, 14060, 14061, 14062, 14063, 14064, 14065, 14066, 14067, @@ -3018,43 +3019,45 @@ static const yytype_uint16 yyrline[] = 14238, 14239, 14240, 14241, 14242, 14243, 14244, 14245, 14246, 14247, 14248, 14249, 14250, 14251, 14252, 14253, 14254, 14255, 14256, 14257, 14258, 14259, 14260, 14261, 14262, 14263, 14264, 14265, 14266, 14267, - 14268, 14269, 14270, 14271, 14272, 14273, 14274, 14275, 14287, 14286, - 14299, 14307, 14298, 14324, 14325, 14330, 14329, 14336, 14335, 14345, - 14344, 14355, 14354, 14360, 14368, 14370, 14375, 14375, 14384, 14383, - 14397, 14396, 14401, 14405, 14406, 14407, 14411, 14412, 14413, 14414, - 14418, 14419, 14420, 14421, 14426, 14450, 14476, 14487, 14499, 14513, - 14528, 14547, 14564, 14576, 14584, 14600, 14626, 14663, 14677, 14678, - 14679, 14680, 14684, 14702, 14720, 14721, 14725, 14726, 14727, 14728, - 14732, 14746, 14750, 14751, 14752, 14762, 14763, 14764, 14770, 14776, - 14788, 14787, 14800, 14801, 14805, 14806, 14810, 14825, 14826, 14827, - 14832, 14833, 14838, 14837, 14854, 14863, 14873, 14872, 14903, 14904, - 14908, 14909, 14913, 14914, 14915, 14916, 14918, 14917, 14930, 14931, - 14932, 14933, 14934, 14940, 14945, 14951, 14962, 14973, 14977, 14984, - 14993, 14995, 15000, 15005, 15012, 15024, 15036, 15043, 15055, 15056, - 15059, 15060, 15063, 15068, 15076, 15086, 15105, 15108, 15110, 15114, - 15115, 15122, 15124, 15128, 15129, 15134, 15133, 15137, 15136, 15140, - 15139, 15143, 15142, 15145, 15146, 15147, 15148, 15149, 15150, 15151, - 15152, 15153, 15154, 15155, 15156, 15157, 15158, 15159, 15160, 15161, - 15162, 15163, 15164, 15165, 15166, 15167, 15168, 15169, 15170, 15174, - 15175, 15179, 15180, 15184, 15191, 15198, 15208, 15219, 15228, 15237, - 15249, 15254, 15262, 15267, 15275, 15280, 15287, 15287, 15288, 15288, - 15291, 15298, 15303, 15309, 15315, 15321, 15325, 15329, 15330, 15334, - 15362, 15364, 15368, 15372, 15376, 15383, 15384, 15388, 15389, 15393, - 15394, 15398, 15399, 15405, 15411, 15417, 15423, 15433, 15432, 15442, - 15451, 15452, 15456, 15457, 15462, 15463, 15464, 15469, 15470, 15471, - 15475, 15476, 15480, 15492, 15501, 15511, 15520, 15534, 15535, 15540, - 15539, 15555, 15556, 15560, 15561, 15565, 15565, 15586, 15587, 15591, - 15592, 15593, 15597, 15602, 15610, 15613, 15611, 15626, 15633, 15654, - 15678, 15680, 15684, 15685, 15689, 15690, 15698, 15699, 15700, 15701, - 15707, 15713, 15723, 15725, 15727, 15732, 15733, 15734, 15735, 15736, - 15740, 15741, 15742, 15743, 15744, 15745, 15755, 15756, 15761, 15774, - 15790, 15792, 15794, 15800, 15801, 15803, 15809, 15808, 15827, 15828, - 15832, 15838, 15847, 15847, 15871, 15872, 15877, 15878, 15880, 15882, - 15896, 15905, 15911, 15916, 15893, 15966, 15967, 15971, 15991, 16012, - 16016, 16022, 16028, 15987, 16087, 16099, 16108, 16112, 16086, 16129, - 16133, 16137, 16141, 16145, 16149, 16156, 16163, 16170, 16180, 16181, - 16185, 16186, 16187, 16191, 16192, 16197, 16199, 16198, 16204, 16205, - 16209, 16216, 16226, 16232, 16243 + 14268, 14269, 14270, 14271, 14272, 14273, 14274, 14275, 14276, 14277, + 14278, 14279, 14280, 14281, 14282, 14283, 14284, 14285, 14286, 14287, + 14288, 14289, 14290, 14291, 14303, 14302, 14315, 14323, 14314, 14340, + 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 }; #endif @@ -3092,25 +3095,26 @@ static const char *const yytname[] = "DATE_SUB_INTERVAL", "DATE_SYM", "DAY_HOUR_SYM", "DAY_MICROSECOND_SYM", "DAY_MINUTE_SYM", "DAY_SECOND_SYM", "DAY_SYM", "DEALLOCATE_SYM", "DECIMAL_NUM", "DECIMAL_SYM", "DECLARE_SYM", "DEFAULT", "DEFINER_SYM", - "DELAYED_SYM", "DELAY_KEY_WRITE_SYM", "DELETE_SYM", "DESC", "DESCRIBE", - "DES_KEY_FILE", "DETERMINISTIC_SYM", "DIAGNOSTICS_SYM", "DIRECTORY_SYM", - "DISABLE_SYM", "DISCARD", "DISK_SYM", "DISTINCT", "DIV_SYM", - "DOUBLE_SYM", "DO_DOMAIN_IDS_SYM", "DO_SYM", "DROP", "DUAL_SYM", - "DUMPFILE", "DUPLICATE_SYM", "DYNAMIC_SYM", "EACH_SYM", "ELSE", - "ELSEIF_SYM", "ENABLE_SYM", "ENCLOSED", "END", "ENDS_SYM", - "END_OF_INPUT", "ENGINES_SYM", "ENGINE_SYM", "ENUM", "EQUAL_SYM", - "ERROR_SYM", "ERRORS", "ESCAPED", "ESCAPE_SYM", "EVENTS_SYM", - "EVENT_SYM", "EVERY_SYM", "EXCHANGE_SYM", "EXAMINED_SYM", "EXECUTE_SYM", - "EXISTS", "EXIT_SYM", "EXPANSION_SYM", "EXPORT_SYM", "EXTENDED_SYM", - "EXTENT_SIZE_SYM", "EXTRACT_SYM", "FALSE_SYM", "FAST_SYM", "FAULTS_SYM", - "FETCH_SYM", "FILE_SYM", "FIRST_SYM", "FIXED_SYM", "FLOAT_NUM", - "FLOAT_SYM", "FLUSH_SYM", "FORCE_SYM", "FOREIGN", "FOR_SYM", - "FORMAT_SYM", "FOUND_SYM", "FROM", "FULL", "FULLTEXT_SYM", - "FUNCTION_SYM", "GE", "GENERAL", "GENERATED_SYM", "GEOMETRYCOLLECTION", - "GEOMETRY_SYM", "GET_FORMAT", "GET_SYM", "GLOBAL_SYM", "GRANT", "GRANTS", - "GROUP_SYM", "GROUP_CONCAT_SYM", "HANDLER_SYM", "HARD_SYM", "HASH_SYM", - "HAVING", "HELP_SYM", "HEX_NUM", "HEX_STRING", "HIGH_PRIORITY", - "HOST_SYM", "HOSTS_SYM", "HOUR_MICROSECOND_SYM", "HOUR_MINUTE_SYM", + "DELAYED_SYM", "DELAY_KEY_WRITE_SYM", "DELETE_SYM", + "DELETE_DOMAIN_ID_SYM", "DESC", "DESCRIBE", "DES_KEY_FILE", + "DETERMINISTIC_SYM", "DIAGNOSTICS_SYM", "DIRECTORY_SYM", "DISABLE_SYM", + "DISCARD", "DISK_SYM", "DISTINCT", "DIV_SYM", "DOUBLE_SYM", + "DO_DOMAIN_IDS_SYM", "DO_SYM", "DROP", "DUAL_SYM", "DUMPFILE", + "DUPLICATE_SYM", "DYNAMIC_SYM", "EACH_SYM", "ELSE", "ELSEIF_SYM", + "ENABLE_SYM", "ENCLOSED", "END", "ENDS_SYM", "END_OF_INPUT", + "ENGINES_SYM", "ENGINE_SYM", "ENUM", "EQUAL_SYM", "ERROR_SYM", "ERRORS", + "ESCAPED", "ESCAPE_SYM", "EVENTS_SYM", "EVENT_SYM", "EVERY_SYM", + "EXCHANGE_SYM", "EXAMINED_SYM", "EXECUTE_SYM", "EXISTS", "EXIT_SYM", + "EXPANSION_SYM", "EXPORT_SYM", "EXTENDED_SYM", "EXTENT_SIZE_SYM", + "EXTRACT_SYM", "FALSE_SYM", "FAST_SYM", "FAULTS_SYM", "FETCH_SYM", + "FILE_SYM", "FIRST_SYM", "FIXED_SYM", "FLOAT_NUM", "FLOAT_SYM", + "FLUSH_SYM", "FORCE_SYM", "FOREIGN", "FOR_SYM", "FORMAT_SYM", + "FOUND_SYM", "FROM", "FULL", "FULLTEXT_SYM", "FUNCTION_SYM", "GE", + "GENERAL", "GENERATED_SYM", "GEOMETRYCOLLECTION", "GEOMETRY_SYM", + "GET_FORMAT", "GET_SYM", "GLOBAL_SYM", "GRANT", "GRANTS", "GROUP_SYM", + "GROUP_CONCAT_SYM", "HANDLER_SYM", "HARD_SYM", "HASH_SYM", "HAVING", + "HELP_SYM", "HEX_NUM", "HEX_STRING", "HIGH_PRIORITY", "HOST_SYM", + "HOSTS_SYM", "HOUR_MICROSECOND_SYM", "HOUR_MINUTE_SYM", "HOUR_SECOND_SYM", "HOUR_SYM", "ID_SYM", "IDENT", "IDENTIFIED_SYM", "IDENT_QUOTED", "IF_SYM", "IGNORE_DOMAIN_IDS_SYM", "IGNORE_SYM", "IGNORE_SERVER_IDS_SYM", "IMPORT", "INDEXES", "INDEX_SYM", "INFILE", @@ -3408,6 +3412,7 @@ static const char *const yytname[] = "opt_format_json", "opt_describe_column", "flush", "$@173", "flush_options", "$@174", "opt_flush_lock", "flush_lock", "$@175", "flush_options_list", "flush_option", "opt_table_list", + "opt_delete_gtid_domain", "delete_domain_id_list", "delete_domain_id", "optional_flush_tables_arguments", "reset", "$@176", "reset_options", "reset_option", "$@177", "$@178", "slave_reset_options", "master_reset_options", "purge", "$@179", "purge_options", @@ -3539,18 +3544,18 @@ static const yytype_uint16 yytoknum[] = 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, - 895, 896, 897, 898, 61, 62, 60, 124, 38, 45, - 43, 42, 47, 37, 94, 126, 40, 41, 44, 33, - 123, 125, 59, 64, 46, 58 + 895, 896, 897, 898, 899, 61, 62, 60, 124, 38, + 45, 43, 42, 47, 37, 94, 126, 40, 41, 44, + 33, 123, 125, 59, 64, 46, 58 }; # endif -#define YYPACT_NINF -4278 +#define YYPACT_NINF -4291 #define yypact_value_is_default(Yystate) \ - (!!((Yystate) == (-4278))) + (!!((Yystate) == (-4291))) -#define YYTABLE_NINF -2794 +#define YYTABLE_NINF -2800 #define yytable_value_is_error(Yytable_value) \ 0 @@ -3559,496 +3564,497 @@ static const yytype_uint16 yytoknum[] = STATE-NUM. */ static const int yypact[] = { - 6611, 2890, 1824, 1646, 411, 790, 57939, -4278, 728, -88, - -4278, 455, 923, -4278, -4278, -4278, -4278, -4278, 3725, -4278, - 57939, 999, 1176, -4278, 26127, -4278, -4278, -4278, -23, -4278, - 109, -88, -4278, 999, 479, -4278, 57939, -4278, 880, 1345, - 999, -4278, -4278, -4278, 50954, -4278, 455, 57939, -4278, 849, - -4278, -4278, 50954, 385, 224, 886, -19, -4278, -4278, 57939, - -4278, 2544, -4278, 851, 1542, 1408, -4278, -4278, 1193, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, 3436, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, 26768, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, 950, 57939, 980, 57939, 1431, 57939, - 49049, 57939, -4278, 1506, -4278, -4278, 1516, 1040, -4278, -4278, - -88, 1085, -4278, -4278, 1695, 455, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, 1117, -4278, -4278, 1191, 411, -4278, -4278, -4278, - -132, -4278, 1790, 1616, 1406, 57939, 822, 12441, 1650, 1650, - 1650, 1677, 1708, 1650, 1650, 1650, 57939, -4278, 1650, 1650, - 1650, -88, -4278, -4278, -4278, 1819, 37619, 57939, 1583, 219, - -76, 49049, -4278, 1451, 57939, 411, 75, -4278, 1718, -4278, - -4278, -4278, 64289, -88, -4278, 1929, 1785, 355, 57939, -4278, - -4278, -4278, 64289, 213, 52, 1386, -4278, -4278, 1540, -4278, - 38254, 188, -4278, -4278, -4278, 814, 2772, -4278, 28691, 4282, - 1540, 1533, 411, -97, 1543, 411, -4278, -4278, 57939, 411, - -88, 1757, -4278, 12441, -4278, 179, 179, 179, -4278, 179, - -4278, 179, 851, 1403, 1582, -4278, -4278, 1412, 57939, 1850, - -4278, 1850, -4278, -4278, 1850, 1238, 1579, 1848, 1865, 1868, - 1552, 1410, 1040, 2329, -4278, -4278, -4278, 1449, -30, -4278, - 1512, 41429, -4278, 57939, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, 1372, -4278, 1565, 733, 1600, 1955, -4278, 49049, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, 26127, - 1488, 57939, -4278, 1992, 12441, 1191, -4278, 1578, -4278, -4278, - 26127, -4278, -4278, 26127, 231, 36, 57939, -4278, -4278, 2152, - -4278, -4278, -4278, 51589, 822, 1508, 1518, 1520, 17721, -4278, - 1545, 1549, 1554, 12441, 1569, 1576, 1581, 1584, 1595, 1619, - 1626, 1631, 1636, 1639, 1641, 1653, 1665, 1669, 1669, 1669, - 1672, 1674, 1680, 1697, -165, 1702, -4278, 1725, 1759, 1763, - -4278, -4278, 1767, 1769, 1774, 1780, -4278, -4278, 1787, 1797, - 1799, 13101, 1805, 1807, 1813, -4278, 22910, 1821, 1823, 1831, - 1854, 1878, 1894, 1904, 1918, 1926, -4278, -4278, 12441, 1672, - -4278, -4278, 1948, -4278, 1957, 1961, 1965, 1972, 1978, 1982, - 1993, 2000, 2011, 2014, 2031, 2036, 2039, 2045, 2057, 2060, - 2064, 1672, -4278, 1051, 2073, 2079, 1121, 2082, -4278, 2088, - -4278, 189, 2093, 1669, 1672, 1672, 2095, 2097, 2103, 2110, - 2119, 2130, 17721, 17721, 17721, 12441, -4278, 57939, -4278, 57939, - 2018, 3096, -4278, 2696, 17721, 200, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, 1563, 1721, -4278, -4278, -4278, -4278, -4278, - -4278, 2133, 1585, 2128, 57939, 57939, 57939, 2261, 57939, 57939, - 57939, -4278, 49049, 1964, 57939, -4278, -4278, 1650, 1756, 5019, - 31891, 2101, 2056, 1893, 1669, -4278, -4278, 725, 746, 780, - 2169, -4278, -4278, 2222, 784, 2195, -4278, 820, 431, -4278, - 119, 829, 844, -4278, -4278, -4278, -4278, -4278, -4278, 1987, - 2395, 2146, -4278, -4278, 162, -4278, -4278, 57939, -4278, 2646, - 12441, -4278, -4278, -4278, 2573, 2300, -4278, -4278, -4278, 217, - 2761, 240, 26127, 1646, 57939, 158, 65559, 65559, 57939, -4278, - 61114, 2156, -4278, -4278, 5823, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, 2171, -4278, -4278, 2184, - 12441, 1365, -4278, -157, -4278, -4278, 2538, -4278, -4278, 45874, - 26127, 1341, 64924, -4278, -4278, -4278, 23553, -4278, -4278, 2796, - -4278, 2192, -4278, -4278, 1721, 3094, -4278, 2474, 2101, 2483, - -4278, 2661, -4278, 2492, 2403, 36, 2288, -4278, 2846, 2627, - -4278, 2708, 1599, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, 2259, 2772, -4278, -4278, 52224, 680, 2424, - -138, 1027, 1096, 36981, 752, 49049, 1127, 115, 29331, 42064, - 2262, -4278, -4278, -4278, 796, 2426, -4278, 2760, -4278, -10, - -4278, 2278, 2265, -10, 46509, 2627, 203, -4278, 379, -4278, - 2753, -4278, -4278, -4278, -4278, 2416, 2400, 2450, -4278, 390, - 2802, -4278, 411, -4278, 56, -4278, 2431, 2627, -10, 203, - -4278, 2683, 2810, 627, 2779, -4278, 984, -4278, -4278, -4278, - -71, 2886, -4278, 2325, -4278, -4278, -4278, 26127, -4278, -4278, - -4278, 2573, -4278, 196, -4278, -4278, -4278, -4278, 2328, -4278, - -4278, 2614, 2447, -4278, -4278, 73, 2344, 7, -4278, 2840, - -4278, 1646, 57939, -4278, -4278, -4278, 835, 1703, 1516, 1850, - -4278, 1850, 1850, 1850, 1850, 1085, 42699, -4278, -4278, -4278, - 2884, 2902, 1669, 2359, -4278, -4278, -4278, -4278, -4278, 3021, - -4278, -4278, 2656, 2923, 2923, 2923, 3044, -4278, -4278, -4278, - 26127, -4278, -4278, -4278, 733, -4278, 2572, 2440, -4278, 57939, - 1600, -4278, 26127, -4278, 2805, 2415, -4278, -4278, 2676, 12441, - -4278, -4278, 12441, 64289, 2918, 2018, -4278, -4278, 59, -4278, - -4278, 26127, 299, -4278, 3023, 2643, -4278, -4278, -4278, 3021, - 2923, 26127, -4278, 2445, -4278, 2434, -4278, 12441, 12441, 356, - 3034, 3100, 3100, 3100, 2018, 2496, 12441, 12441, 12441, 12441, - 12441, 12441, 12441, 12441, 12441, 12441, 12441, 12441, 367, 2471, - -4278, -4278, -4278, 307, -4278, 2476, 12441, 12441, -4278, 12441, - 12441, 27409, -4278, 4623, 12441, 12441, 375, 2993, 12441, 12441, - 12441, 12441, 4164, 12441, 12441, 12441, 27409, 3131, 2485, -4278, - 2484, 1081, 12441, 12441, 1170, 12441, 12441, 12441, 12441, 12441, - -4278, -4278, 12441, 12441, 12441, 12441, 17721, 12441, 12441, 12441, - 12441, 12441, 12441, 2500, 12441, 3100, 3100, 12441, 12441, 1484, - -4278, -4278, 12441, 2977, 2977, -4278, 12441, 9141, 12441, -4278, - -4278, 2504, -4278, -4278, -4278, 27409, 3100, 3100, 12441, 12441, - 12441, 3034, 3034, 3034, 320, 2513, 580, 12441, 29971, 2510, - -4278, -4278, -4278, -4278, 12441, 12441, 12441, 17721, -4278, 1448, - -4278, -4278, -4278, -4278, -4278, 13761, 17721, 17721, 2497, 17721, - 17721, 17721, 17721, 17721, 2904, 17721, 17721, 18381, 19041, 17721, - 17721, 17721, 17721, 1158, 3034, 49049, 17721, 12441, -4278, -4278, - 57939, -4278, -4278, -4278, 2523, -4278, 2815, 1964, -4278, 47144, - -4278, -43, 3033, -4278, 45874, 26127, -4278, 2539, -4278, 2927, - -4278, 2929, 2931, 2938, -4278, -4278, -4278, -4278, 3159, 2941, - -4278, 411, 2945, -4278, -4278, 2563, -4278, -4278, -4278, 19701, - 49049, -4278, 2576, -4278, 2593, -4278, -4278, -4278, -4278, -4278, - -4278, 2684, -4278, -4278, -4278, -4278, 2582, -4278, 45874, 2582, - -4278, -4278, 2582, -4278, -4278, 2582, 41429, 37, 3643, -4278, - -4278, 57939, -4278, 58574, -4278, 3006, 1509, -4278, 23553, 411, - -4278, 3015, 14421, -4278, -4278, -4278, 2966, 451, 2594, -4278, - -4278, -4278, -4278, 3053, 57939, -4278, -4278, -4278, 12441, 2964, - 2608, -4278, -4278, -4278, 211, 26127, -4278, 2018, -4278, 124, - 124, 2870, 1664, 49049, -4278, -4278, 184, 2616, -4278, 2703, - 2624, -4278, 2705, -4278, -4278, 26127, 2618, -4278, 26127, -4278, - -4278, -4278, 2888, 2712, -4278, 411, 52, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - 2632, 2653, 3102, 2644, 45874, 41429, 96, -4278, 57939, -4278, - 1495, -4278, -4278, 974, -4278, -4278, 194, 43334, -4278, 592, - 2677, 2702, 3056, -4278, -4278, 2658, -4278, 12441, -4278, 2655, - 2662, -4278, 796, -4278, 47144, 57939, -4278, -4278, -4278, -4278, - -4278, 3252, 12441, -4278, 45874, -4278, -35, -4278, 786, 80, - 796, -4278, -4278, -4278, -4278, -4278, 57939, 52859, 2668, 9801, - 2795, 3079, -4278, -4278, -4278, 2687, 1850, 57939, 57939, 57939, - 26127, 57939, 26127, -4278, 1181, 1181, -4278, -4278, -4278, -4278, - -10, 57939, 57939, -10, 41429, -4278, 203, 763, 57939, -10, - -4278, 3080, 2798, -4278, -4278, -4278, 3166, -4278, -4278, 3158, - 2701, -4278, 3191, -4278, -4278, 2831, 203, -4278, -4278, 26127, - -4278, -4278, 203, -4278, 203, 203, 12441, -10, -10, -10, - -4278, -49, -4278, -4278, -4278, 2862, -97, -4278, -4278, -4278, - 878, -4278, -4278, 179, 2967, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, 1107, -4278, -4278, -4278, - 3197, -4278, 47144, 41429, 3171, 1850, 1850, -4278, -4278, 3204, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, 1850, -4278, -4278, - -4278, -4278, -4278, -4278, 1600, 49049, 57939, 57939, 57939, 26127, - -4278, -4278, -4278, -4278, -4278, 185, -4278, -4278, -4278, 2123, - 3238, -4278, 49049, 2207, -80, 1047, 2207, 2730, 411, 1078, - -4278, 1078, -4278, -4278, -4278, 1450, 1850, -4278, -4278, 2737, - -4278, 2984, -4278, -4278, 53494, 26127, -4278, -4278, -4278, 197, - 2734, 2741, 2018, 2018, 61749, 3347, 2780, 4586, -4278, -4278, - 26127, -4278, 55, -4278, -4278, -4278, 2806, -4278, -4278, -4278, - -4278, 1443, -4278, -4278, 1722, 2801, 2752, -4278, 2888, -4278, - 1460, 57939, 3211, 34441, -4278, 416, 198, -4278, 3100, 2756, - -4278, 2757, 2764, 2765, 12441, 249, 1832, 229, 1294, 1434, - 313, 427, 648, 608, -4278, 1685, 792, 809, 816, 259, - -4278, 2766, 2774, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, 2770, -4278, -4278, -4278, 824, 855, 1308, 1418, 2773, - 2775, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, 3229, -4278, 875, 1694, -4278, -4278, -4278, -4278, 2776, - -4278, -4278, 1440, 930, 970, 324, 2783, 1699, 981, 1741, - 1788, 2789, 27409, 57939, 3100, 2791, 1459, 1463, 3100, 2792, - 1014, 1473, 1809, 1836, 1911, 1478, 1498, 1028, 1937, 2887, - 1660, 1034, 1036, 1692, 1115, 1124, -4278, 1705, 2793, 2794, - 1201, 205, 3100, 2799, 353, 2797, 2804, 1715, 10461, 11121, - 11781, 159, 1207, -4278, 2808, -4278, 2484, 2809, 2812, 361, - 242, 1726, -4278, 12441, -4278, -4278, 2811, -4278, 2876, 190, - 80, -4278, 2979, 57939, 2456, 168, -4278, -4278, -4278, -4278, - -4278, -4278, 70, -4278, 2818, -4278, 2819, 288, 2824, 12441, - 253, 2824, 3154, 1758, 1758, 17721, 2240, 2788, 13101, 1686, - 13101, 1686, 2824, 2824, 2824, -4278, 17721, 2826, 17721, 17721, - -4278, 3034, 2018, 2830, 573, 57939, 26127, -43, 2823, -4278, - -4278, -4278, -4278, -4278, 796, -4278, 2832, 138, 26127, 49049, - 2833, -4278, -4278, -4278, -4278, -4278, -4278, 411, -4278, -4278, - 3823, -4278, 26127, 2919, 2928, 2936, -4278, 32531, -4278, -4278, - -4278, -4278, 32531, 801, -4278, 57939, -4278, 2935, -4278, -4278, - -4278, 3270, -4278, 3271, -211, -4278, 24194, 24194, -4278, 24194, - -4278, -4278, -4278, -4278, -4278, 431, -4278, -4278, -4278, -4278, - 67, 68, 3376, 2677, -4278, -4278, -4278, -4278, -4278, -4278, - 33806, 2018, -4278, 26127, -4278, 3265, 1, 26127, -4278, -4278, - 3258, 2018, -4278, -4278, -4278, -4278, -4278, -4278, 2855, -4278, - 2858, -4278, -4278, -4278, -4278, -4278, 3114, 2970, -4278, 3506, - -4278, 12441, 411, -4278, 45874, 45874, 26127, 26127, 26127, 867, - 12441, -4278, 1388, 2866, -4278, -4278, 3115, -4278, 3510, -4278, - 3094, 19701, 47144, 3315, 3329, -4278, 2872, 24194, 24194, 24194, - -4278, -4278, -4278, -4278, 2969, 2969, -4278, 30611, -4278, 12441, - -4278, -4278, -4278, 3367, -4278, 3070, -69, -4278, -4278, -4278, - -4278, -4278, 57939, -4278, 3007, -4278, -4278, 2889, -4278, -4278, - 26127, -4278, -4278, 3338, -4278, 3058, -4278, 2018, -4278, 2891, - 52224, 3357, 9801, 3359, -4278, 47779, -4278, 2018, 796, 2906, - 2911, -4278, -4278, 3286, -66, -4278, 2912, 2913, -4278, 2908, - 2914, 2917, 52224, 12441, -4278, 786, -4278, -4278, -4278, -4278, - -4278, 17721, 1725, -4278, 2018, -4278, -4278, 411, 3382, 411, - 12441, 2932, 57939, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -10, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, 3162, 2627, 2802, - 3079, -4278, -10, 203, 26127, -10, -10, 2018, -4278, -4278, - -4278, -4278, -4278, -4278, 2926, -4278, 2996, -4278, -4278, 3101, - 64289, 2948, -4278, 3406, 2627, -4278, -4278, -4278, 218, -209, - 2949, 1850, -4278, 57939, 57939, 1850, 1850, 57939, -4278, -4278, - -155, 3235, 3239, -4278, -4278, 796, 796, 3264, -4278, 411, - 3097, 3099, 3107, 3111, 3118, 3141, -4278, -4278, 411, 411, - -4278, -4278, 796, -4278, 558, -4278, -4278, -4278, -4278, 2813, - -4278, 796, 796, -4278, 730, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, 1075, -4278, 5110, -4278, -4278, 26127, 3253, 26127, - 3442, -4278, 3509, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, 2989, -4278, -4278, 12441, 3082, -4278, -4278, 2780, - -4278, 3002, 3009, 3011, 3019, 3022, 3025, 3026, 3027, 3030, - 3031, 3035, 3037, 3039, 3043, 3047, 3048, 3049, 3051, 3052, - 3054, 3060, 3061, 3063, 3020, -4278, -4278, -4278, 3062, -4278, - -4278, -4278, 796, 796, 796, 796, -4278, 2552, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, 3380, 2540, 57939, 3069, - -4278, 34441, -4278, -4278, 878, -4278, 3024, 15081, -4278, 3055, - -4278, 12441, -4278, -4278, -4278, 2217, 12441, 12441, 3539, 2628, - -4278, 48414, -4278, -4278, -4278, 12441, -4278, 12441, -4278, 12441, - 12441, 12441, 12441, 48414, 2628, 12441, -4278, 3065, -4278, 3459, - 3460, -4278, -4278, -4278, -4278, 12441, 12441, -4278, 12441, 12441, - -4278, 12441, 12441, 12441, 12441, -4278, 12441, -4278, -4278, 17721, - -4278, 3059, 3071, -4278, -4278, -4278, 3072, -4278, 12441, -4278, - -4278, -4278, -4278, -4278, -4278, 12441, -4278, 12441, -4278, 12441, - 12441, -4278, 12441, 12441, -4278, -4278, -4278, 15741, 12441, 12441, - 3073, -4278, -4278, 12441, 12441, 12441, -4278, 12441, 2009, 12441, - 2284, 12441, 2305, 12441, -4278, 12441, -4278, -4278, -4278, -4278, - 12441, 421, 3114, 3115, 3076, -4278, 1939, 2708, -4278, 2392, - 2811, 3077, 3226, 1495, -4278, -4278, 49049, 12441, -4278, -4278, - -4278, -4278, -4278, -4278, 17721, 377, 3081, 17721, -4278, 3154, - 4164, 4164, 1873, 12441, 253, 3154, 12441, 3086, 3068, -4278, - 12441, 57939, -4278, -4278, -4278, 47144, -4278, 49049, 45874, -4278, - -4278, -4278, 138, -4278, 2539, -4278, -4278, 2855, 81, 3074, - 3088, -4278, -4278, -4278, -4278, -4278, -4278, 1949, -4278, 41429, - 144, 3713, 41429, -4278, 3095, -4278, 3098, 3175, 3185, 3186, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, 2627, 64289, 1388, -4278, -4278, 3105, -4278, -4278, 2676, - 2969, 3129, 3483, 3679, -4278, -4278, -4278, -4278, 64289, 64289, - 12441, 57939, 17721, -4278, 3720, 3117, 3119, 3127, 3120, 2018, - -4278, 3199, -4278, -4278, -4278, 187, -4278, -4278, -4278, -4278, - -4278, 76, 2041, -4278, -4278, 3122, 3122, 21626, -4278, -4278, - -4278, 57939, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, 3139, -4278, -4278, 3398, 45874, 41429, 3584, 3585, 3590, - 606, -4278, -4278, -4278, 49049, 3138, -4278, -4278, -4278, 2018, - 3140, 346, 43969, 3619, 43969, 43969, -4278, 652, 3537, 3540, - -4278, 3420, 2161, 3420, -4278, -4278, 652, 878, 2888, -4278, - 12441, 3760, 3592, 3473, -4278, 49684, -4278, 35076, -4278, 7218, - -4278, 45874, -4278, -4278, -4278, -4278, -4278, 3248, 3250, 1335, - -4278, -4278, 3560, 3390, -4278, -4278, -4278, 796, 2018, -4278, - 2668, 3164, 31251, -4278, 995, -4278, -4278, 2018, 304, -4278, - -4278, -4278, 3454, -4278, -4278, 3382, -4278, 2677, 203, -4278, - -4278, -49, 2821, -4278, 27409, 62384, 3115, 3493, -4278, -4278, - -4278, 234, 3818, -4278, 57939, 3173, -122, -4278, -4278, 57939, - 3634, 968, 968, 3455, 26127, 26127, 4134, 47779, 44604, -4278, - -4278, -4278, -4278, 3716, -4278, 3717, 1593, -4278, -4278, 2255, - 1047, -4278, 411, 411, 411, 411, 3115, 411, 411, 1995, - -4278, 2255, 2255, 1078, -4278, 170, -4278, -4278, -4278, -4278, - 3196, 796, 3755, 3437, 796, 796, 3755, 796, 3439, 3444, - 796, 796, 3272, 3703, 796, 3588, 3295, 2048, 3591, 796, - 3453, -4278, 3298, 3714, 796, 796, 796, 796, 796, 3755, - 3457, 3808, 796, 796, -4278, 796, 3461, 3463, 167, 3466, - 3470, 796, 796, 796, 796, 206, 57939, 796, 796, 3476, - 796, -4278, -4278, 5068, -4278, -4278, -4278, -4278, -4278, -4278, - -91, 24841, -4278, -4278, -4278, -4278, 796, -4278, 192, -4278, - 3428, -4278, 1684, 50319, 63019, 3216, 3223, 54129, 2018, 64289, - 12441, -4278, 3228, 3230, 3232, 3115, 411, 411, 995, 411, - 3115, 411, 411, 411, 411, 411, 411, 411, 3115, 3115, - 411, 164, 1129, 411, 3115, 4586, -4278, 411, 3114, 2255, - 2255, 1722, -4278, 3668, 796, -4278, 2468, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, 3227, 878, 2677, - 1487, 2677, 3241, -4278, 13101, 1734, -4278, 2018, 12441, 2018, - 2330, -4278, 3243, 3243, 3243, -4278, 3246, -4278, -4278, 3243, - 3646, 3243, 3652, 3247, 3251, 1997, 2309, -4278, 2002, 2358, - 1777, 3254, 3257, 1563, -4278, 12441, 12441, 1783, 545, 1802, - -84, 1214, 1216, 617, -4278, 1839, 3104, -4278, -4278, 1851, - 1858, 1860, 1862, 1250, 1892, 2004, 13101, 1896, 221, 718, - -4278, 1901, 1295, 1315, 1906, 12441, 1908, 12441, 1915, 12441, - 1920, 1922, 1927, 3249, 3249, 181, -4278, 3259, -4278, -4278, - -4278, 3261, -4278, -4278, -4278, -4278, 2677, 2259, 2392, -4278, - 3268, 1476, -4278, -4278, 3262, 2018, 3273, -4278, -4278, 12441, - -4278, 200, -4278, -4278, 17721, 751, 3274, -4278, 2018, -4278, - -4278, 3276, 1563, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, 3479, -4278, -4278, 3491, 32531, -4278, 57939, -201, - 675, -4278, -4278, 49049, 3532, -4278, 3283, 35711, 41429, 41429, - 41429, 3266, -4278, 59209, 3563, 26127, -4278, 3704, -4278, -4278, - -4278, -4278, 57939, 65559, 65559, 65559, 65559, 3285, 3289, -4278, - -4278, -4278, 3154, 3665, 3544, -4278, -4278, 3114, 57939, 45874, - 3599, -4278, -4278, 3496, 2772, 27409, -4278, 3293, -4278, 3293, - 1134, 3296, 2016, -4278, -4278, -4278, 3291, 2288, 2020, -4278, - 19701, 3752, 2832, -4278, 41429, 41429, 41429, -4278, 2622, -4278, - 30611, 12441, -4278, -4278, -4278, -4278, -4278, 43969, -4278, -4278, - -183, 1476, -4278, 1724, -4278, -4278, -4278, 3698, 3420, 3420, - 652, 3700, 772, -4278, 2732, -4278, 2772, 2018, 12441, -4278, - 3575, -4278, 54764, -4278, -4278, -4278, -4278, 1093, -4278, -4278, - 3306, 3307, 214, 3535, -4278, -4278, -4278, -4278, 9801, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - 2627, -4278, -4278, -4278, -4278, -4278, -10, -4278, 3323, -4278, - 3310, 3311, -4278, 796, 3341, -4278, -4278, 41429, 3511, -4278, - 912, 3319, 57939, -4278, 3853, -4278, -4278, -4278, -4278, -4278, - 26127, -4278, -4278, 26127, 20344, -4278, -4278, 3578, -4278, 3654, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, 2813, -4278, -4278, -4278, 1075, -4278, -4278, - 28050, 1850, -4278, 208, -4278, 1850, 197, 197, 3746, 55399, - 28050, 999, 995, 3115, 1677, 3115, 56034, 999, 411, 411, - 2622, 796, 3115, -4278, -4278, 3718, 1650, 3719, 1677, 1677, - -4278, 49049, 57939, -4278, 796, 948, 3115, 56669, 995, 995, - 1677, 999, 27409, 2933, 3195, -4278, 411, 999, -4278, -4278, - -4278, -4278, 26127, 999, 999, 2186, 3288, 3369, 3399, -4278, - -4278, -4278, 3115, 3195, 56034, -4278, -4278, 7547, -4278, -4278, - -4278, 20985, 57939, 311, 199, -4278, 3320, 39524, 3327, 1646, - 1399, 3410, 1816, -4278, 157, -4278, -4278, -4278, 3771, 3331, - 1186, -4278, 3328, -4278, 56034, -4278, 3342, -4278, 3340, -4278, - 59844, 2018, 3115, 3115, 3115, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, 57939, 2255, 2540, -4278, 34441, 2677, 3575, - -4278, -4278, 4164, -4278, 2018, 12441, 992, -4278, -4278, -4278, - -4278, 1094, -4278, -4278, -4278, 3344, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, 2600, -4278, -4278, 2628, -4278, -4278, -4278, - 3345, 4164, 4164, -4278, -4278, 12441, -4278, 3951, 3516, 12441, - 12441, -4278, 12441, -4278, 267, 3348, 3379, -4278, -4278, -4278, - -4278, 12441, -4278, -4278, 4164, -4278, 12441, -4278, -4278, 12441, - -4278, 12441, 12441, -4278, 1931, -4278, 1975, -4278, 2001, -4278, - -4278, -4278, 3114, 3358, 3740, -4278, -4278, -4278, 3114, 3550, - -4278, -4278, 3114, 3115, 3338, 2658, -4278, -4278, -4278, 2708, - 580, 57939, -4278, -4278, 2049, -4278, -4278, 12441, -4278, 49684, - -4278, -4278, 3837, 3733, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - 3811, -4278, 3462, -4278, 178, -4278, -4278, -4278, -137, -137, - -137, 16401, 2567, 3870, -4278, -4278, -4278, 3704, 3757, -4278, - 99, 3371, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - 57939, 3373, 1713, -4278, 2069, -4278, -4278, 3374, -4278, -4278, - -4278, 2259, 3381, -4278, 796, 16401, 3122, 3547, -4278, -4278, - 1134, 27409, 35076, -4278, -4278, 57939, -4278, 41429, 2872, 2872, - 2872, 44604, -4278, -4278, 346, -4278, 1495, 3349, -4278, 878, - -4278, 652, 3777, 3778, -4278, 652, -4278, -4278, -4278, 2259, - 1359, 346, 12441, 2627, -4278, -4278, 36346, -4278, -4278, -4278, - -4278, -4278, -4278, 31251, 52224, -4278, 2627, -4278, 411, 2623, - 27409, 2677, 16401, -4278, -4278, 57939, -4278, -4278, -4278, -4278, - 3529, -4278, 419, 3667, 3411, -4278, 3388, 3394, -4278, 26127, - 3395, 3396, 3397, -4278, -4278, -4278, 125, -4278, 5451, -4278, - -4278, -4278, -4278, -4278, 999, 3403, 3797, 3798, 197, -4278, - 1850, 28050, -4278, 1850, 1850, 1646, -4278, -4278, -4278, 129, - 56034, -4278, -4278, 28050, -4278, -4278, -4278, 3405, -4278, -4278, - 3114, -4278, -4278, 44604, 411, -4278, 1677, 57939, -4278, 28050, - 28050, -4278, 3434, 411, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, 28050, 56034, 3407, -4278, 346, -4278, -4278, - -4278, -4278, -4278, 1929, -4278, 56034, -4278, -4278, 56034, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, 3412, 3116, 235, -4278, - 3409, -4278, 57939, -4278, -4278, 26127, -4278, -4278, -4278, 7663, - 57939, -4278, -4278, -4278, -4278, 57939, 4047, -4278, 3655, 12441, - 12441, 3694, 57939, 3695, -4278, 3989, -4278, -4278, 3834, 3877, - 57939, 7663, 3879, 3882, -4278, 3423, -4278, 54129, 3514, 2083, - -4278, -4278, 2098, -4278, -4278, 2112, -4278, -4278, -4278, -4278, - -4278, 3024, -4278, 3806, 528, 2018, 3427, 3429, 3430, 3431, - 220, 2116, 3715, -4278, -4278, -4278, 3243, -4278, 3246, -4278, - -4278, -4278, 4026, -4278, -4278, 3243, 3840, -4278, -4278, -4278, - 3435, -4278, 3438, 3440, 2007, -4278, 179, 3443, 2032, 1376, - 2134, 3753, 3829, -4278, 3670, -4278, 2047, 924, 2115, 2121, - 2201, 2205, -4278, -4278, -4278, -4278, -4278, 3446, -4278, -4278, - 522, -4278, 3441, 3592, -4278, -4278, -4278, -4278, 2138, -4278, - -4278, 4083, 3721, -4278, -4278, -4278, 411, 1252, 3475, 3475, - 3475, 1725, 2018, 2144, -4278, 64289, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, 3856, 57939, -4278, -4278, 3451, 3506, 57939, - -4278, 3544, -4278, 2658, 27409, 16401, 3452, 3450, -4278, 7, - -4278, -4278, 3448, -4278, -4278, 2872, -4278, 4035, -4278, -4278, - -4278, 2889, 3472, 3508, 652, 652, 3505, 3513, 12441, 3458, - -4278, 401, 2658, -4278, -4278, 12441, -4278, -4278, 2018, 3699, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, 3575, -4278, 3456, - 3464, -4278, -4278, 411, 287, -4278, -4278, 327, 3638, 49049, - 3467, 57939, 57939, 3468, -4278, -4278, 20985, -4278, 4099, -4278, - -4278, 12441, 1850, -4278, -4278, 28050, 3518, -177, 28050, 28050, - 3949, 3998, 3999, -4278, 28050, 1443, 57939, -4278, 3252, -4278, - 28050, 3405, -4278, 554, 3574, -4278, 311, -4278, 27409, -4278, - -4278, -4278, 57939, -4278, 26127, -4278, -4278, 3478, -4278, 3243, - 3243, 3243, -4278, -4278, 3243, -4278, 3246, 3724, 3481, 3246, - 3246, -4278, -4278, -4278, -4278, -4278, 220, 2216, -4278, -4278, - 220, -4278, -4278, -4278, 166, 1171, 3246, -4278, -4278, -4278, - -4278, -4278, 3488, -4278, 3243, 3243, 3243, -4278, -4278, 220, - 3243, -4278, 3243, -4278, 3246, 403, 163, 3243, 3243, 3243, - 3344, 3482, -4278, 2162, -4278, -4278, 2018, 4164, 4052, -4278, - -4278, 3642, 411, 3997, 57939, 161, -4278, -4278, 3252, 4016, - 2825, -4278, -4278, -4278, 64289, -4278, 3115, -4278, 3115, -4278, - 3115, 45239, -4278, -4278, -4278, -4278, -4278, -4278, -4278, 265, - -4278, -4278, 48414, 4112, -4278, 3780, 3494, -4278, -4278, -4278, - -4278, -4278, 220, -4278, -4278, -4278, -4278, 12441, -4278, -4278, - -4278, 12441, -4278, -4278, 3814, 3971, -4278, -4278, -4278, -4278, - -4278, -4278, 3498, -4278, 3115, 3575, -4278, 4013, -4278, -4278, - -4278, 3593, 3594, -4278, -4278, 3595, -4278, -4278, 160, 2219, - -4278, -4278, -4278, -4278, 16401, 63654, -4278, 3897, 3607, -4278, - -4278, -4278, 3512, 3554, -4278, -4278, 2708, -4278, -4278, -4278, - -4278, 920, 3888, 580, -4278, 3564, -4278, -4278, -4278, 3565, - 2018, 57939, -4278, 834, 2708, 346, 57939, 3921, 3806, -4278, - 57939, 7663, -4278, -4278, -4278, -4278, 3517, 3519, -4278, 57939, - -4278, -4278, -4278, 3799, 1399, 3794, 57939, 2167, 346, 3523, - 2176, -4278, 7, 5068, -4278, -4278, 682, 621, 2213, 28050, - 3518, 1120, 968, -4278, 968, -4278, -4278, -4278, -4278, 4187, - 311, -4278, -4278, -4278, -4278, -4278, 26127, -4278, 999, -4278, - -4278, 3405, 76, 3526, 57939, 3864, -4278, -4278, -4278, -4278, - 1167, -4278, 179, 1167, 1167, -4278, 2424, -4278, 3567, 220, - -4278, -4278, 3568, -4278, -4278, -4278, 1167, 179, 220, -4278, - -4278, -4278, -4278, 1167, 2714, 3663, -4278, 220, -4278, -4278, - 4112, -4278, 220, 4112, 1167, 1167, 57939, -4278, 57939, -4278, - 741, -4278, -4278, -4278, -4278, -4278, 2181, -4278, -4278, -4278, - -4278, 38889, -4278, 12441, -4278, -4278, -4278, -4278, -4278, 606, - 60479, -4278, -4278, -4278, 4015, 3726, 3728, -4278, -4278, -4278, - 3541, -4278, 3543, 346, 2224, -4278, -4278, -4278, 3545, 2627, - 4139, -4278, -4278, -4278, -4278, 183, 3821, 3115, 3115, 3115, - 1129, -100, 2219, -4278, -4278, 3604, 26127, 17721, 3662, 57939, - 1133, 3697, -4278, 4159, 4161, 4054, 4165, 920, -4278, -113, - -4278, -4278, 12441, 3562, 12441, 3571, 2197, -4278, -4278, 197, - 197, -4278, 834, -4278, -4278, -4278, 194, -4278, -4278, 3754, - -4278, -4278, -4278, 1304, -4278, -4278, 3694, 3572, 2241, 121, - 57939, -4278, 3851, 1605, -4278, 3578, 3547, -4278, 3114, 3544, - -4278, -4278, -4278, -4278, 968, -4278, 3573, -4278, 3577, 3580, - 2919, 2928, 2936, 1129, 1129, -4278, -4278, -4278, -4278, -4278, - 3974, -4278, -4278, 2267, -4278, 789, 3854, -4278, -4278, -4278, - -4278, 1167, -4278, 2281, -4278, -4278, -4278, -4278, -4278, -4278, - 2301, -4278, -4278, -4278, 49049, 411, 2814, 4216, -4278, 3632, - -4278, 4106, 3978, -4278, 4222, -4278, 2733, -4278, 3980, 3875, - 796, 3602, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, 851, 3618, 3727, -4278, 64289, -4278, 57939, 57304, - -4278, -4278, 33171, -4278, -4278, -4278, 4055, -4278, 2018, -4278, - -4278, 4075, 2259, -4278, -4278, 12441, -4278, -4278, -4278, 3699, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, 1415, -4278, - -4278, 27409, 2888, -4278, 3114, -4278, 2323, -4278, -4278, -4278, - 3689, 796, 796, 4114, 4116, 796, 796, 796, 796, 3603, - 3697, -4278, 4095, 179, 179, 4211, 179, -4278, 4212, 4213, - -113, -4278, 2018, 57939, 2018, 57939, -4278, 4068, 4068, -4278, - 3611, -4278, -4278, -4278, -4278, -4278, 1816, -4278, 2813, 1026, - 411, 796, 3871, 291, 121, -4278, -4278, 796, 346, 3613, - 291, 1605, -4278, -4278, 125, 3615, 2288, -4278, 2336, 3617, - 3620, -4278, 57939, 3622, 57939, 57939, -4278, -4278, -4278, 3623, - -4278, 57939, -4278, -4278, -4278, 312, -4278, -4278, 220, 179, - 220, -4278, -4278, 3628, -4278, -4278, -4278, 3909, 3680, -4278, - 3640, -4278, -4278, -4278, 40159, 3905, -4278, 3637, 255, -4278, - 12441, 4135, -4278, -4278, -4278, 2373, -4278, -4278, 38889, -4278, - -4278, -4278, 2658, 346, 194, -4278, -4278, 3644, -4278, 796, - -4278, 3641, -4278, -4278, 57939, 3645, -4278, 411, 411, 796, - 796, 3137, 3137, 3114, 49049, 3756, -4278, -4278, 796, -4278, - -4278, 179, -4278, 179, 179, -4278, 2387, 2394, 1303, -4278, - -4278, 3647, 7663, 2599, 26127, 3989, 2396, 968, 968, 291, - 1026, -4278, -4278, -4278, -4278, 3115, 1610, -4278, 4014, 4294, - -4278, 40794, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - 57939, 57939, 3651, 2414, 57939, 2430, 2437, 3544, -4278, 210, - 210, -4278, -4278, -4278, 2221, -4278, 3628, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, 7, 4245, 3930, 4248, 2018, 12441, - -4278, -4278, 57304, -4278, -4278, -4278, 27409, 16401, 2622, -4278, - 3662, -4278, 3659, -4278, -4278, -40, -4278, -4278, 411, 411, - -4278, -4278, -4278, -4278, -4278, 2443, -4278, 49049, -4278, -4278, - -4278, -4278, -4278, 4267, -4278, 4268, 3666, 3669, 12441, 3664, - 3673, -4278, -4278, -4278, -4278, 4183, 64289, 4131, 4182, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, 7, 2453, 2457, 57939, 1026, 2464, 121, 1605, - 2480, -4278, 4328, -4278, 1008, 3958, 3959, -4278, 3681, -4278, - 3682, -4278, 3953, -4278, 3957, 2018, -4278, -4278, -4278, -4278, - -4278, -4278, 2489, -4278, 17061, -4278, -4278, -4278, -4278, -4278, - 49049, -4278, 3756, -4278, -4278, -4278, 54129, 54129, 2018, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, 3902, 1026, 2502, - -4278, 1026, -4278, -4278, -4278, -4278, -4278, -4278, 3741, 4206, - -4278, -65, -4278, -4278, 3873, -4278, 3659, -4278, 3690, -4278, - 3154, 3697, -4278, -4278, 3692, 2508, -4278, -4278, 2599, -4278, - -4278, -4278, -4278, 1026, -4278, 210, 210, -4278, -4278, 128, - 4118, 4035, -4278, 17061, 3696, -4278, -4278, -4278, 64289, 4195, - -4278, -4278, -4278, 411, 4089, -4278, 128, -4278, 4305, 3888, - -4278, -4278, -4278, 3881, -4278, -4278, -4278, 179, 4122, -4278, - -4278, 3990, 3705, 64289, 43, 22267, 3869, -4278, -4278, -4278, - -4278, -4278, 49049, 2515, -4278, -4278, 27409, -4278, -4278, -4278, - 25484, 3706, -4278, 796, -4278, 27409, -4278, -4278, 16401, -4278, - -4278 + 7119, 2309, 1791, 1331, -126, 208, 58144, -4291, 155, 1465, + -4291, -168, 99, -4291, -4291, -4291, -4291, -4291, 3590, -4291, + 58144, 105, 1001, -4291, 26282, -4291, -4291, -4291, -30, -4291, + 196, 1465, -4291, 105, 446, -4291, 58144, -4291, 671, 1593, + 105, -4291, -4291, -4291, 51148, -4291, -168, 58144, -4291, 654, + -4291, -4291, 51148, 207, 216, 643, -23, -4291, -4291, 58144, + -4291, 2216, -4291, 608, 1367, 1291, -4291, -4291, 1123, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, 3248, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, 26924, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, 816, 58144, 1056, 58144, 1390, 58144, + 49240, 58144, -4291, 1376, -4291, -4291, 1525, 1131, -4291, -4291, + 1465, 81, -4291, -4291, 1762, -168, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, 1140, -4291, -4291, 1236, -126, -4291, -4291, -4291, + -159, -4291, 1878, 1683, 1448, 58144, 952, 12575, 1675, 1675, + 1675, 1702, 1729, 1675, 1675, 1675, 58144, -4291, 1675, 1675, + 1675, 1465, -4291, -4291, -4291, 1807, 37792, 58144, 1570, 226, + -31, 49240, -4291, 1408, 58144, -126, 79, -4291, 1724, -4291, + -4291, -4291, 64504, 1465, -4291, 1918, 1790, 971, 58144, -4291, + -4291, -4291, 64504, 1109, 925, 1382, -4291, -4291, 1532, -4291, + 38428, 186, -4291, -4291, -4291, 1379, 2593, -4291, 28850, 5845, + 1532, 1529, -126, -83, 1546, -126, -4291, -4291, 58144, -126, + 1465, 1735, -4291, 12575, -4291, 309, 309, 309, -4291, 309, + -4291, 309, 608, 1407, 1583, -4291, -4291, 1415, 58144, 1841, + -4291, 1841, -4291, -4291, 1841, 1335, 1592, 1851, 1862, 1871, + 1556, 763, 1131, 1786, -4291, -4291, -4291, 1459, -19, -4291, + 1536, 41608, -4291, 58144, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, 1384, -4291, 1577, 131, 1618, 1980, -4291, 49240, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, 26282, + 1506, 58144, -4291, 2017, 12575, 1236, -4291, 1615, -4291, -4291, + 26282, -4291, -4291, 26282, 266, 1277, 58144, -4291, -4291, 2160, + -4291, -4291, -4291, 51784, 952, 1553, 1558, 1571, 17863, -4291, + 1585, 1603, 1619, 12575, 1625, 1633, 1637, 1641, 1645, 1648, + 1656, 1661, 1674, 1680, 1692, 1694, 1703, 1705, 1705, 1705, + 1738, 1743, 1751, 1754, -177, 1758, -4291, 1783, 1794, 1802, + -4291, -4291, 1810, 1814, 1825, 1830, -4291, -4291, 1837, 1843, + 1853, 13236, 1855, 1857, 1860, -4291, 23060, 1868, 1872, 1875, + 1884, 1910, 1925, 1927, 1931, 1950, -4291, -4291, 12575, 1738, + -4291, -4291, 1952, -4291, 1954, 1967, 2002, 2004, 2007, 2012, + 2025, 2042, 2060, 2070, 2086, 2089, 2092, 2106, 2117, 2120, + 2123, 1738, -4291, -167, 2126, 2129, 1128, 2131, -4291, 2137, + -4291, 335, 2153, 1705, 1738, 1738, 2159, 2161, 2165, 2170, + 2172, 2175, 17863, 17863, 17863, 12575, -4291, 58144, -4291, 58144, + 1322, 2168, -4291, 2683, 17863, 212, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, 1537, 1817, -4291, -4291, -4291, -4291, -4291, + -4291, 2177, 1548, 2162, 58144, 58144, 58144, 2223, 58144, 58144, + 58144, -4291, 49240, 1845, 58144, -4291, -4291, 1675, 1824, 4681, + 32055, 2090, 2045, 1866, 1705, -4291, -4291, 607, 613, 672, + 2164, -4291, -4291, 1996, 700, 2186, -4291, 712, 440, -4291, + 92, 723, 727, -4291, -4291, -4291, -4291, -4291, -4291, 1999, + 2345, 2113, -4291, -4291, 175, -4291, -4291, 58144, -4291, 2644, + 12575, -4291, -4291, -4291, 2588, 2324, -4291, -4291, -4291, 894, + 2788, 254, 26282, 1331, 58144, 915, 65776, 65776, 58144, -4291, + 61324, 2182, -4291, -4291, 8188, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, 2190, -4291, -4291, 2185, + 12575, 901, -4291, -124, -4291, -4291, 2559, -4291, -4291, 46060, + 26282, 1491, 65140, -4291, -4291, -4291, 23704, -4291, -4291, 2798, + -4291, 2199, -4291, -4291, 1817, 3781, -4291, 2479, 2090, 2503, + -4291, 2686, -4291, 2515, 2410, 1277, 2297, -4291, 2848, 2624, + -4291, 2707, 1677, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, 2264, 2593, -4291, -4291, 52420, 1067, 2432, + -135, 1130, 1344, 37153, 57, 49240, 1575, 874, 29491, 42244, + 2263, -4291, -4291, -4291, -128, 2425, -4291, 2759, -4291, 1, + -4291, 2291, 1129, 1, 46696, 2624, 213, -4291, 215, -4291, + 2756, -4291, -4291, -4291, -4291, 2419, 2407, 2458, -4291, 368, + 2078, -4291, -126, -4291, 828, -4291, 2445, 2624, 1, 213, + -4291, 2696, 2830, 606, 2806, -4291, 1154, -4291, -4291, -4291, + -57, 2910, -4291, 2347, -4291, -4291, -4291, 26282, -4291, -4291, + -4291, 2588, -4291, 189, -4291, -4291, -4291, -4291, 2350, -4291, + -4291, 2650, 2480, -4291, -4291, 764, 2376, 819, -4291, 2877, + -4291, 1331, 58144, -4291, -4291, -4291, 443, 1124, 1525, 1841, + -4291, 1841, 1841, 1841, 1841, 81, 42880, -4291, -4291, -4291, + 2917, 2938, 1705, 2397, -4291, -4291, -4291, -4291, -4291, 3057, + -4291, -4291, 2685, 2953, 2953, 2953, 3072, -4291, -4291, -4291, + 26282, -4291, -4291, -4291, 131, -4291, 2597, 2468, -4291, 58144, + 1618, -4291, 26282, -4291, 2839, 2436, -4291, -4291, 2697, 12575, + -4291, -4291, 12575, 64504, 2945, 1322, -4291, -4291, 163, -4291, + -4291, 26282, 863, -4291, 3041, 2672, -4291, -4291, -4291, 3057, + 2953, 26282, -4291, 2464, -4291, 2456, -4291, 12575, 12575, 358, + 3060, 3140, 3140, 3140, 1322, 2538, 12575, 12575, 12575, 12575, + 12575, 12575, 12575, 12575, 12575, 12575, 12575, 12575, 359, 2504, + -4291, -4291, -4291, 154, -4291, 2514, 12575, 12575, -4291, 12575, + 12575, 27566, -4291, 4809, 12575, 12575, 1022, 3027, 12575, 12575, + 12575, 12575, 3733, 12575, 12575, 12575, 27566, 3188, 2541, -4291, + 2547, 377, 12575, 12575, 382, 12575, 12575, 12575, 12575, 12575, + -4291, -4291, 12575, 12575, 12575, 12575, 17863, 12575, 12575, 12575, + 12575, 12575, 12575, 2548, 12575, 3140, 3140, 12575, 12575, 1101, + -4291, -4291, 12575, 2717, 2717, -4291, 12575, 9270, 12575, -4291, + -4291, 2556, -4291, -4291, -4291, 27566, 3140, 3140, 12575, 12575, + 12575, 3060, 3060, 3060, 232, 2560, -129, 12575, 30132, 2555, + -4291, -4291, -4291, -4291, 12575, 12575, 12575, 17863, -4291, 1755, + -4291, -4291, -4291, -4291, -4291, 13897, 17863, 17863, 2568, 17863, + 17863, 17863, 17863, 17863, 2960, 17863, 17863, 18524, 19185, 17863, + 17863, 17863, 17863, 944, 3060, 49240, 17863, 12575, -4291, -4291, + 58144, -4291, -4291, -4291, 2587, -4291, 2883, 1845, -4291, 47332, + -4291, 826, 3100, -4291, 46060, 26282, -4291, 2603, -4291, 2983, + -4291, 2984, 2987, 2988, -4291, -4291, -4291, -4291, 3229, 2993, + -4291, -126, 2996, -4291, -4291, 2627, -4291, -4291, -4291, 19846, + 49240, -4291, 2629, -4291, 2645, -4291, -4291, -4291, -4291, -4291, + -4291, 2742, -4291, -4291, -4291, -4291, 2651, -4291, 46060, 2651, + -4291, -4291, 2651, -4291, -4291, 2651, 41608, 56, 3266, -4291, + -4291, 58144, -4291, 58780, -4291, 3078, 1397, -4291, 23704, -126, + -4291, 3079, 14558, -4291, -4291, -4291, 3030, 346, 2656, -4291, + -4291, -4291, -4291, 3118, 58144, -4291, -4291, -4291, 12575, 3028, + 2663, -4291, -4291, -4291, 225, 26282, -4291, 1322, -4291, 127, + 127, 2919, 1419, 49240, -4291, -4291, 210, 2671, -4291, 2765, + 2687, -4291, 2771, -4291, -4291, 26282, 2682, -4291, 26282, -4291, + -4291, -4291, 2949, 2776, -4291, -126, 925, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + 2695, 2708, 3157, 2698, 46060, 41608, 101, -4291, 58144, -4291, + 1228, -4291, -4291, 964, -4291, -4291, 924, 43516, -4291, 231, + 2727, 2758, 3108, -4291, -4291, 2705, -4291, 12575, -4291, 2700, + 2712, -4291, -128, -4291, 47332, 58144, -4291, -4291, -4291, -4291, + -4291, 3294, 12575, -4291, 46060, -4291, 1193, -4291, 909, 107, + -128, -4291, -4291, -4291, -4291, -4291, 58144, 53056, 2713, 9931, + 2838, 3123, -4291, -4291, -4291, 2729, 1841, 58144, 58144, 58144, + 26282, 58144, 26282, -4291, 896, 896, -4291, -4291, -4291, -4291, + 1, 58144, 58144, 1, 41608, -4291, 213, 728, 58144, 1, + -4291, 3124, 2826, -4291, -4291, -4291, 3196, -4291, -4291, 3187, + 2731, -4291, 3228, -4291, -4291, 2849, 213, -4291, -4291, 26282, + -4291, -4291, 213, -4291, 213, 213, 12575, 1, 1, 1, + -4291, -50, -4291, -4291, -4291, 2894, -83, -4291, -4291, -4291, + 945, -4291, -4291, 309, 2998, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, 1000, -4291, -4291, -4291, + 3226, -4291, 47332, 41608, 3204, 1841, 1841, -4291, -4291, 3235, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, 1841, -4291, -4291, + -4291, -4291, -4291, -4291, 1618, 49240, 58144, 58144, 58144, 26282, + -4291, -4291, -4291, -4291, -4291, 100, -4291, -4291, -4291, 2247, + 3267, -4291, 49240, 3340, -78, 1283, 3340, 2754, -126, 1278, + -4291, 1278, -4291, -4291, -4291, 986, 1841, -4291, -4291, 2755, + -4291, 3008, -4291, -4291, 53692, 26282, -4291, -4291, -4291, 1527, + 2757, 2760, 1322, 1322, 61960, 3361, 2793, 4502, -4291, -4291, + 26282, -4291, 72, -4291, -4291, -4291, 2822, -4291, -4291, -4291, + -4291, 2467, -4291, -4291, 2414, 2819, 2772, -4291, 2949, -4291, + 1509, 58144, 3232, 34609, -4291, 563, 306, -4291, 3140, 2778, + -4291, 2783, 2784, 2785, 12575, 255, 480, 338, -201, 1438, + 484, 570, 1318, 749, -4291, 1616, 751, 782, 885, 236, + -4291, 2790, 2782, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, 2794, -4291, -4291, -4291, 923, 1013, 1458, 1490, 2795, + 2796, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, 3254, -4291, 1035, 1722, -4291, -4291, -4291, -4291, 2799, + -4291, -4291, 1495, 1041, 1077, 277, 2809, 1771, 1088, 1818, + 1820, 2808, 27566, 58144, 3140, 2805, 1497, 1499, 3140, 2812, + 1113, 1631, 1847, 1880, 1903, 1639, 1713, 1178, 1921, 2745, + 1721, 1233, 1240, 1725, 1242, 1293, -4291, 1745, 2814, 2815, + 1300, 206, 3140, 2817, 289, 2818, 2824, 1752, 10592, 11253, + 11914, 228, 1320, -4291, 2820, -4291, 2547, 2827, 2828, 336, + 220, 1756, -4291, 12575, -4291, -4291, 2810, -4291, 2879, 165, + 107, -4291, 2989, 58144, 2358, 193, -4291, -4291, -4291, -4291, + -4291, -4291, 884, -4291, 2831, -4291, 2834, 2477, 2832, 12575, + 248, 2832, 3453, 960, 960, 17863, 3230, 2652, 13236, 988, + 13236, 988, 2832, 2832, 2832, -4291, 17863, 2835, 17863, 17863, + -4291, 3060, 1322, 2836, 1132, 58144, 26282, 826, 2837, -4291, + -4291, -4291, -4291, -4291, -128, -4291, 2840, 218, 26282, 49240, + 2841, -4291, 3356, -4291, -4291, -4291, -4291, -126, -4291, -4291, + 5080, -4291, 26282, 2930, 2937, 2943, -4291, 32696, -4291, -4291, + -4291, -4291, 32696, 14, -4291, 58144, -4291, 2934, -4291, -4291, + -4291, 3278, -4291, 3281, -204, -4291, 24346, 24346, -4291, 24346, + -4291, -4291, -4291, -4291, -4291, 440, -4291, -4291, -4291, -4291, + 374, 989, 3178, 2727, -4291, -4291, -4291, -4291, -4291, -4291, + 33973, 1322, -4291, 26282, -4291, 3273, 940, 26282, -4291, -4291, + 3271, 1322, -4291, -4291, -4291, -4291, -4291, -4291, 2858, -4291, + 2861, -4291, -4291, -4291, -4291, -4291, 2074, 2976, -4291, 3515, + -4291, 12575, -126, -4291, 46060, 46060, 26282, 26282, 26282, 695, + 12575, -4291, 1813, 2871, -4291, -4291, 2804, -4291, 3520, -4291, + 3781, 19846, 47332, 3321, 3336, -4291, 2881, 24346, 24346, 24346, + -4291, -4291, -4291, -4291, 2977, 2977, -4291, 30773, -4291, 12575, + -4291, -4291, -4291, 3364, -4291, 3070, 618, -4291, -4291, -4291, + -4291, -4291, 58144, -4291, 3541, -4291, -4291, 2887, -4291, -4291, + 26282, -4291, -4291, 3337, -4291, 3061, -4291, 1322, -4291, 2893, + 52420, 3362, 9931, 3366, -4291, 47968, -4291, 1322, -128, 2902, + 2908, -4291, -4291, 3291, 659, -4291, 2912, 2913, -4291, 2904, + 2911, 2914, 52420, 12575, -4291, 909, -4291, -4291, -4291, -4291, + -4291, 17863, 1783, -4291, 1322, -4291, -4291, -126, 3374, -126, + 12575, 2909, 58144, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, 1, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, 3153, 2624, 2078, + 3123, -4291, 1, 213, 26282, 1, 1, 1322, -4291, -4291, + -4291, -4291, -4291, -4291, 2922, -4291, 2980, -4291, -4291, 3091, + 64504, 2929, -4291, 3393, 2624, -4291, -4291, -4291, 102, 1151, + 2933, 1841, -4291, 58144, 58144, 1841, 1841, 58144, -4291, -4291, + -156, 3216, 3218, -4291, -4291, -128, -128, 3243, -4291, -126, + 3071, 3077, 3082, 3085, 3088, 3113, -4291, -4291, -126, -126, + -4291, -4291, -128, -4291, 1559, -4291, -4291, -4291, -4291, 1842, + -4291, -128, -128, -4291, 178, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, 1182, -4291, 5035, -4291, -4291, 26282, 3242, 26282, + 3424, -4291, 3492, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, 2969, -4291, -4291, 12575, 3059, -4291, -4291, 2793, + -4291, 2985, 2994, 2999, 3000, 3003, 3004, 3005, 3009, 3010, + 3011, 3012, 3013, 3015, 3016, 3017, 3019, 3024, 3036, 3038, + 3040, 3042, 3043, 3044, 2970, -4291, -4291, -4291, 3037, -4291, + -4291, -4291, -128, -128, -128, -128, -4291, 2374, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, 3346, 1136, 58144, 3064, + -4291, 34609, -4291, -4291, 945, -4291, 3026, 15219, -4291, 3034, + -4291, 12575, -4291, -4291, -4291, 1906, 12575, 12575, 3512, 2585, + -4291, 48604, -4291, -4291, -4291, 12575, -4291, 12575, -4291, 12575, + 12575, 12575, 12575, 48604, 2585, 12575, -4291, 3039, -4291, 3425, + 3444, -4291, -4291, -4291, -4291, 12575, 12575, -4291, 12575, 12575, + -4291, 12575, 12575, 12575, 12575, -4291, 12575, -4291, -4291, 17863, + -4291, 3031, 3046, -4291, -4291, -4291, 3050, -4291, 12575, -4291, + -4291, -4291, -4291, -4291, -4291, 12575, -4291, 12575, -4291, 12575, + 12575, -4291, 12575, 12575, -4291, -4291, -4291, 15880, 12575, 12575, + 3051, -4291, -4291, 12575, 12575, 12575, -4291, 12575, 264, 12575, + 453, 12575, 2072, 12575, -4291, 12575, -4291, -4291, -4291, -4291, + 12575, 399, 2074, 2804, 3053, -4291, 1956, 2707, -4291, 1803, + 2810, 3054, 3214, 1228, -4291, -4291, 49240, 12575, -4291, -4291, + -4291, -4291, -4291, -4291, 17863, 362, 3055, 17863, -4291, 3453, + 3733, 3733, 2581, 12575, 248, 3453, 12575, 3058, 3056, -4291, + 12575, 58144, -4291, -4291, -4291, 47332, -4291, 49240, 46060, -4291, + -4291, -4291, 218, -4291, 2603, 3076, -4291, -4291, -4291, 2858, + 60, 3081, 3065, -4291, -4291, -4291, -4291, -4291, -4291, 1968, + -4291, 41608, 149, 3692, 41608, -4291, 3052, -4291, 3066, 3125, + 3126, 3144, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, 2624, 64504, 1813, -4291, -4291, 3074, -4291, + -4291, 2697, 2977, 3087, 3451, 3650, -4291, -4291, -4291, -4291, + 64504, 64504, 12575, 58144, 17863, -4291, 3688, 3092, 3101, 3097, + 3103, 1322, -4291, 3186, -4291, -4291, -4291, 51, -4291, -4291, + -4291, -4291, -4291, 806, 317, -4291, -4291, 3110, 3110, 21774, + -4291, -4291, -4291, 58144, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, 3127, -4291, -4291, 3384, 46060, 41608, 3573, + 3574, 3575, 576, -4291, -4291, -4291, 49240, 3119, -4291, -4291, + -4291, 1322, 3121, 1588, 44152, 3600, 44152, 44152, -4291, 827, + 3521, 3523, -4291, 3391, 2174, 3391, -4291, -4291, 827, 945, + 2949, -4291, 12575, 3736, 3567, 3447, -4291, 49876, -4291, 35245, + -4291, 7679, -4291, 46060, -4291, -4291, -4291, -4291, -4291, 3227, + 3231, 1400, -4291, -4291, 3540, 3368, -4291, -4291, -4291, -128, + 1322, -4291, 2713, 3145, 31414, -4291, 1568, -4291, -4291, 1322, + 194, -4291, -4291, -4291, 3432, -4291, -4291, 3374, -4291, 2727, + 213, -4291, -4291, -50, 2496, -4291, 27566, 62596, 2804, 3470, + -4291, -4291, -4291, 167, 3801, -4291, 58144, 3152, 615, -4291, + -4291, 58144, 3615, 214, 214, 3436, 26282, 26282, 4236, 47968, + 44788, -4291, -4291, -4291, -4291, 3700, -4291, 3701, 1332, -4291, + -4291, 2513, 1283, -4291, -126, -126, -126, -126, 2804, -126, + -126, 1970, -4291, 2513, 2513, 1278, -4291, 173, -4291, -4291, + -4291, -4291, 2658, -128, 3741, 3426, -128, -128, 3741, -128, + 3427, 3428, -128, -128, 3250, 3687, -128, 3570, 3276, 2234, + 3572, -128, 3435, -4291, 3280, 3695, -128, -128, -128, -128, + -128, 3741, 3440, 3792, -128, -128, -4291, -128, 3442, 3441, + 183, 3449, 3450, -128, -128, -128, -128, 889, 58144, -128, + -128, 3454, -128, -4291, -4291, 5677, -4291, -4291, -4291, -4291, + -4291, -4291, 783, 24994, -4291, -4291, -4291, -4291, -128, -4291, + 184, -4291, 3398, -4291, 397, 50512, 63232, 3189, 3207, 54328, + 1322, 64504, 12575, -4291, 3210, 3211, 3215, 2804, -126, -126, + 1568, -126, 2804, -126, -126, -126, -126, -126, -126, -126, + 2804, 2804, -126, 140, 2149, -126, 2804, 4502, -4291, -126, + 2074, 2513, 2513, 2414, -4291, 3646, -128, -4291, 235, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, 3205, + 945, 2727, 1699, 2727, 3221, -4291, 13236, 1761, -4291, 1322, + 12575, 1322, 1983, -4291, 3233, 3233, 3233, -4291, 3236, -4291, + -4291, 3233, 3636, 3233, 3637, 3237, 3240, 1981, 1928, -4291, + 2008, 2219, 1776, 3241, 3247, 1537, -4291, 12575, 12575, 1781, + 364, 1804, -36, 1327, 1333, 375, -4291, 1823, 3323, -4291, + -4291, 1828, 1844, 1876, 1891, 1359, 1895, 2022, 13236, 1897, + 275, 386, -4291, 1902, 1418, 1420, 1914, 12575, 1936, 12575, + 1998, 12575, 2005, 2018, 2031, 3244, 3244, 191, -4291, 3253, + -4291, -4291, -4291, 3255, -4291, -4291, -4291, -4291, 2727, 2264, + 1803, -4291, 3251, 1202, -4291, -4291, 3256, 1322, 3260, -4291, + -4291, 12575, -4291, 212, -4291, -4291, 17863, 427, 3264, -4291, + 1322, -4291, -4291, 3265, 1537, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, 3249, -4291, 3481, -4291, -4291, 2578, 32696, + -4291, 58144, 1304, -44, -4291, -4291, 49240, 3542, -4291, 3272, + 35881, 41608, 41608, 41608, 3275, -4291, 59416, 3552, 26282, -4291, + 3696, -4291, -4291, -4291, -4291, 58144, 65776, 65776, 65776, 65776, + 3277, 3279, -4291, -4291, -4291, 3453, 3657, 3536, -4291, -4291, + 2074, 58144, 46060, 3591, -4291, -4291, 3486, 2593, 27566, -4291, + 3287, -4291, 3287, 1799, 3289, 2034, -4291, -4291, -4291, 3283, + 2297, 2039, -4291, 19846, 3748, 2840, -4291, 41608, 41608, 41608, + -4291, 2646, -4291, 30773, 12575, -4291, -4291, -4291, -4291, -4291, + 44152, -4291, -4291, -198, 1202, -4291, 2095, -4291, -4291, -4291, + 3691, 3391, 3391, 827, 3693, 837, -4291, 2666, -4291, 2593, + 1322, 12575, -4291, 3568, -4291, 54964, -4291, -4291, -4291, -4291, + 1146, -4291, -4291, 3298, 3299, 144, 3526, -4291, -4291, -4291, + -4291, 9931, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, 2624, -4291, -4291, -4291, -4291, -4291, 1, + -4291, 3314, -4291, 3305, 3306, -4291, -128, 3339, -4291, -4291, + 41608, 3500, -4291, 1047, 3310, 58144, -4291, 3852, -4291, -4291, + -4291, -4291, -4291, 26282, -4291, -4291, 26282, 20490, -4291, -4291, + 3578, -4291, 3957, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, 1842, -4291, -4291, -4291, + 1182, -4291, -4291, 28208, 1841, -4291, 209, -4291, 1841, 1527, + 1527, 3746, 55600, 28208, 105, 1568, 2804, 1702, 2804, 56236, + 105, -126, -126, 2646, -128, 2804, -4291, -4291, 3718, 1675, + 3719, 1702, 1702, -4291, 49240, 58144, -4291, -128, 1413, 2804, + 56872, 1568, 1568, 1702, 105, 27566, 1316, 2728, -4291, -126, + 105, -4291, -4291, -4291, -4291, 26282, 105, 105, 3334, 3090, + 3167, 3213, -4291, -4291, -4291, 2804, 2728, 56236, -4291, -4291, + 4300, -4291, -4291, -4291, 21132, 58144, 343, 518, -4291, 3319, + 39700, 3329, 1331, 341, 3412, 288, -4291, 153, -4291, -4291, + -4291, 3773, 3333, 1294, -4291, 3331, -4291, 56236, -4291, 3341, + -4291, 3343, -4291, 60052, 1322, 2804, 2804, 2804, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, 58144, 2513, 1136, -4291, + 34609, 2727, 3568, -4291, -4291, 3733, -4291, 1322, 12575, 912, + -4291, -4291, -4291, -4291, 1563, -4291, -4291, -4291, 3348, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, 3075, -4291, -4291, 2585, + -4291, -4291, -4291, 3345, 3733, 3733, -4291, -4291, 12575, -4291, + 3948, 3518, 12575, 12575, -4291, 12575, -4291, 252, 3349, 3377, + -4291, -4291, -4291, -4291, 12575, -4291, -4291, 3733, -4291, 12575, + -4291, -4291, 12575, -4291, 12575, 12575, -4291, 2063, -4291, 2104, + -4291, 2110, -4291, -4291, -4291, 2074, 3352, 3737, -4291, -4291, + -4291, 2074, 3550, -4291, -4291, 2074, 2804, 3337, 2705, -4291, + -4291, -4291, 2707, -129, 58144, -4291, -4291, 2061, -4291, -4291, + 12575, -4291, 49876, -4291, -4291, 2804, 3842, 3738, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, 3813, -4291, 3462, -4291, 164, -4291, + -4291, -4291, 626, 626, 626, 16541, 2567, 3873, -4291, -4291, + -4291, 3696, 3758, -4291, 121, 3372, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, 58144, 3375, 1672, -4291, 2094, -4291, + -4291, 3376, -4291, -4291, -4291, 2264, 3379, -4291, -128, 16541, + 3110, 3549, -4291, -4291, 1799, 27566, 35245, -4291, -4291, 58144, + -4291, 41608, 2881, 2881, 2881, 44788, -4291, -4291, 1588, -4291, + 1228, 3392, -4291, 945, -4291, 827, 3775, 3778, -4291, 827, + -4291, -4291, -4291, 2264, 1590, 1588, 12575, 2624, -4291, -4291, + 36517, -4291, -4291, -4291, -4291, -4291, -4291, 31414, 52420, -4291, + 2624, -4291, -126, 2334, 27566, 2727, 16541, -4291, -4291, 58144, + -4291, -4291, -4291, -4291, 3529, -4291, 419, 3665, 3409, -4291, + 3388, 3389, -4291, 26282, 3395, 3400, 3397, -4291, -4291, -4291, + 49, -4291, 6174, -4291, -4291, -4291, -4291, -4291, 105, 3390, + 3795, 3796, 1527, -4291, 1841, 28208, -4291, 1841, 1841, 1331, + -4291, -4291, -4291, 125, 56236, -4291, -4291, 28208, -4291, -4291, + -4291, 3403, -4291, -4291, 2074, -4291, -4291, 44788, -126, -4291, + 1702, 58144, -4291, 28208, 28208, -4291, 3434, -126, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, 28208, 56236, 3404, + -4291, 1588, -4291, -4291, -4291, -4291, -4291, 1918, -4291, 56236, + -4291, -4291, 56236, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + 3411, 2694, 2497, -4291, 3408, -4291, 58144, -4291, -4291, 26282, + -4291, -4291, -4291, 5253, 58144, -4291, -4291, -4291, -4291, 58144, + 4052, -4291, 3658, 12575, 12575, 3697, 58144, 3699, -4291, 3994, + -4291, -4291, 3840, 3883, 58144, 5253, 3886, 3887, -4291, 3430, + -4291, 54328, 3522, 2100, -4291, -4291, 2145, -4291, -4291, 2150, + -4291, -4291, -4291, -4291, -4291, 3026, -4291, 3808, 976, 1322, + 3433, 3437, 3438, 3439, 239, 2242, 3727, -4291, -4291, -4291, + 3233, -4291, 3236, -4291, -4291, -4291, 4036, -4291, -4291, 3233, + 3848, -4291, -4291, -4291, 3452, -4291, 3455, 3457, 2115, -4291, + 309, 3458, 2141, 1434, 2261, 3768, 3846, -4291, 3690, -4291, + 2180, 1069, 2184, 2188, 2207, 2209, -4291, -4291, -4291, -4291, + -4291, 3460, -4291, -4291, 524, -4291, 3461, 3567, -4291, -4291, + -4291, -4291, 2265, -4291, -4291, 2287, -4291, -4291, 4103, 3742, + -4291, -4291, -4291, -126, 159, 3496, 3496, 3496, 1783, 1322, + 2293, -4291, 64504, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + 3877, 58144, -4291, -4291, 3473, 3515, 58144, -4291, 3536, -4291, + 2705, 27566, 16541, 3476, 3472, -4291, 819, -4291, -4291, 3471, + -4291, -4291, 2881, -4291, 4060, -4291, -4291, -4291, 2887, 1540, + 3528, 827, 827, 3510, 3530, 12575, 3483, -4291, 93, 2705, + -4291, -4291, 12575, -4291, -4291, 1322, 3722, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, 3568, -4291, 3480, 3484, -4291, -4291, + -126, 872, -4291, -4291, 295, 3663, 49240, 3488, 58144, 58144, + 3490, -4291, -4291, 21132, -4291, 4126, -4291, -4291, 12575, 1841, + -4291, -4291, 28208, 3544, 974, 28208, 28208, 3971, 4019, 4022, + -4291, 28208, 2467, 58144, -4291, 3294, -4291, 28208, 3403, -4291, + 234, 3596, -4291, 343, -4291, 27566, -4291, -4291, -4291, 58144, + -4291, 26282, -4291, -4291, 3499, -4291, 3233, 3233, 3233, -4291, + -4291, 3233, -4291, 3236, 3744, 3501, 3236, 3236, -4291, -4291, + -4291, -4291, -4291, 239, 372, -4291, -4291, 239, -4291, -4291, + -4291, 176, 1489, 3236, -4291, -4291, -4291, -4291, -4291, 3503, + -4291, 3233, 3233, 3233, -4291, -4291, 239, 3233, -4291, 3233, + -4291, 3236, 179, 160, 3233, 3233, 3233, 3348, 3502, -4291, + 2303, -4291, -4291, 1322, 3733, 4074, -4291, -4291, 3660, -126, + 4014, 58144, 158, -4291, -4291, 3294, 4034, 2462, -4291, -4291, + -4291, 64504, -4291, 2804, -4291, 2804, -4291, 2804, 45424, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, 211, -4291, -4291, 48604, + 4131, -4291, 3798, 3513, -4291, -4291, -4291, -4291, -4291, 239, + -4291, -4291, -4291, -4291, 12575, -4291, -4291, -4291, 12575, -4291, + -4291, 3832, 3993, -4291, -4291, -4291, -4291, -4291, -4291, 3519, + -4291, 2804, 3568, -4291, -4291, 2804, 4032, -4291, -4291, -4291, + 3616, 3617, -4291, -4291, 3618, -4291, -4291, 162, 2466, -4291, + -4291, -4291, -4291, 16541, 63868, -4291, 3916, 3625, -4291, -4291, + -4291, 3531, 3577, -4291, -4291, 2707, -4291, -4291, -4291, -4291, + 905, 3905, -129, -4291, 3583, -4291, -4291, -4291, 3584, 1322, + 58144, -4291, 390, 2707, 1588, 58144, 3935, 3808, -4291, 58144, + 5253, -4291, -4291, -4291, -4291, 3537, 3538, -4291, 58144, -4291, + -4291, -4291, 3822, 341, 3817, 58144, 2310, 1588, 3545, 2314, + -4291, 819, 5677, -4291, -4291, 882, 604, 2214, 28208, 3544, + 1092, 214, -4291, 214, -4291, -4291, -4291, -4291, 3871, 343, + -4291, -4291, -4291, -4291, -4291, 26282, -4291, 105, -4291, -4291, + 3403, 806, 3543, 58144, 3889, -4291, -4291, -4291, -4291, 1122, + -4291, 309, 1122, 1122, -4291, 2432, -4291, 3585, 239, -4291, + -4291, 3588, -4291, -4291, -4291, 1122, 309, 239, -4291, -4291, + -4291, -4291, 1122, 2876, 3675, -4291, 239, -4291, -4291, 4131, + -4291, 239, 4131, 1122, 1122, 58144, -4291, 58144, -4291, 946, + -4291, -4291, -4291, -4291, -4291, 2329, -4291, -4291, -4291, -4291, + 39064, -4291, 12575, -4291, -4291, -4291, -4291, -4291, 576, 60688, + -4291, -4291, -4291, 4031, 3734, 3745, -4291, -4291, -4291, 3555, + -4291, 3559, 1588, 2230, -4291, -4291, -4291, 3556, 2624, -4291, + 4155, -4291, -4291, -4291, -4291, 249, 3838, 2804, 2804, 2804, + 2149, -61, 2466, -4291, -4291, 3620, 26282, 17863, 3677, 58144, + 1651, 3029, -4291, 4175, 4176, 4067, 4180, 905, -4291, -108, + -4291, -4291, 12575, 3576, 12575, 3579, 2333, -4291, -4291, 1527, + 1527, -4291, 390, -4291, -4291, -4291, 924, -4291, -4291, 3766, + -4291, -4291, -4291, 1812, -4291, -4291, 3697, 3580, 2335, 278, + 58144, -4291, 3863, 992, -4291, 3578, 3549, -4291, 2074, 3536, + -4291, -4291, -4291, -4291, 214, -4291, 3581, -4291, 3582, 3586, + 2930, 2937, 2943, 2149, 2149, -4291, -4291, -4291, -4291, -4291, + 3984, -4291, -4291, 2342, -4291, 797, 3868, -4291, -4291, -4291, + -4291, 1122, -4291, 2353, -4291, -4291, -4291, -4291, -4291, -4291, + 2360, -4291, -4291, -4291, 49240, -126, 3165, 4225, -4291, 3643, + -4291, 4115, 3985, -4291, 4230, -4291, 3527, -4291, 3987, 3882, + -128, 3608, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, 608, 3623, 3724, -4291, 64504, -4291, 58144, 57508, + -4291, -4291, 33337, -4291, -4291, -4291, 4056, -4291, 1322, -4291, + -4291, 4080, 2264, -4291, -4291, 12575, -4291, -4291, -4291, 3722, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, 1410, -4291, + -4291, 27566, 2949, -4291, 2074, -4291, 2372, -4291, -4291, -4291, + 3694, -128, -128, 4116, 4117, -128, -128, -128, -128, 3601, + 3029, -4291, 4096, 309, 309, 4215, 309, -4291, 4217, 4218, + -108, -4291, 1322, 58144, 1322, 58144, -4291, 4071, 4071, -4291, + 3613, -4291, -4291, -4291, -4291, -4291, 288, -4291, 1842, 1684, + -126, -128, 3874, 296, 278, -4291, -4291, -128, 1588, 3621, + 296, 992, -4291, -4291, 49, 3622, 2297, -4291, 2378, 3614, + 3619, -4291, 58144, 3626, 58144, 58144, -4291, -4291, -4291, 3627, + -4291, 58144, -4291, -4291, -4291, 290, -4291, -4291, 239, 309, + 239, -4291, -4291, 3628, -4291, -4291, -4291, 3907, 3661, -4291, + 3629, -4291, -4291, -4291, 40336, 3903, -4291, 3624, 1431, -4291, + 12575, 4125, -4291, -4291, -4291, 2381, -4291, -4291, 39064, -4291, + -4291, -4291, 2705, 1588, 924, -4291, -4291, 3630, -4291, -128, + -4291, 3633, -4291, -4291, 58144, 3635, -4291, -126, -126, -128, + -128, 2842, 2842, 2074, 49240, 3730, -4291, -4291, -128, -4291, + -4291, 309, -4291, 309, 309, -4291, 2422, 2444, 1539, -4291, + -4291, 3639, 5253, 3649, 26282, 3994, 2446, 214, 214, 296, + 1684, -4291, -4291, -4291, -4291, 2804, 1580, -4291, 4007, 4283, + -4291, 40972, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + 58144, 58144, 3647, 2483, 58144, 2506, 2510, 3536, -4291, 1002, + 1002, -4291, -4291, -4291, 2065, -4291, 3628, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, 819, 4234, 3919, 4239, 1322, 12575, + -4291, -4291, 57508, -4291, -4291, -4291, 27566, 16541, 2646, -4291, + 3677, -4291, 3651, -4291, -4291, -46, -4291, -4291, -126, -126, + -4291, -4291, -4291, -4291, -4291, 2518, -4291, 49240, -4291, -4291, + -4291, -4291, -4291, 4257, -4291, 4260, 3654, 3656, 12575, 3659, + 3662, -4291, -4291, -4291, -4291, 4174, 64504, 4118, 4167, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, 819, 2520, 2524, 58144, 1684, 2529, 278, 992, + 2531, -4291, 4315, -4291, 200, 3945, 3946, -4291, 3666, -4291, + 3668, -4291, 3947, -4291, 3951, 1322, -4291, -4291, -4291, -4291, + -4291, -4291, 2534, -4291, 17202, -4291, -4291, -4291, -4291, -4291, + 49240, -4291, 3730, -4291, -4291, -4291, 54328, 54328, 1322, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, 3892, 1684, 2544, + -4291, 1684, -4291, -4291, -4291, -4291, -4291, -4291, 3726, 4200, + -4291, -96, -4291, -4291, 3864, -4291, 3651, -4291, 3679, -4291, + 3453, 3029, -4291, -4291, 3682, 2552, -4291, -4291, 3649, -4291, + -4291, -4291, -4291, 1684, -4291, 1002, 1002, -4291, -4291, 132, + 4108, 4060, -4291, 17202, 3686, -4291, -4291, -4291, 64504, 4188, + -4291, -4291, -4291, -126, 4082, -4291, 132, -4291, 4298, 3905, + -4291, -4291, -4291, 3872, -4291, -4291, -4291, 309, 4113, -4291, + -4291, 3981, 3698, 64504, 821, 22416, 3862, -4291, -4291, -4291, + -4291, -4291, 49240, 2589, -4291, -4291, 27566, -4291, -4291, -4291, + 25638, 3703, -4291, -128, -4291, 27566, -4291, -4291, 16541, -4291, + -4291 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -4056,161 +4062,161 @@ static const int yypact[] = means the default is an error. */ static const yytype_uint16 yydefact[] = { - 0, 933, 1942, 2717, 0, 0, 0, 343, 0, 0, - 1128, 2722, 590, 68, 1811, 1936, 1937, 1720, 1750, 2, - 0, 1144, 272, 176, 0, 80, 319, 1752, 0, 1997, - 0, 0, 384, 1144, 0, 495, 0, 1992, 0, 0, - 1144, 388, 1755, 1979, 249, 176, 2722, 0, 1195, 2498, - 1852, 2008, 0, 0, 0, 1835, 0, 2582, 1800, 0, - 386, 0, 2854, 1184, 0, 3, 8, 21, 0, 43, - 26, 31, 16, 20, 15, 56, 50, 28, 2719, 315, + 0, 933, 1942, 2723, 0, 0, 0, 343, 0, 0, + 1128, 2728, 590, 68, 1811, 1936, 1937, 1720, 1750, 2, + 0, 1144, 272, 176, 0, 80, 319, 1752, 0, 2003, + 0, 0, 384, 1144, 0, 495, 0, 1998, 0, 0, + 1144, 388, 1755, 1985, 249, 176, 2728, 0, 1195, 2504, + 1852, 2014, 0, 0, 0, 1835, 0, 2588, 1800, 0, + 386, 0, 2860, 1184, 0, 3, 8, 21, 0, 43, + 26, 31, 16, 20, 15, 56, 50, 28, 2725, 315, 316, 317, 318, 41, 137, 40, 11, 59, 60, 18, 47, 12, 14, 17, 39, 46, 35, 42, 54, 1181, 24, 25, 32, 48, 64, 22, 61, 57, 23, 1942, 13, 27, 49, 44, 36, 58, 65, 37, 55, 38, 63, 30, 51, 29, 9, 10, 19, 52, 53, 45, 66, 33, 62, 34, 0, 963, 0, 0, 0, 0, - 0, 0, 1038, 945, 2786, 2787, 2788, 0, 1146, 1145, - 0, 0, 1285, 1284, 0, 2722, 2112, 1124, 1155, 2189, - 2191, 2190, 2192, 2193, 2194, 2195, 2196, 2197, 2129, 2198, - 2199, 2200, 2202, 2201, 2203, 2204, 2205, 2130, 2131, 2206, - 2207, 2208, 2210, 2209, 2211, 2132, 2133, 2212, 2213, 2214, - 2215, 2134, 2136, 2135, 2216, 2218, 2217, 2137, 2219, 2220, - 2221, 2223, 2138, 2139, 2140, 2141, 2142, 2222, 2143, 2224, - 2144, 2225, 2226, 2227, 2228, 2229, 2230, 2231, 2233, 2232, - 2145, 2234, 2235, 2237, 2238, 2239, 2236, 2240, 2242, 2241, - 2243, 2244, 2245, 2146, 2246, 2247, 2248, 2249, 2250, 2251, - 2252, 2253, 2147, 2254, 2255, 2256, 2275, 2148, 2257, 2260, - 2259, 2258, 2261, 2262, 2263, 2265, 2264, 2266, 2267, 2149, - 2150, 2268, 2269, 2270, 2271, 2273, 2272, 2277, 2278, 2279, - 2151, 2152, 2274, 2276, 2476, 2280, 2281, 2283, 2282, 2284, - 2153, 2286, 2285, 2154, 2288, 2287, 2155, 2156, 2289, 2290, - 2291, 2110, 2292, 2111, 2293, 2295, 2296, 2297, 2302, 2157, - 2294, 2298, 2299, 2300, 2301, 2303, 2158, 2305, 2304, 2306, - 2307, 2308, 2309, 2310, 2311, 2312, 2313, 2314, 2327, 2318, - 2319, 2321, 2322, 2325, 2320, 2326, 2330, 2329, 2331, 2332, - 2333, 2334, 2335, 2328, 2316, 2323, 2324, 2317, 2336, 2337, - 2315, 2338, 2340, 2339, 2341, 2342, 2343, 2344, 2345, 2346, - 2347, 2348, 2349, 2351, 2350, 2352, 2353, 2354, 2355, 2356, - 2357, 2358, 2360, 2359, 2361, 2362, 2364, 2363, 2366, 2367, - 2159, 2365, 2368, 2369, 2370, 2371, 2372, 2374, 2373, 2160, - 2162, 2161, 2163, 2375, 2376, 2164, 2377, 2379, 2378, 2380, - 2381, 2382, 2384, 2383, 2385, 2386, 2165, 2166, 2387, 2388, - 2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, - 2399, 2400, 2402, 2401, 2403, 2404, 2405, 2406, 2407, 2408, - 2409, 2167, 2410, 2168, 2411, 2412, 2169, 2413, 2170, 2414, - 2415, 2416, 2417, 2418, 2171, 2419, 2420, 2421, 2423, 2424, - 2422, 2425, 2172, 2426, 2427, 2428, 2173, 2430, 2429, 2431, - 2174, 2433, 2175, 2176, 2432, 2178, 2179, 2434, 2435, 2436, - 2177, 2437, 2180, 2438, 2439, 2441, 2440, 2442, 2443, 2444, - 2181, 2445, 2446, 2182, 2447, 2448, 2449, 2450, 2451, 2453, - 2452, 2454, 2455, 2456, 2457, 2459, 2461, 2460, 2458, 2462, - 2463, 2464, 2465, 2469, 2470, 2471, 2472, 2466, 2467, 2468, - 2183, 2473, 2474, 2475, 2477, 2478, 2480, 2479, 2184, 2185, - 2481, 2482, 2188, 2483, 2484, 2488, 2485, 2497, 2486, 2487, - 2490, 2489, 2491, 2492, 2493, 2186, 2494, 2187, 2495, 2496, - 194, 2115, 178, 2116, 2128, 345, 124, 2573, 2572, 1082, - 0, 2723, 2724, 0, 0, 0, 1828, 0, 1748, 1748, + 0, 0, 1038, 945, 2792, 2793, 2794, 0, 1146, 1145, + 0, 0, 1285, 1284, 0, 2728, 2118, 1124, 1155, 2195, + 2197, 2196, 2198, 2199, 2200, 2201, 2202, 2203, 2135, 2204, + 2205, 2206, 2208, 2207, 2209, 2210, 2211, 2136, 2137, 2212, + 2213, 2214, 2216, 2215, 2217, 2138, 2139, 2218, 2219, 2220, + 2221, 2140, 2142, 2141, 2222, 2224, 2223, 2143, 2225, 2226, + 2227, 2229, 2144, 2145, 2146, 2147, 2148, 2228, 2149, 2230, + 2150, 2231, 2232, 2233, 2234, 2235, 2236, 2237, 2239, 2238, + 2151, 2240, 2241, 2243, 2244, 2245, 2242, 2246, 2248, 2247, + 2249, 2250, 2251, 2152, 2252, 2253, 2254, 2255, 2256, 2257, + 2258, 2259, 2153, 2260, 2261, 2262, 2281, 2154, 2263, 2266, + 2265, 2264, 2267, 2268, 2269, 2271, 2270, 2272, 2273, 2155, + 2156, 2274, 2275, 2276, 2277, 2279, 2278, 2283, 2284, 2285, + 2157, 2158, 2280, 2282, 2482, 2286, 2287, 2289, 2288, 2290, + 2159, 2292, 2291, 2160, 2294, 2293, 2161, 2162, 2295, 2296, + 2297, 2116, 2298, 2117, 2299, 2301, 2302, 2303, 2308, 2163, + 2300, 2304, 2305, 2306, 2307, 2309, 2164, 2311, 2310, 2312, + 2313, 2314, 2315, 2316, 2317, 2318, 2319, 2320, 2333, 2324, + 2325, 2327, 2328, 2331, 2326, 2332, 2336, 2335, 2337, 2338, + 2339, 2340, 2341, 2334, 2322, 2329, 2330, 2323, 2342, 2343, + 2321, 2344, 2346, 2345, 2347, 2348, 2349, 2350, 2351, 2352, + 2353, 2354, 2355, 2357, 2356, 2358, 2359, 2360, 2361, 2362, + 2363, 2364, 2366, 2365, 2367, 2368, 2370, 2369, 2372, 2373, + 2165, 2371, 2374, 2375, 2376, 2377, 2378, 2380, 2379, 2166, + 2168, 2167, 2169, 2381, 2382, 2170, 2383, 2385, 2384, 2386, + 2387, 2388, 2390, 2389, 2391, 2392, 2171, 2172, 2393, 2394, + 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, + 2405, 2406, 2408, 2407, 2409, 2410, 2411, 2412, 2413, 2414, + 2415, 2173, 2416, 2174, 2417, 2418, 2175, 2419, 2176, 2420, + 2421, 2422, 2423, 2424, 2177, 2425, 2426, 2427, 2429, 2430, + 2428, 2431, 2178, 2432, 2433, 2434, 2179, 2436, 2435, 2437, + 2180, 2439, 2181, 2182, 2438, 2184, 2185, 2440, 2441, 2442, + 2183, 2443, 2186, 2444, 2445, 2447, 2446, 2448, 2449, 2450, + 2187, 2451, 2452, 2188, 2453, 2454, 2455, 2456, 2457, 2459, + 2458, 2460, 2461, 2462, 2463, 2465, 2467, 2466, 2464, 2468, + 2469, 2470, 2471, 2475, 2476, 2477, 2478, 2472, 2473, 2474, + 2189, 2479, 2480, 2481, 2483, 2484, 2486, 2485, 2190, 2191, + 2487, 2488, 2194, 2489, 2490, 2494, 2491, 2503, 2492, 2493, + 2496, 2495, 2497, 2498, 2499, 2192, 2500, 2193, 2501, 2502, + 194, 2121, 178, 2122, 2134, 345, 124, 2579, 2578, 1082, + 0, 2729, 2730, 0, 0, 0, 1828, 0, 1748, 1748, 1748, 1746, 0, 1748, 1748, 1748, 0, 1751, 1748, 1748, 1748, 0, 73, 1947, 273, 0, 0, 0, 0, 0, - 2109, 0, 336, 1758, 0, 0, 1999, 2015, 0, 2016, - 2010, 2570, 321, 0, 1219, 0, 0, 0, 0, 176, + 2115, 0, 336, 1758, 0, 0, 2005, 2021, 0, 2022, + 2016, 2576, 321, 0, 1219, 0, 0, 0, 0, 176, 1147, 1090, 321, 1809, 0, 239, 248, 250, 251, 247, - 0, 2724, 2735, 1182, 1190, 1639, 1203, 2500, 0, 1916, + 0, 2730, 2741, 1182, 1190, 1639, 1203, 2506, 0, 1916, 251, 0, 124, 1063, 0, 124, 1836, 1833, 0, 0, - 0, 1809, 2009, 0, 2838, 0, 0, 0, 2834, 0, - 2839, 0, 1184, 0, 0, 1, 5, 0, 0, 588, - 888, 588, 889, 887, 588, 2788, 0, 0, 0, 0, - 0, 2270, 2152, 2379, 1929, 1941, 1927, 2104, 0, 936, - 964, 0, 941, 0, 939, 2121, 2120, 2119, 953, 952, - 951, 949, 0, 456, 0, 1040, 2793, 0, 943, 0, - 1101, 1931, 1932, 1933, 1934, 1935, 1938, 367, 2718, 0, + 0, 1809, 2015, 0, 2844, 0, 0, 0, 2840, 0, + 2845, 0, 1184, 0, 0, 1, 5, 0, 0, 588, + 888, 588, 889, 887, 588, 2794, 0, 0, 0, 0, + 0, 2276, 2158, 2385, 1929, 1941, 1927, 2110, 0, 936, + 964, 0, 941, 0, 939, 2127, 2126, 2125, 953, 952, + 951, 949, 0, 456, 0, 1040, 2799, 0, 943, 0, + 1101, 1931, 1932, 1933, 1934, 1935, 1938, 367, 2724, 0, 196, 0, 356, 359, 0, 348, 351, 0, 125, 126, - 0, 1126, 1129, 0, 0, 2727, 0, 591, 142, 0, - 1832, 1831, 1830, 0, 1828, 2190, 2129, 2205, 0, 2078, - 0, 0, 0, 1507, 0, 2134, 0, 2219, 2221, 2138, - 2139, 2140, 2141, 2142, 2145, 0, 0, 1232, 1232, 1232, - 1229, 0, 0, 0, 2244, 2245, 2083, 0, 0, 0, - 2074, 2084, 2152, 2283, 2284, 0, 2076, 2077, 2290, 0, - 0, 0, 2304, 0, 2309, 2081, 0, 0, 2346, 2348, - 0, 0, 2352, 2353, 2354, 2355, 2058, 1287, 0, 1229, - 2073, 2080, 2371, 2066, 2380, 2385, 2386, 0, 2395, 0, - 0, 2417, 0, 2424, 2422, 2428, 0, 0, 2450, 0, - 0, 1229, 2057, 2469, 2470, 2471, 2472, 0, 2075, 2183, - 2082, 0, 2483, 1232, 1229, 1229, 0, 0, 0, 2491, - 2492, 2496, 0, 0, 0, 2758, 1286, 0, 1468, 0, + 0, 1126, 1129, 0, 0, 2733, 0, 591, 142, 0, + 1832, 1831, 1830, 0, 1828, 2196, 2135, 2211, 0, 2084, + 0, 0, 0, 1507, 0, 2140, 0, 2225, 2227, 2144, + 2145, 2146, 2147, 2148, 2151, 0, 0, 1232, 1232, 1232, + 1229, 0, 0, 0, 2250, 2251, 2089, 0, 0, 0, + 2080, 2090, 2158, 2289, 2290, 0, 2082, 2083, 2296, 0, + 0, 0, 2310, 0, 2315, 2087, 0, 0, 2352, 2354, + 0, 0, 2358, 2359, 2360, 2361, 2064, 1287, 0, 1229, + 2079, 2086, 2377, 2072, 2386, 2391, 2392, 0, 2401, 0, + 0, 2423, 0, 2430, 2428, 2434, 0, 0, 2456, 0, + 0, 1229, 2063, 2475, 2476, 2477, 2478, 0, 2081, 2189, + 2088, 0, 2489, 1232, 1229, 1229, 0, 0, 0, 2497, + 2498, 2502, 0, 0, 0, 2764, 1286, 0, 1468, 0, 1501, 1244, 1250, 1264, 0, 1279, 1314, 1315, 1317, 1423, - 1316, 1322, 1321, 1721, 2070, 1320, 1319, 2071, 2072, 1313, - 2094, 2115, 2093, 0, 0, 0, 0, 0, 0, 0, + 1316, 1322, 1321, 1721, 2076, 1320, 1319, 2077, 2078, 1313, + 2100, 2121, 2099, 0, 0, 0, 0, 0, 0, 0, 0, 176, 0, 1912, 0, 176, 1732, 1748, 75, 0, - 0, 2631, 2646, 2647, 1232, 2643, 2648, 2264, 2150, 2277, - 0, 2645, 2637, 0, 2390, 2394, 2641, 2409, 2412, 2635, - 0, 2175, 2454, 2667, 2639, 2644, 2625, 2612, 2626, 0, - 0, 2629, 2633, 2106, 1613, 2585, 2586, 0, 81, 0, - 0, 1760, 1761, 1759, 1036, 0, 2851, 2000, 2001, 2002, - 0, 2019, 0, 365, 0, 331, 0, 0, 0, 323, + 0, 2637, 2652, 2653, 1232, 2649, 2654, 2270, 2156, 2283, + 0, 2651, 2643, 0, 2396, 2400, 2647, 2415, 2418, 2641, + 0, 2181, 2460, 2673, 2645, 2650, 2631, 2618, 2632, 0, + 0, 2635, 2639, 2112, 1613, 2591, 2592, 0, 81, 0, + 0, 1760, 1761, 1759, 1036, 0, 2857, 2006, 2007, 2008, + 0, 2025, 0, 365, 0, 331, 0, 0, 0, 323, 321, 0, 314, 304, 0, 305, 309, 310, 311, 312, - 313, 306, 307, 377, 308, 2117, 0, 2118, 1142, 0, - 0, 505, 496, 0, 1911, 1910, 0, 1993, 2736, 0, - 0, 0, 321, 377, 1763, 1810, 0, 1762, 1985, 0, - 1983, 1980, 1982, 240, 0, 0, 270, 2191, 2631, 2394, - 2603, 0, 2611, 0, 2730, 2727, 2737, 1713, 0, 1648, - 1640, 0, 1210, 2771, 2766, 2765, 2768, 2769, 1209, 2770, - 1208, 2767, 2764, 1219, 1204, 1206, 1207, 0, 810, 0, - 0, 2523, 2524, 2360, 2380, 2418, 2525, 2466, 0, 0, - 2545, 2499, 2509, 2505, 0, 0, 1874, 0, 810, 1924, - 1875, 0, 0, 1924, 0, 1648, 1914, 1917, 0, 2527, - 1888, 885, 884, 883, 2528, 1910, 0, 1860, 1876, 0, - 1837, 1881, 124, 2529, 0, 1913, 0, 1648, 1924, 0, + 313, 306, 307, 377, 308, 2123, 0, 2124, 1142, 0, + 0, 505, 496, 0, 1911, 1910, 0, 1999, 2742, 0, + 0, 0, 321, 377, 1763, 1810, 0, 1762, 1991, 0, + 1989, 1986, 1988, 240, 0, 0, 270, 2197, 2637, 2400, + 2609, 0, 2617, 0, 2736, 2733, 2743, 1713, 0, 1648, + 1640, 0, 1210, 2777, 2772, 2771, 2774, 2775, 1209, 2776, + 1208, 2773, 2770, 1219, 1204, 1206, 1207, 0, 810, 0, + 0, 2529, 2530, 2366, 2386, 2424, 2531, 2472, 0, 0, + 2551, 2505, 2515, 2511, 0, 0, 1874, 0, 810, 1924, + 1875, 0, 0, 1924, 0, 1648, 1914, 1917, 0, 2533, + 1888, 885, 884, 883, 2534, 1910, 0, 1860, 1876, 0, + 1837, 1881, 124, 2535, 0, 1913, 0, 1648, 1924, 0, 1853, 0, 0, 0, 0, 1218, 0, 246, 1070, 1070, - 0, 0, 1062, 1064, 1065, 1070, 1070, 0, 2852, 2853, - 2583, 1036, 377, 0, 2065, 2063, 2064, 2113, 2835, 2062, - 2061, 2843, 2845, 2831, 2833, 2840, 0, 2743, 1195, 6, - 67, 0, 0, 176, 176, 138, 1219, 1219, 2788, 588, - 144, 588, 588, 588, 588, 0, 1944, 2791, 2792, 2790, - 826, 0, 1232, 2122, 2125, 2789, 2126, 179, 950, 0, + 0, 0, 1062, 1064, 1065, 1070, 1070, 0, 2858, 2859, + 2589, 1036, 377, 0, 2071, 2069, 2070, 2119, 2841, 2068, + 2067, 2849, 2851, 2837, 2839, 2846, 0, 2749, 1195, 6, + 67, 0, 0, 176, 176, 138, 1219, 1219, 2794, 588, + 144, 588, 588, 588, 588, 0, 1944, 2797, 2798, 2796, + 826, 0, 1232, 2128, 2131, 2795, 2132, 179, 950, 0, 457, 179, 0, 0, 0, 0, 0, 458, 459, 395, 0, 1044, 1045, 1039, 1041, 1043, 0, 0, 946, 0, - 2793, 1943, 0, 369, 0, 1157, 1159, 1158, 1175, 198, + 2799, 1943, 0, 369, 0, 1157, 1159, 1158, 1175, 198, 195, 177, 0, 321, 0, 346, 352, 82, 1084, 1739, - 1741, 0, 1130, 2726, 0, 0, 2728, 2732, 141, 0, + 1741, 0, 1130, 2732, 0, 0, 2734, 2738, 141, 0, 0, 0, 1812, 1816, 1822, 1826, 1829, 0, 0, 1618, 1335, 1618, 1618, 1618, 1508, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1618, 0, - 1373, 1345, 1346, 0, 1374, 0, 0, 0, 2085, 0, - 0, 0, 2758, 0, 0, 0, 0, 1473, 0, 0, - 0, 2758, 0, 0, 0, 0, 0, 0, 1503, 1505, - 2093, 1618, 0, 0, 1618, 0, 0, 0, 0, 0, + 1373, 1345, 1346, 0, 1374, 0, 0, 0, 2091, 0, + 0, 0, 2764, 0, 0, 0, 0, 1473, 0, 0, + 0, 2764, 0, 0, 0, 0, 0, 0, 1503, 1505, + 2099, 1618, 0, 0, 1618, 0, 0, 0, 0, 0, 1237, 1379, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1618, 1618, 0, 0, 1618, - 1387, 2087, 0, 0, 0, 2086, 0, 0, 0, 2059, - 2079, 0, 1390, 1392, 1391, 0, 1618, 1618, 0, 0, + 1387, 2093, 0, 0, 0, 2092, 0, 0, 0, 2065, + 2085, 0, 1390, 1392, 1391, 0, 1618, 1618, 0, 0, 0, 1325, 1324, 1326, 0, 0, 0, 0, 0, 0, 1283, 1282, 1281, 1280, 0, 0, 0, 0, 1289, 0, 1291, 1293, 1288, 1290, 1292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1327, 0, 0, 0, 2060, 1432, + 0, 0, 0, 0, 1327, 0, 0, 0, 2066, 1432, 0, 1749, 1726, 1734, 1728, 1747, 0, 1912, 1729, 0, 1738, 470, 0, 1735, 0, 0, 1722, 0, 74, 0, 1972, 0, 0, 0, 1966, 1968, 1971, 1967, 0, 0, 1973, 124, 0, 1969, 1948, 1951, 1958, 1218, 1949, 0, - 0, 271, 274, 276, 0, 279, 2632, 2630, 2664, 2663, - 2668, 0, 2665, 2661, 2624, 2654, 2695, 2658, 0, 2695, - 2660, 2659, 2695, 2655, 2662, 2695, 0, 2627, 0, 1614, - 1615, 0, 2584, 0, 2105, 0, 0, 1037, 0, 0, - 2003, 2004, 0, 1165, 2020, 2021, 2017, 1613, 2571, 2574, + 0, 271, 274, 276, 0, 279, 2638, 2636, 2670, 2669, + 2674, 0, 2671, 2667, 2630, 2660, 2701, 2664, 0, 2701, + 2666, 2665, 2701, 2661, 2668, 2701, 0, 2633, 0, 1614, + 1615, 0, 2590, 0, 2111, 0, 0, 1037, 0, 0, + 2009, 2010, 0, 1165, 2026, 2027, 2023, 1613, 2577, 2580, 369, 330, 333, 0, 0, 326, 325, 327, 0, 0, 0, 219, 322, 385, 0, 0, 699, 1220, 506, 0, - 0, 517, 0, 0, 70, 71, 0, 1149, 2127, 0, + 0, 517, 0, 0, 70, 71, 0, 1149, 2133, 0, 1148, 1152, 0, 1088, 1091, 0, 374, 389, 0, 1766, - 1756, 1765, 1541, 1990, 1987, 124, 0, 238, 263, 258, + 1756, 1765, 1541, 1996, 1993, 124, 0, 238, 263, 258, 266, 260, 262, 261, 267, 268, 269, 264, 259, 265, - 252, 0, 0, 2630, 0, 0, 2627, 2731, 0, 2733, - 2749, 1191, 2738, 1704, 1641, 1650, 1210, 0, 1649, 1544, + 252, 0, 0, 2636, 0, 0, 2633, 2737, 0, 2739, + 2755, 1191, 2744, 1704, 1641, 1650, 1210, 0, 1649, 1544, 1620, 0, 0, 1193, 1215, 1196, 1214, 0, 1205, 0, - 2501, 2503, 0, 809, 0, 0, 812, 814, 1786, 1785, - 813, 822, 0, 811, 0, 2560, 0, 2543, 0, 2530, - 0, 818, 820, 819, 2538, 817, 0, 0, 2514, 0, + 2507, 2509, 0, 809, 0, 0, 812, 814, 1786, 1785, + 813, 822, 0, 811, 0, 2566, 0, 2549, 0, 2536, + 0, 818, 820, 819, 2544, 817, 0, 0, 2520, 0, 0, 1920, 1218, 1218, 1887, 0, 588, 0, 0, 0, 0, 0, 0, 1854, 0, 0, 639, 1880, 1918, 1919, 1924, 0, 0, 1924, 0, 1893, 1914, 1924, 0, 1924, @@ -4218,19 +4224,19 @@ static const yytype_uint16 yydefact[] = 1838, 1839, 0, 1867, 1895, 0, 1914, 1879, 1886, 0, 1866, 1873, 0, 1884, 1914, 1914, 0, 1924, 1924, 1924, 1058, 1074, 1056, 1068, 1069, 0, 0, 1061, 1060, 1834, - 1544, 387, 372, 0, 0, 2832, 2846, 2830, 2841, 2842, - 2829, 1186, 2742, 1183, 2741, 2744, 0, 1185, 7, 4, - 0, 135, 0, 0, 0, 588, 588, 1219, 2785, 0, - 2773, 2780, 2781, 2784, 2816, 2783, 2782, 588, 2779, 2772, - 2775, 2776, 2778, 2777, 2793, 0, 0, 0, 0, 0, + 1544, 387, 372, 0, 0, 2838, 2852, 2836, 2847, 2848, + 2835, 1186, 2748, 1183, 2747, 2750, 0, 1185, 7, 4, + 0, 135, 0, 0, 0, 588, 588, 1219, 2791, 0, + 2779, 2786, 2787, 2790, 2822, 2789, 2788, 588, 2785, 2778, + 2781, 2782, 2784, 2783, 2799, 0, 0, 0, 0, 0, 1930, 1928, 1945, 1946, 827, 826, 582, 585, 584, 0, - 0, 2124, 0, 942, 0, 1912, 940, 0, 0, 1912, + 0, 2130, 0, 942, 0, 1912, 940, 0, 0, 1912, 406, 1912, 460, 934, 1042, 0, 588, 947, 944, 1102, 1103, 1106, 368, 221, 0, 0, 494, 1175, 1161, 1177, 0, 199, 201, 357, 321, 0, 0, 0, 1086, 1085, 0, 1083, 1140, 1138, 1137, 1135, 0, 1136, 1134, 1125, - 1131, 1132, 2725, 2729, 1912, 398, 1818, 1743, 1541, 1745, - 2104, 0, 0, 0, 1824, 0, 0, 1619, 1618, 0, + 1131, 1132, 2731, 2735, 1912, 398, 1818, 1743, 1541, 1745, + 2110, 0, 0, 0, 1824, 0, 0, 1619, 1618, 0, 1482, 0, 0, 0, 0, 1509, 0, 0, 0, 0, 0, 0, 0, 0, 1311, 0, 0, 0, 0, 0, 1453, 0, 1482, 1233, 1692, 1693, 1677, 1678, 1676, 1679, @@ -4243,46 +4249,46 @@ static const yytype_uint16 yydefact[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1415, 0, 0, 0, 0, 0, 1618, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1369, 0, 2096, 2095, 0, 0, 0, - 854, 0, 1329, 0, 1328, 1552, 1187, 2754, 2759, 0, - 2530, 1469, 1471, 0, 1235, 1234, 1236, 1247, 1240, 1245, - 1238, 1242, 0, 1294, 2197, 1248, 0, 0, 1276, 2758, + 0, 0, 0, 1369, 0, 2102, 2101, 0, 0, 0, + 854, 0, 1329, 0, 1328, 1552, 1187, 2760, 2765, 0, + 2536, 1469, 1471, 0, 1235, 1234, 1236, 1247, 1240, 1245, + 1238, 1242, 0, 1294, 2203, 1248, 0, 0, 1276, 2764, 1627, 1277, 1262, 1267, 1268, 0, 1265, 1266, 0, 1270, 0, 1269, 1273, 1274, 1275, 1278, 0, 0, 0, 0, - 1318, 1323, 1502, 1219, 2097, 0, 0, 470, 1731, 2622, - 473, 472, 1736, 471, 1787, 2680, 1730, 1046, 0, 0, - 76, 78, 1963, 1960, 1959, 1961, 1965, 124, 1970, 1962, - 0, 1974, 1975, 2244, 2469, 2472, 283, 0, 256, 255, - 257, 280, 0, 0, 2657, 0, 2638, 0, 2642, 2636, - 2640, 2125, 2694, 0, 2620, 2682, 0, 0, 2628, 0, - 2666, 2649, 2653, 2652, 2650, 0, 2651, 2656, 2634, 1617, - 2278, 2363, 0, 1620, 2588, 320, 337, 1753, 2850, 2005, - 2483, 2006, 1998, 0, 2018, 0, 0, 0, 366, 332, + 1318, 1323, 1502, 1219, 2103, 0, 0, 470, 1731, 2628, + 473, 472, 1736, 471, 1787, 2686, 1730, 1046, 0, 0, + 76, 78, 1977, 1960, 1959, 1961, 1965, 124, 1970, 1962, + 0, 1974, 1975, 2250, 2475, 2478, 283, 0, 256, 255, + 257, 280, 0, 0, 2663, 0, 2644, 0, 2648, 2642, + 2646, 2131, 2700, 0, 2626, 2688, 0, 0, 2634, 0, + 2672, 2655, 2659, 2658, 2656, 0, 2657, 2662, 2640, 1617, + 2284, 2369, 0, 1620, 2594, 320, 337, 1753, 2856, 2011, + 2489, 2012, 2004, 0, 2024, 0, 0, 0, 366, 332, 0, 324, 371, 220, 363, 378, 382, 380, 1143, 700, 0, 1219, 504, 503, 502, 501, 0, 519, 499, 507, - 72, 0, 0, 1994, 0, 0, 0, 0, 0, 1092, - 0, 1764, 0, 0, 1742, 1542, 0, 1986, 1988, 1981, - 0, 0, 0, 0, 0, 2684, 2609, 0, 0, 0, - 2734, 2751, 2750, 2739, 0, 0, 1719, 0, 1714, 0, - 1192, 1660, 1661, 2421, 1659, 1651, 1654, 1658, 1657, 1202, + 72, 0, 0, 2000, 0, 0, 0, 0, 0, 1092, + 0, 1764, 0, 0, 1742, 1542, 0, 1992, 1994, 1987, + 0, 0, 0, 0, 0, 2690, 2615, 0, 0, 0, + 2740, 2757, 2756, 2745, 0, 0, 1719, 0, 1714, 0, + 1192, 1660, 1661, 2427, 1659, 1651, 1654, 1658, 1657, 1202, 1560, 1559, 0, 1198, 1516, 1201, 1518, 1515, 1514, 1513, - 0, 1559, 1621, 1628, 1211, 0, 1219, 1220, 1220, 2093, - 0, 0, 0, 2541, 2547, 0, 2540, 2539, 0, 0, - 0, 2562, 2544, 0, 0, 2508, 2548, 2549, 2552, 0, - 0, 0, 0, 0, 2546, 2466, 2510, 2511, 2516, 2506, - 2568, 2569, 2566, 2567, 2565, 2535, 1894, 0, 1922, 0, + 0, 1559, 1621, 1628, 1211, 0, 1219, 1220, 1220, 2099, + 0, 0, 0, 2547, 2553, 0, 2546, 2545, 0, 0, + 0, 2568, 2550, 0, 0, 2514, 2554, 2555, 2558, 0, + 0, 0, 0, 0, 2552, 2472, 2516, 2517, 2522, 2512, + 2574, 2575, 2572, 2573, 2571, 2541, 1894, 0, 1922, 0, 0, 0, 0, 1904, 1898, 1897, 1891, 1899, 1892, 1909, 1908, 1907, 1864, 1863, 1857, 1915, 1903, 1901, 176, 1924, 1862, 1861, 1902, 1900, 1843, 1844, 1845, 0, 1648, 0, 1920, 1896, 1924, 1914, 0, 1924, 1924, 1905, 1906, 1883, 1885, 1059, 1076, 1075, 1071, 1072, 1077, 1067, 1066, 0, - 321, 2836, 2844, 2848, 1648, 2748, 2746, 589, 826, 2618, - 139, 588, 2815, 0, 0, 588, 588, 0, 2774, 145, - 904, 0, 0, 127, 583, 1787, 1787, 0, 2123, 0, + 321, 2842, 2850, 2854, 1648, 2754, 2752, 589, 826, 2624, + 139, 588, 2821, 0, 0, 588, 588, 0, 2780, 145, + 904, 0, 0, 127, 583, 1787, 1787, 0, 2129, 0, 0, 0, 0, 0, 0, 0, 180, 189, 0, 0, 404, 405, 1787, 403, 446, 447, 450, 451, 452, 0, 453, 1787, 1787, 400, 426, 427, 430, 431, 432, 433, - 434, 396, 0, 401, 826, 2794, 2795, 0, 955, 0, + 434, 396, 0, 401, 826, 2800, 2801, 0, 955, 0, 0, 1105, 217, 1164, 1156, 1163, 1160, 1175, 1173, 1162, 880, 879, 0, 1176, 197, 0, 0, 344, 353, 347, 349, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -4290,370 +4296,372 @@ static const yytype_uint16 yydefact[] = 0, 0, 0, 0, 83, 84, 104, 1740, 0, 1127, 1139, 1133, 1787, 1787, 1787, 1787, 402, 435, 436, 439, 440, 441, 442, 445, 443, 444, 0, 1912, 0, 0, - 1813, 0, 2107, 1823, 1544, 1827, 1826, 0, 1398, 0, + 1813, 0, 2113, 1823, 1544, 1827, 1826, 0, 1398, 0, 1446, 0, 1448, 1449, 1450, 0, 0, 0, 0, 0, 1399, 0, 1343, 1400, 1401, 0, 1395, 0, 1396, 0, 0, 0, 0, 0, 0, 0, 1452, 0, 1231, 0, 0, 1347, 1348, 1340, 1332, 0, 0, 1425, 0, 0, 1349, 0, 0, 0, 0, 1406, 0, 1426, 1504, 0, - 1506, 2097, 0, 1458, 1407, 1354, 0, 1456, 0, 1355, + 1506, 2103, 0, 1458, 1407, 1354, 0, 1456, 0, 1355, 1427, 1428, 1429, 1409, 1410, 0, 1431, 0, 1411, 0, 0, 1414, 0, 0, 1357, 1462, 1460, 0, 0, 0, 0, 1464, 1359, 0, 0, 0, 1358, 0, 0, 0, 0, 0, 0, 0, 1361, 0, 1341, 1461, 1463, 1417, - 0, 0, 0, 0, 0, 1370, 0, 1199, 1551, 2760, - 1187, 0, 0, 2749, 2757, 1333, 0, 0, 2098, 1241, - 1246, 1239, 1243, 2758, 0, 0, 0, 0, 1260, 1259, - 0, 0, 0, 2758, 1627, 1263, 0, 0, 1442, 1443, + 0, 0, 0, 0, 0, 1370, 0, 1199, 1551, 2766, + 1187, 0, 0, 2755, 2763, 1333, 0, 0, 2104, 1241, + 1246, 1239, 1243, 2764, 0, 0, 0, 0, 1260, 1259, + 0, 0, 0, 2764, 1627, 1263, 0, 0, 1442, 1443, 1499, 0, 1727, 1724, 1737, 0, 1788, 0, 0, 1048, - 1047, 1733, 1046, 79, 0, 1964, 1957, 1976, 1952, 0, - 275, 284, 277, 281, 282, 278, 2699, 0, 2698, 0, - 0, 0, 0, 2617, 2676, 2679, 2104, 0, 0, 0, - 2592, 2599, 2595, 2600, 2593, 2594, 2598, 2601, 2602, 2589, - 2596, 1648, 321, 0, 2007, 1166, 1168, 1169, 1167, 1175, - 0, 0, 2577, 2578, 2576, 2575, 328, 369, 321, 321, - 0, 509, 0, 518, 0, 530, 0, 0, 0, 1996, - 1995, 0, 1150, 1153, 1154, 1099, 1097, 1096, 1098, 1087, - 1093, 1094, 0, 575, 1770, 0, 0, 0, 1776, 1757, - 1767, 0, 1674, 1675, 1671, 1672, 1670, 1673, 1991, 1989, - 1984, 0, 253, 2610, 0, 0, 0, 0, 0, 0, - 0, 2114, 1718, 1715, 0, 1705, 1707, 1708, 1710, 2092, - 1642, 1645, 0, 0, 0, 0, 1559, 1544, 0, 0, - 1536, 1561, 0, 1561, 1538, 1539, 1544, 1544, 1541, 1556, - 0, 0, 1623, 0, 1213, 1221, 1216, 0, 2504, 0, - 2534, 0, 825, 824, 823, 821, 2561, 0, 0, 0, - 2554, 2555, 0, 0, 2531, 2532, 2533, 0, 2536, 2513, - 2514, 2515, 0, 1921, 0, 1868, 1925, 1926, 0, 1890, - 1889, 1859, 0, 1882, 1840, 1922, 1858, 1620, 1914, 1855, - 1856, 1074, 0, 1057, 0, 321, 0, 0, 2847, 2747, - 136, 826, 0, 140, 0, 0, 178, 2824, 2810, 0, - 0, 0, 0, 0, 0, 0, 592, 0, 0, 938, - 183, 186, 184, 0, 185, 0, 0, 455, 454, 0, - 1912, 448, 0, 0, 0, 0, 0, 0, 0, 0, - 147, 0, 0, 1912, 428, 407, 408, 411, 412, 413, - 1034, 1787, 1034, 0, 1787, 1787, 1034, 1787, 0, 0, - 1787, 1787, 0, 0, 1787, 0, 0, 1034, 0, 1787, - 0, 1021, 0, 0, 1787, 1787, 1787, 1787, 1787, 1034, - 0, 0, 1787, 1787, 494, 1787, 0, 0, 1052, 0, - 0, 1787, 1787, 1787, 1787, 0, 0, 1787, 1787, 0, - 1787, 971, 1020, 594, 621, 622, 935, 970, 972, 984, - 490, 0, 1002, 1023, 1024, 1022, 0, 2796, 0, 957, - 959, 1104, 0, 0, 321, 0, 0, 1580, 200, 321, - 0, 350, 0, 0, 0, 0, 0, 0, 0, 0, + 1047, 1733, 1046, 79, 0, 0, 1963, 1964, 1957, 1976, + 1952, 0, 275, 284, 277, 281, 282, 278, 2705, 0, + 2704, 0, 0, 0, 0, 2623, 2682, 2685, 2110, 0, + 0, 0, 2598, 2605, 2601, 2606, 2599, 2600, 2604, 2607, + 2608, 2595, 2602, 1648, 321, 0, 2013, 1166, 1168, 1169, + 1167, 1175, 0, 0, 2583, 2584, 2582, 2581, 328, 369, + 321, 321, 0, 509, 0, 518, 0, 530, 0, 0, + 0, 2002, 2001, 0, 1150, 1153, 1154, 1099, 1097, 1096, + 1098, 1087, 1093, 1094, 0, 575, 1770, 0, 0, 0, + 1776, 1757, 1767, 0, 1674, 1675, 1671, 1672, 1670, 1673, + 1997, 1995, 1990, 0, 253, 2616, 0, 0, 0, 0, + 0, 0, 0, 2120, 1718, 1715, 0, 1705, 1707, 1708, + 1710, 2098, 1642, 1645, 0, 0, 0, 0, 1559, 1544, + 0, 0, 1536, 1561, 0, 1561, 1538, 1539, 1544, 1544, + 1541, 1556, 0, 0, 1623, 0, 1213, 1221, 1216, 0, + 2510, 0, 2540, 0, 825, 824, 823, 821, 2567, 0, + 0, 0, 2560, 2561, 0, 0, 2537, 2538, 2539, 0, + 2542, 2519, 2520, 2521, 0, 1921, 0, 1868, 1925, 1926, + 0, 1890, 1889, 1859, 0, 1882, 1840, 1922, 1858, 1620, + 1914, 1855, 1856, 1074, 0, 1057, 0, 321, 0, 0, + 2853, 2753, 136, 826, 0, 140, 0, 0, 178, 2830, + 2816, 0, 0, 0, 0, 0, 0, 0, 592, 0, + 0, 938, 183, 186, 184, 0, 185, 0, 0, 455, + 454, 0, 1912, 448, 0, 0, 0, 0, 0, 0, + 0, 0, 147, 0, 0, 1912, 428, 407, 408, 411, + 412, 413, 1034, 1787, 1034, 0, 1787, 1787, 1034, 1787, + 0, 0, 1787, 1787, 0, 0, 1787, 0, 0, 1034, + 0, 1787, 0, 1021, 0, 0, 1787, 1787, 1787, 1787, + 1787, 1034, 0, 0, 1787, 1787, 494, 1787, 0, 0, + 1052, 0, 0, 1787, 1787, 1787, 1787, 0, 0, 1787, + 1787, 0, 1787, 971, 1020, 594, 621, 622, 935, 970, + 972, 984, 490, 0, 1002, 1023, 1024, 1022, 0, 2802, + 0, 957, 959, 1104, 0, 0, 321, 0, 0, 1580, + 200, 321, 0, 350, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1141, 0, 0, 0, - 0, 1912, 437, 0, 1787, 397, 414, 415, 418, 419, - 420, 421, 422, 425, 423, 424, 1744, 1826, 1544, 1620, - 2105, 1620, 0, 1825, 0, 0, 1447, 1483, 0, 1510, - 0, 1337, 783, 783, 783, 1493, 768, 1497, 1488, 783, - 1489, 783, 1491, 0, 0, 0, 1296, 1312, 0, 0, - 0, 0, 0, 1454, 1451, 0, 0, 0, 0, 0, - 1477, 0, 0, 0, 1342, 0, 1437, 1459, 1457, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1465, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 843, 849, 852, 853, 855, - 847, 0, 1419, 1330, 2752, 1200, 1620, 1219, 2761, 2763, - 0, 2743, 1552, 2755, 929, 1470, 0, 1257, 1253, 0, - 1251, 1626, 1272, 1271, 0, 0, 0, 1261, 1220, 1433, - 1219, 0, 1500, 2099, 1725, 2623, 469, 638, 2681, 1723, - 77, 1955, 0, 1950, 1953, 0, 0, 2696, 0, 2707, - 0, 2686, 2687, 0, 0, 2683, 0, 0, 0, 0, - 0, 0, 2587, 321, 1797, 0, 1175, 1179, 2011, 2580, - 2581, 2579, 0, 361, 361, 361, 361, 0, 510, 511, - 513, 1220, 527, 505, 0, 497, 500, 0, 509, 0, - 0, 1089, 1095, 0, 1203, 0, 1789, 1774, 1781, 1775, - 0, 0, 0, 1773, 2089, 2088, 2095, 2737, 0, 1586, - 0, 0, 2608, 2685, 0, 0, 0, 2740, 815, 1709, - 0, 0, 1646, 1647, 1644, 1662, 1653, 0, 1656, 1655, - 0, 2743, 1554, 0, 1540, 1537, 1562, 0, 1561, 1561, - 1544, 0, 1520, 1519, 1613, 1546, 1203, 1622, 0, 1624, - 1639, 1212, 0, 1217, 1225, 1224, 2090, 2097, 2502, 2542, - 0, 0, 0, 0, 2559, 2553, 2550, 2551, 0, 2512, - 2518, 2517, 2520, 2522, 1684, 1685, 1683, 1681, 1682, 1923, - 1648, 1878, 1877, 1851, 1870, 1872, 1924, 1073, 0, 1080, - 1078, 1801, 1804, 0, 0, 2837, 2849, 0, 0, 2818, - 0, 0, 0, 156, 0, 920, 922, 921, 906, 905, - 0, 131, 133, 0, 679, 128, 481, 490, 593, 596, - 637, 636, 188, 187, 192, 193, 1688, 1689, 1686, 1687, - 461, 474, 1690, 475, 449, 151, 150, 152, 153, 155, - 154, 149, 954, 0, 462, 463, 429, 0, 409, 1035, - 927, 588, 1006, 0, 680, 588, 881, 881, 586, 0, - 0, 1144, 0, 0, 1746, 0, 0, 1144, 0, 0, - 0, 1787, 0, 1014, 966, 0, 1748, 0, 1746, 1746, - 1015, 0, 0, 967, 1787, 0, 0, 0, 0, 0, - 1746, 1144, 0, 0, 0, 492, 0, 1144, 986, 1055, - 1053, 1054, 0, 1144, 1144, 0, 0, 0, 0, 627, - 628, 626, 0, 0, 0, 619, 595, 826, 968, 491, - 969, 679, 0, 1049, 676, 682, 2100, 0, 2798, 2720, - 0, 0, 161, 1108, 0, 1107, 232, 231, 0, 223, - 300, 370, 0, 222, 0, 1583, 0, 1584, 1581, 1582, - 321, 354, 109, 113, 105, 90, 86, 117, 118, 88, - 89, 93, 92, 94, 95, 98, 99, 96, 91, 97, - 87, 121, 123, 122, 100, 119, 120, 85, 468, 467, - 466, 465, 438, 0, 0, 1912, 416, 0, 1620, 1639, - 2108, 1817, 0, 1371, 1511, 0, 0, 784, 1484, 1485, - 1495, 0, 1496, 770, 769, 785, 1487, 1490, 1494, 1492, - 1336, 1344, 1393, 0, 1310, 1394, 0, 1424, 1339, 1338, - 0, 0, 0, 1377, 1404, 0, 1378, 0, 1475, 0, - 0, 1351, 0, 1353, 0, 0, 1439, 1408, 1430, 1380, - 1412, 0, 1356, 1331, 0, 1381, 0, 1386, 1384, 0, - 1360, 0, 0, 1367, 0, 1365, 0, 1366, 0, 1368, - 1416, 1418, 0, 0, 854, 840, 841, 842, 0, 844, - 846, 848, 0, 0, 1628, 1553, 2762, 1189, 2753, 1199, - 0, 0, 1472, 1249, 0, 1258, 1255, 0, 1252, 1221, - 1444, 1434, 0, 0, 292, 287, 295, 289, 291, 290, - 296, 297, 298, 299, 293, 288, 294, 286, 285, 2697, - 0, 2616, 0, 2690, 2692, 2621, 2678, 2677, 2700, 2700, - 2700, 0, 340, 0, 1754, 1170, 1175, 1179, 0, 1171, - 2022, 329, 334, 364, 362, 376, 379, 383, 381, 514, - 0, 0, 0, 534, 0, 532, 508, 0, 1151, 1100, - 375, 1219, 1771, 1783, 0, 1791, 0, 0, 1768, 1778, - 0, 0, 0, 1777, 494, 0, 254, 0, 2605, 2606, - 2604, 0, 1716, 1706, 1645, 1652, 2749, 1613, 1548, 1544, - 1517, 1544, 0, 0, 1525, 1544, 1521, 1523, 1578, 1219, - 1632, 1645, 0, 1648, 1223, 1222, 0, 2564, 2563, 2557, - 2556, 2558, 2537, 0, 0, 1869, 1648, 1865, 0, 0, - 0, 1620, 0, 373, 2619, 202, 652, 653, 651, 650, - 0, 2825, 0, 0, 0, 129, 0, 0, 482, 0, - 0, 0, 654, 655, 657, 658, 2022, 489, 826, 597, - 148, 410, 681, 928, 1144, 0, 0, 0, 881, 675, - 588, 927, 882, 588, 588, 0, 1004, 1030, 1031, 0, - 0, 605, 602, 0, 614, 987, 978, 988, 999, 1001, - 0, 604, 629, 0, 0, 617, 1746, 0, 1012, 0, - 0, 599, 0, 0, 648, 649, 647, 623, 630, 1032, - 1033, 600, 601, 0, 0, 1635, 1637, 1645, 607, 606, - 1695, 1694, 616, 0, 603, 0, 1018, 994, 0, 645, - 643, 640, 642, 641, 646, 644, 618, 609, 608, 611, - 610, 613, 612, 615, 631, 983, 0, 1034, 1034, 1003, - 0, 2103, 0, 1051, 1005, 0, 659, 677, 660, 0, - 0, 635, 634, 632, 633, 0, 0, 2721, 0, 0, - 0, 956, 0, 164, 162, 172, 1110, 1111, 0, 0, - 0, 0, 0, 0, 218, 0, 1178, 0, 0, 0, - 110, 112, 0, 114, 116, 0, 106, 108, 399, 464, - 417, 1826, 1819, 1663, 0, 1512, 0, 0, 0, 0, - 831, 0, 0, 786, 1498, 748, 783, 1307, 768, 1300, - 1302, 1298, 0, 749, 1301, 783, 0, 1304, 1306, 1297, - 0, 1455, 0, 0, 0, 1478, 0, 0, 0, 0, - 0, 0, 0, 1334, 0, 1435, 0, 0, 0, 0, - 0, 0, 1364, 1362, 1363, 838, 1421, 0, 851, 845, - 843, 850, 0, 1623, 1188, 2756, 930, 1254, 0, 1445, - 1956, 1977, 0, 2691, 2689, 2688, 0, 0, 2705, 2705, - 2705, 1796, 1795, 0, 1794, 321, 336, 339, 1798, 1172, - 1180, 2024, 2023, 0, 0, 512, 515, 0, 507, 0, - 531, 0, 498, 576, 0, 0, 0, 1792, 1780, 2743, - 1769, 1772, 2097, 1543, 1587, 2607, 816, 2025, 1643, 1549, - 1547, 1555, 0, 1513, 1544, 1544, 0, 1513, 0, 0, - 1545, 1575, 1557, 1633, 1634, 0, 1629, 1631, 1625, 1696, - 2091, 2519, 2521, 1871, 1079, 1081, 1803, 1639, 1805, 0, - 203, 205, 206, 0, 213, 391, 390, 0, 0, 0, - 0, 0, 0, 0, 479, 476, 679, 478, 578, 598, - 989, 0, 588, 877, 878, 927, 902, 2100, 927, 927, - 0, 0, 0, 977, 0, 1130, 0, 982, 822, 624, - 0, 973, 1013, 1046, 0, 625, 1049, 975, 0, 1638, - 493, 974, 996, 980, 1975, 1007, 1050, 859, 762, 713, - 704, 783, 707, 706, 783, 718, 768, 764, 0, 768, - 768, 741, 740, 758, 744, 726, 831, 831, 725, 761, - 831, 745, 743, 747, 0, 749, 768, 754, 742, 746, - 763, 739, 0, 760, 783, 783, 783, 722, 759, 831, - 0, 752, 783, 683, 768, 831, 836, 0, 0, 783, - 785, 2102, 2800, 0, 2802, 171, 160, 0, 0, 958, - 960, 0, 0, 961, 1116, 0, 226, 301, 822, 302, - 0, 229, 1174, 1585, 321, 102, 0, 103, 0, 101, - 0, 0, 1814, 1372, 781, 779, 782, 780, 829, 834, - 832, 830, 0, 836, 1486, 0, 0, 1309, 1303, 750, - 1308, 1299, 831, 1397, 1375, 1376, 1405, 0, 1476, 1467, - 1403, 0, 1352, 1436, 0, 0, 1413, 1382, 1385, 1383, - 1388, 1389, 0, 1420, 0, 1639, 1256, 0, 1954, 2708, - 2693, 0, 0, 2704, 2702, 0, 2703, 2701, 2669, 0, - 2614, 2615, 2613, 2597, 0, 321, 341, 0, 0, 335, - 1219, 520, 0, 537, 536, 533, 1199, 1782, 1784, 1790, - 1779, 0, 2033, 0, 1526, 0, 1530, 1535, 1531, 0, - 1522, 0, 1579, 0, 1199, 1645, 0, 1711, 1663, 2819, - 0, 0, 2817, 216, 214, 215, 0, 209, 211, 0, - 394, 392, 393, 0, 0, 0, 0, 0, 1645, 925, - 0, 483, 2743, 592, 656, 579, 0, 991, 0, 927, - 902, 2100, 0, 661, 0, 665, 667, 587, 1017, 0, - 1049, 979, 1000, 1019, 1011, 1010, 0, 1009, 1144, 1636, - 995, 997, 1092, 0, 0, 863, 712, 705, 723, 721, - 772, 765, 0, 772, 772, 732, 748, 727, 0, 831, - 738, 731, 750, 753, 755, 757, 772, 0, 831, 720, - 719, 729, 716, 772, 787, 766, 751, 831, 709, 837, - 836, 711, 831, 836, 772, 772, 0, 2799, 0, 2797, - 0, 158, 163, 173, 174, 948, 0, 1117, 1113, 1114, - 1109, 0, 806, 0, 224, 225, 237, 236, 228, 0, - 321, 111, 115, 107, 2421, 1664, 1820, 835, 828, 833, - 0, 1305, 1479, 1645, 0, 1438, 1440, 839, 0, 1648, - 0, 2675, 2674, 2673, 2670, 0, 0, 0, 0, 0, - 0, 0, 2706, 2710, 1793, 0, 0, 0, 528, 0, - 0, 562, 577, 0, 0, 0, 0, 2026, 2028, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1141, 0, + 0, 0, 0, 1912, 437, 0, 1787, 397, 414, 415, + 418, 419, 420, 421, 422, 425, 423, 424, 1744, 1826, + 1544, 1620, 2111, 1620, 0, 1825, 0, 0, 1447, 1483, + 0, 1510, 0, 1337, 783, 783, 783, 1493, 768, 1497, + 1488, 783, 1489, 783, 1491, 0, 0, 0, 1296, 1312, + 0, 0, 0, 0, 0, 1454, 1451, 0, 0, 0, + 0, 0, 1477, 0, 0, 0, 1342, 0, 1437, 1459, + 1457, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1465, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 843, 849, 852, + 853, 855, 847, 0, 1419, 1330, 2758, 1200, 1620, 1219, + 2767, 2769, 0, 2749, 1552, 2761, 929, 1470, 0, 1257, + 1253, 0, 1251, 1626, 1272, 1271, 0, 0, 0, 1261, + 1220, 1433, 1219, 0, 1500, 2105, 1725, 2629, 469, 638, + 2687, 1723, 77, 0, 1955, 0, 1950, 1953, 0, 0, + 2702, 0, 2713, 0, 2692, 2693, 0, 0, 2689, 0, + 0, 0, 0, 0, 0, 2593, 321, 1797, 0, 1175, + 1179, 2017, 2586, 2587, 2585, 0, 361, 361, 361, 361, + 0, 510, 511, 513, 1220, 527, 505, 0, 497, 500, + 0, 509, 0, 0, 1089, 1095, 0, 1203, 0, 1789, + 1774, 1781, 1775, 0, 0, 0, 1773, 2095, 2094, 2101, + 2743, 0, 1586, 0, 0, 2614, 2691, 0, 0, 0, + 2746, 815, 1709, 0, 0, 1646, 1647, 1644, 1662, 1653, + 0, 1656, 1655, 0, 2749, 1554, 0, 1540, 1537, 1562, + 0, 1561, 1561, 1544, 0, 1520, 1519, 1613, 1546, 1203, + 1622, 0, 1624, 1639, 1212, 0, 1217, 1225, 1224, 2096, + 2103, 2508, 2548, 0, 0, 0, 0, 2565, 2559, 2556, + 2557, 0, 2518, 2524, 2523, 2526, 2528, 1684, 1685, 1683, + 1681, 1682, 1923, 1648, 1878, 1877, 1851, 1870, 1872, 1924, + 1073, 0, 1080, 1078, 1801, 1804, 0, 0, 2843, 2855, + 0, 0, 2824, 0, 0, 0, 156, 0, 920, 922, + 921, 906, 905, 0, 131, 133, 0, 679, 128, 481, + 490, 593, 596, 637, 636, 188, 187, 192, 193, 1688, + 1689, 1686, 1687, 461, 474, 1690, 475, 449, 151, 150, + 152, 153, 155, 154, 149, 954, 0, 462, 463, 429, + 0, 409, 1035, 927, 588, 1006, 0, 680, 588, 881, + 881, 586, 0, 0, 1144, 0, 0, 1746, 0, 0, + 1144, 0, 0, 0, 1787, 0, 1014, 966, 0, 1748, + 0, 1746, 1746, 1015, 0, 0, 967, 1787, 0, 0, + 0, 0, 0, 1746, 1144, 0, 0, 0, 492, 0, + 1144, 986, 1055, 1053, 1054, 0, 1144, 1144, 0, 0, + 0, 0, 627, 628, 626, 0, 0, 0, 619, 595, + 826, 968, 491, 969, 679, 0, 1049, 676, 682, 2106, + 0, 2804, 2726, 0, 0, 161, 1108, 0, 1107, 232, + 231, 0, 223, 300, 370, 0, 222, 0, 1583, 0, + 1584, 1581, 1582, 321, 354, 109, 113, 105, 90, 86, + 117, 118, 88, 89, 93, 92, 94, 95, 98, 99, + 96, 91, 97, 87, 121, 123, 122, 100, 119, 120, + 85, 468, 467, 466, 465, 438, 0, 0, 1912, 416, + 0, 1620, 1639, 2114, 1817, 0, 1371, 1511, 0, 0, + 784, 1484, 1485, 1495, 0, 1496, 770, 769, 785, 1487, + 1490, 1494, 1492, 1336, 1344, 1393, 0, 1310, 1394, 0, + 1424, 1339, 1338, 0, 0, 0, 1377, 1404, 0, 1378, + 0, 1475, 0, 0, 1351, 0, 1353, 0, 0, 1439, + 1408, 1430, 1380, 1412, 0, 1356, 1331, 0, 1381, 0, + 1386, 1384, 0, 1360, 0, 0, 1367, 0, 1365, 0, + 1366, 0, 1368, 1416, 1418, 0, 0, 854, 840, 841, + 842, 0, 844, 846, 848, 0, 0, 1628, 1553, 2768, + 1189, 2759, 1199, 0, 0, 1472, 1249, 0, 1258, 1255, + 0, 1252, 1221, 1444, 1434, 1979, 0, 0, 292, 287, + 295, 289, 291, 290, 296, 297, 298, 299, 293, 288, + 294, 286, 285, 2703, 0, 2622, 0, 2696, 2698, 2627, + 2684, 2683, 2706, 2706, 2706, 0, 340, 0, 1754, 1170, + 1175, 1179, 0, 1171, 2028, 329, 334, 364, 362, 376, + 379, 383, 381, 514, 0, 0, 0, 534, 0, 532, + 508, 0, 1151, 1100, 375, 1219, 1771, 1783, 0, 1791, + 0, 0, 1768, 1778, 0, 0, 0, 1777, 494, 0, + 254, 0, 2611, 2612, 2610, 0, 1716, 1706, 1645, 1652, + 2755, 1613, 1548, 1544, 1517, 1544, 0, 0, 1525, 1544, + 1521, 1523, 1578, 1219, 1632, 1645, 0, 1648, 1223, 1222, + 0, 2570, 2569, 2563, 2562, 2564, 2543, 0, 0, 1869, + 1648, 1865, 0, 0, 0, 1620, 0, 373, 2625, 202, + 652, 653, 651, 650, 0, 2831, 0, 0, 0, 129, + 0, 0, 482, 0, 0, 0, 654, 655, 657, 658, + 2028, 489, 826, 597, 148, 410, 681, 928, 1144, 0, + 0, 0, 881, 675, 588, 927, 882, 588, 588, 0, + 1004, 1030, 1031, 0, 0, 605, 602, 0, 614, 987, + 978, 988, 999, 1001, 0, 604, 629, 0, 0, 617, + 1746, 0, 1012, 0, 0, 599, 0, 0, 648, 649, + 647, 623, 630, 1032, 1033, 600, 601, 0, 0, 1635, + 1637, 1645, 607, 606, 1695, 1694, 616, 0, 603, 0, + 1018, 994, 0, 645, 643, 640, 642, 641, 646, 644, + 618, 609, 608, 611, 610, 613, 612, 615, 631, 983, + 0, 1034, 1034, 1003, 0, 2109, 0, 1051, 1005, 0, + 659, 677, 660, 0, 0, 635, 634, 632, 633, 0, + 0, 2727, 0, 0, 0, 956, 0, 164, 162, 172, + 1110, 1111, 0, 0, 0, 0, 0, 0, 218, 0, + 1178, 0, 0, 0, 110, 112, 0, 114, 116, 0, + 106, 108, 399, 464, 417, 1826, 1819, 1663, 0, 1512, + 0, 0, 0, 0, 831, 0, 0, 786, 1498, 748, + 783, 1307, 768, 1300, 1302, 1298, 0, 749, 1301, 783, + 0, 1304, 1306, 1297, 0, 1455, 0, 0, 0, 1478, + 0, 0, 0, 0, 0, 0, 0, 1334, 0, 1435, + 0, 0, 0, 0, 0, 0, 1364, 1362, 1363, 838, + 1421, 0, 851, 845, 843, 850, 0, 1623, 1188, 2762, + 930, 1254, 0, 1445, 1982, 0, 1980, 1956, 1983, 0, + 2697, 2695, 2694, 0, 0, 2711, 2711, 2711, 1796, 1795, + 0, 1794, 321, 336, 339, 1798, 1172, 1180, 2030, 2029, + 0, 0, 512, 515, 0, 507, 0, 531, 0, 498, + 576, 0, 0, 0, 1792, 1780, 2749, 1769, 1772, 2103, + 1543, 1587, 2613, 816, 2031, 1643, 1549, 1547, 1555, 0, + 1513, 1544, 1544, 0, 1513, 0, 0, 1545, 1575, 1557, + 1633, 1634, 0, 1629, 1631, 1625, 1696, 2097, 2525, 2527, + 1871, 1079, 1081, 1803, 1639, 1805, 0, 203, 205, 206, + 0, 213, 391, 390, 0, 0, 0, 0, 0, 0, + 0, 479, 476, 679, 478, 578, 598, 989, 0, 588, + 877, 878, 927, 902, 2106, 927, 927, 0, 0, 0, + 977, 0, 1130, 0, 982, 822, 624, 0, 973, 1013, + 1046, 0, 625, 1049, 975, 0, 1638, 493, 974, 996, + 980, 1975, 1007, 1050, 859, 762, 713, 704, 783, 707, + 706, 783, 718, 768, 764, 0, 768, 768, 741, 740, + 758, 744, 726, 831, 831, 725, 761, 831, 745, 743, + 747, 0, 749, 768, 754, 742, 746, 763, 739, 0, + 760, 783, 783, 783, 722, 759, 831, 0, 752, 783, + 683, 768, 831, 836, 0, 0, 783, 785, 2108, 2806, + 0, 2808, 171, 160, 0, 0, 958, 960, 0, 0, + 961, 1116, 0, 226, 301, 822, 302, 0, 229, 1174, + 1585, 321, 102, 0, 103, 0, 101, 0, 0, 1814, + 1372, 781, 779, 782, 780, 829, 834, 832, 830, 0, + 836, 1486, 0, 0, 1309, 1303, 750, 1308, 1299, 831, + 1397, 1375, 1376, 1405, 0, 1476, 1467, 1403, 0, 1352, + 1436, 0, 0, 1413, 1382, 1385, 1383, 1388, 1389, 0, + 1420, 0, 1639, 1256, 1978, 0, 0, 1954, 2714, 2699, + 0, 0, 2710, 2708, 0, 2709, 2707, 2675, 0, 2620, + 2621, 2619, 2603, 0, 321, 341, 0, 0, 335, 1219, + 520, 0, 537, 536, 533, 1199, 1782, 1784, 1790, 1779, + 0, 2039, 0, 1526, 0, 1530, 1535, 1531, 0, 1522, + 0, 1579, 0, 1199, 1645, 0, 1711, 1663, 2825, 0, + 0, 2823, 216, 214, 215, 0, 209, 211, 0, 394, + 392, 393, 0, 0, 0, 0, 0, 1645, 925, 0, + 483, 2749, 592, 656, 579, 0, 991, 0, 927, 902, + 2106, 0, 661, 0, 665, 667, 587, 1017, 0, 1049, + 979, 1000, 1019, 1011, 1010, 0, 1009, 1144, 1636, 995, + 997, 1092, 0, 0, 863, 712, 705, 723, 721, 772, + 765, 0, 772, 772, 732, 748, 727, 0, 831, 738, + 731, 750, 753, 755, 757, 772, 0, 831, 720, 719, + 729, 716, 772, 787, 766, 751, 831, 709, 837, 836, + 711, 831, 836, 772, 772, 0, 2805, 0, 2803, 0, + 158, 163, 173, 174, 948, 0, 1117, 1113, 1114, 1109, + 0, 806, 0, 224, 225, 237, 236, 228, 0, 321, + 111, 115, 107, 2427, 1664, 1820, 835, 828, 833, 0, + 1305, 1479, 1645, 0, 1438, 1440, 839, 0, 1648, 1981, + 0, 2681, 2680, 2679, 2676, 0, 0, 0, 0, 0, + 0, 0, 2712, 2716, 1793, 0, 0, 0, 528, 0, + 0, 562, 577, 0, 0, 0, 0, 2032, 2034, 0, 1717, 1550, 0, 0, 0, 0, 0, 1567, 1568, 0, 0, 1573, 1577, 1558, 1630, 1697, 1210, 1712, 1802, 0, - 204, 207, 2826, 213, 212, 1219, 169, 0, 0, 892, + 204, 207, 2832, 213, 212, 1219, 169, 0, 0, 892, 0, 924, 0, 894, 480, 490, 0, 485, 0, 0, 990, 678, 673, 669, 0, 903, 0, 663, 0, 0, - 0, 0, 0, 0, 0, 1016, 2067, 1008, 494, 976, + 0, 0, 0, 0, 0, 1016, 2073, 1008, 494, 976, 0, 981, 620, 0, 862, 0, 867, 776, 777, 778, 733, 773, 775, 0, 931, 735, 703, 728, 756, 734, 0, 730, 717, 795, 0, 0, 0, 0, 791, 0, 857, 0, 798, 684, 0, 685, 788, 790, 0, 0, - 0, 0, 724, 708, 710, 714, 715, 701, 702, 2101, - 2801, 1195, 1184, 2806, 165, 962, 321, 1112, 0, 1119, + 0, 0, 724, 708, 710, 714, 715, 701, 702, 2107, + 2807, 1195, 1184, 2812, 165, 962, 321, 1112, 0, 1119, 245, 243, 321, 233, 241, 235, 0, 242, 303, 230, 1665, 0, 1219, 1815, 771, 0, 1481, 1350, 1422, 1696, - 1978, 2671, 2711, 2714, 2712, 2713, 2716, 1667, 0, 2715, - 2709, 0, 1541, 1220, 0, 521, 0, 524, 526, 540, + 1984, 2677, 2717, 2720, 2718, 2719, 2722, 1667, 0, 2721, + 2715, 0, 1541, 1220, 0, 521, 0, 524, 526, 540, 0, 1787, 1787, 0, 0, 1787, 1787, 1787, 1787, 555, - 563, 565, 0, 0, 0, 0, 0, 2027, 0, 0, - 2034, 2036, 1527, 0, 1532, 0, 1524, 1563, 1563, 1574, - 0, 1194, 2820, 181, 210, 2811, 161, 170, 0, 890, + 563, 565, 0, 0, 0, 0, 0, 2033, 0, 0, + 2040, 2042, 1527, 0, 1532, 0, 1524, 1563, 1563, 1574, + 0, 1194, 2826, 181, 210, 2817, 161, 170, 0, 890, 0, 1787, 0, 1025, 893, 918, 900, 0, 1645, 0, - 1025, 895, 917, 898, 2022, 0, 2737, 993, 0, 0, - 0, 671, 0, 0, 0, 0, 2069, 2068, 985, 0, + 1025, 895, 917, 898, 2028, 0, 2743, 993, 0, 0, + 0, 671, 0, 0, 0, 0, 2075, 2074, 985, 0, 860, 0, 864, 865, 866, 0, 858, 774, 831, 0, 831, 801, 800, 1226, 793, 808, 688, 0, 0, 799, - 0, 789, 797, 792, 0, 0, 2804, 0, 0, 2803, + 0, 789, 797, 792, 0, 0, 2810, 0, 0, 2809, 0, 167, 175, 1118, 1123, 0, 1120, 1122, 0, 227, 244, 1666, 1821, 1645, 1210, 1669, 1668, 1799, 1807, 0, - 2012, 0, 529, 522, 0, 0, 538, 0, 0, 1787, - 1787, 0, 0, 0, 0, 0, 535, 564, 1787, 2031, - 2032, 0, 2029, 0, 0, 2035, 0, 0, 0, 1571, - 1569, 1219, 0, 2827, 0, 172, 0, 0, 0, 1025, + 2018, 0, 529, 522, 0, 0, 538, 0, 0, 1787, + 1787, 0, 0, 0, 0, 0, 535, 564, 1787, 2037, + 2038, 0, 2035, 0, 0, 2041, 0, 0, 0, 1571, + 1569, 1219, 0, 2833, 0, 172, 0, 0, 0, 1025, 891, 916, 915, 896, 910, 0, 0, 132, 1027, 1026, 901, 0, 923, 926, 134, 899, 477, 487, 486, 992, 0, 0, 0, 0, 0, 0, 0, 0, 861, 0, 0, 736, 932, 737, 0, 807, 1226, 796, 1219, 805, - 804, 802, 803, 767, 2743, 0, 0, 0, 166, 0, + 804, 802, 803, 767, 2749, 0, 0, 0, 166, 0, 159, 1115, 0, 234, 1480, 1197, 0, 0, 815, 516, 528, 525, 548, 541, 544, 0, 574, 568, 0, 0, - 570, 571, 569, 566, 559, 0, 557, 0, 2030, 2038, - 2037, 1529, 1534, 0, 1564, 0, 0, 0, 0, 0, - 1700, 1702, 2821, 190, 182, 0, 321, 0, 0, 146, + 570, 571, 569, 566, 559, 0, 557, 0, 2036, 2044, + 2043, 1529, 1534, 0, 1564, 0, 0, 0, 0, 0, + 1700, 1702, 2827, 190, 182, 0, 321, 0, 0, 146, 908, 907, 130, 897, 909, 919, 1029, 1028, 914, 913, - 911, 912, 2743, 0, 0, 0, 890, 0, 892, 894, + 911, 912, 2749, 0, 0, 0, 890, 0, 892, 894, 0, 873, 0, 872, 0, 869, 868, 1227, 0, 794, - 0, 2805, 0, 2807, 0, 168, 1121, 1806, 1808, 2013, + 0, 2811, 0, 2813, 0, 168, 1121, 1806, 1808, 2019, 523, 548, 0, 546, 0, 542, 539, 543, 572, 573, 0, 556, 0, 567, 1566, 1565, 1580, 0, 1220, 1698, - 1219, 181, 191, 2828, 1219, 174, 488, 0, 890, 0, + 1219, 181, 191, 2834, 1219, 174, 488, 0, 890, 0, 662, 890, 666, 668, 998, 875, 876, 874, 0, 0, - 1228, 689, 2808, 2809, 2039, 545, 0, 553, 549, 551, - 554, 562, 561, 558, 0, 0, 1703, 1701, 2822, 2812, + 1228, 689, 2814, 2815, 2045, 545, 0, 553, 549, 551, + 554, 562, 561, 558, 0, 0, 1703, 1701, 2828, 2818, 157, 674, 670, 890, 664, 0, 0, 691, 690, 692, - 0, 2025, 547, 0, 0, 560, 1572, 1570, 321, 0, - 672, 871, 870, 0, 696, 686, 693, 695, 0, 2033, - 552, 550, 2823, 0, 698, 697, 694, 0, 2041, 2813, - 2040, 0, 2045, 321, 0, 0, 2052, 2814, 2043, 2044, - 2042, 2047, 0, 0, 2049, 2050, 0, 2014, 2051, 2046, - 0, 2053, 2055, 0, 2048, 0, 1219, 2054, 0, 1220, - 2056 + 0, 2031, 547, 0, 0, 560, 1572, 1570, 321, 0, + 672, 871, 870, 0, 696, 686, 693, 695, 0, 2039, + 552, 550, 2829, 0, 698, 697, 694, 0, 2047, 2819, + 2046, 0, 2051, 321, 0, 0, 2058, 2820, 2049, 2050, + 2048, 2053, 0, 0, 2055, 2056, 0, 2020, 2057, 2052, + 0, 2059, 2061, 0, 2054, 0, 1219, 2060, 0, 1220, + 2062 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -4278, -4278, -4278, -4278, 1717, 3449, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, 1859, -4278, -4278, -4278, -4278, -4278, - 1514, -4278, 340, -4278, 345, -4278, 347, -2542, -496, 3322, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -125, 1174, 3278, -4278, 236, -4278, -109, -4278, -4278, -4278, - -3523, -227, -396, -4278, 26, 19, 3269, -386, -4277, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -2116, -4278, - -4278, -4278, 74, -4278, -4278, -556, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -169, 381, 1884, -4278, -4278, -4278, - 4350, -4278, 3793, -4278, -1925, 2345, -4278, -4278, -4278, -4278, - -4278, 2432, -1830, -4278, -4278, -4278, 1400, -4278, -4278, -4278, - -917, 27, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, 581, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, 2122, -4278, - -4278, 3722, -4278, -4278, -4278, 1381, -4278, -4278, -4278, -4278, - -4278, -4278, -1306, -4278, 1863, 1856, -4278, 1864, -4278, -94, - 633, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, 3245, -4278, - -4278, -4278, -2323, -4278, -4278, -2446, 2727, -4278, -1993, -4278, - -4278, -2095, -4278, -4278, -1869, 947, -4278, -4278, 873, 386, - -4278, -1538, -2134, -2132, -4278, -4278, -4278, -2175, -2174, -714, - 2488, -1258, -2474, -4278, -4278, -4278, -4278, -92, -4278, -4278, - 91, 1617, 2164, -4278, -2706, -4278, -4278, 766, -4278, -4278, - 1387, 593, 1384, -4278, 933, 2985, -1325, -4278, -4278, -4278, - -4278, -4278, -4278, -150, 149, -243, -4278, -3984, 599, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -2974, -4278, -4278, - -4278, -395, -4278, -4278, -331, -4278, -4278, -369, -4278, -27, - -2514, -4278, -4278, -4278, -4278, 2236, -1548, -4278, -589, -4278, - 295, 1647, -2625, -2123, -4278, -1046, -1019, -3137, -4278, -4278, - -4278, -4278, 1168, -4278, 546, 1644, -2604, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, 1172, -4278, -4278, -3353, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -389, -4278, -200, 760, - -4278, -3184, 1087, 494, -4278, -4278, -4278, -4278, -1532, -3175, - -736, -4278, 93, -2695, -2645, 462, -4278, -4278, 69, -3898, - -4278, -603, -2277, -2573, -212, -4278, -4278, 83, -3539, 1752, - -4278, 432, -1167, -2656, 1521, -4278, -4278, 1044, -4278, -2986, - 1042, -4278, -4278, -4278, 1052, -4278, -307, -4278, -4278, -4278, - -4278, -3289, -4278, -1667, -2571, -4278, -4278, 4397, 4398, -2144, - -254, -253, -4278, -4278, -4278, 328, -4278, -4278, -661, -131, - -21, -13, -2640, -3731, 172, -3367, -4278, 285, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, 1688, -1844, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -3284, -3069, -4278, -4278, 1217, - -2748, -2215, -2210, -2584, 3415, -4278, -4278, -4278, -4278, 3360, - -2402, -3625, -4278, -4278, -4278, -4278, -4278, -4278, -4278, 2893, - 1065, -4278, -4278, 1812, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, 323, 1930, -4278, -4278, -4278, -4278, -4278, - 2238, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -162, - -4278, -4278, -4278, -4278, -4278, 587, 2800, -4278, -4278, -4278, - -4278, -9, -4278, -4278, -4278, -4278, 2478, -4278, -4278, -4278, - -4278, 2827, -4278, -4278, -4278, -4278, -4278, -4278, 1489, -4278, - 1971, -4278, -1647, -4278, -4278, 1039, -147, 1923, -625, -4278, - 2068, -4278, 123, -4278, 3447, -4278, -4278, -3286, 3548, -4278, - -4278, -2637, -4278, 3531, -1489, -2888, 2435, 98, -141, -2057, - 1089, -120, 1519, 597, 4545, -4278, -1205, -1240, -4278, -4278, - -2, -4278, -4278, -4278, -4278, -4278, -4278, 2175, 2182, -643, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, 1550, -4278, -4278, -4278, -4278, -1282, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -972, -4278, -2232, -4278, -4278, -4278, - -477, -4278, 3314, -4278, -4278, -4278, -2452, -1508, 1909, 1012, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, 1921, -4278, -1719, - -4278, -2941, -4278, -4278, -4278, -4278, 1586, -4278, -4278, -4278, - -4278, -4278, -4278, -1889, -4278, -2195, 66, -4278, 243, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -217, 833, -216, -3459, - -1209, 1714, -4278, -4278, -1383, 3355, -1905, -4278, 761, -4278, - 2087, 1138, -4278, -4278, -4278, -4278, 635, -2967, 2939, -4278, - -4278, -3394, -1009, -4278, 2940, -4278, -1467, 1490, 446, -4278, - -1498, -1193, -1797, -3165, -2634, -4278, 1307, 142, -4278, -4278, - -4278, -198, -4278, -4278, -4278, 1503, -4278, 458, 459, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -580, - -959, -4278, -4278, 2249, -1500, -491, 4507, 3, -4278, -4278, - 4, -4278, -4278, -4278, -4278, 3174, 3125, 2052, -4278, -4278, - -2588, -4278, -4278, 2010, -4278, 753, -1003, -594, 1082, -4278, - -4278, 1086, -3455, -4278, -4278, 13, -4278, -4278, -4278, 1030, - -4278, -74, 3982, 16, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, 2863, -1138, 3891, -4278, -4278, -4278, -4278, -4278, - -4278, 2427, -4278, -4278, -4278, -4278, -4278, -4278, 3042, 4001, - -606, -1444, -4278, -825, 2433, 1934, -889, -4278, -4278, -4278, - 3497, 4002, -4278, -4278, 4506, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, 2660, 672, -4278, -4278, -4278, -4278, - 3145, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, 1132, -208, -4278, 329, -225, -4278, - 147, -4278, -4278, -4278, -4278, -4278, -252, -4278, -4278, -256, - -4278, -1108, 3819, -1475, 245, -1357, -2737, -4278, 1111, 3123, - -2970, -709, -1224, -1257, -2924, -15, -4278, -4278, 3745, 30, - -479, -1661, -6, -821, -107, -618, -624, -893, -4278, -553, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, 1963, -4278, -4278, -4278, 1073, -4278, 4029, -4278, 2751, - -1491, 4034, -573, 2509, 1985, 1983, -4278, -4278, -4278, -4278, - -1973, -4278, -4278, 212, -4278, 2633, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278, - -4278, -4278, -4278, 3010, -452, -501, 3153, 4051, 3675, -4278, - 3256, -4278, -4278, -4278, -4278, -4278, 382, -4278, -152, 2051, - -1534, -2566, -4278, -4278, 2132, 969, -4278, 1651, -294, -588, - -4278, -4278, 376, -4278, -4278, -4278, 1371, 1737, 4064, 3688, - -4278, -4278, -4278, -4278, -4278, -2954, -971, -4278, -3684, -1927, - -4278, -4278, -4278, -2337, -3274, -4278, -4278, -1101, -4278, -4278, - -4278, -4278, -2235, -4278, -4278, -4278, 5, 4031, 4032, 4033, - -4278, -897, -4278, -4278, -4278, -4278, -4278, -4278, -4278, 3576, - -4278, -4278, -4278, -4278, -4278, 3036, 3579, -4278, -4278, -4278, - -4278, -4278, 3582, -4278, -4278, -4278, -4278, -4278, 1629, -4278, - -4278, -4278, -4278, -4278, -4278, -4278, -4278, -4278 + -4291, -4291, -4291, -4291, 1706, 3429, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, 1863, -4291, -4291, -4291, -4291, -4291, + 1512, -4291, 329, -4291, 337, -4291, 342, -2530, -475, 3318, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -132, 1173, 3274, -4291, 227, -4291, -122, -4291, -4291, -4291, + -3527, -243, -410, -4291, 24, 20, 3258, -405, -3576, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -3697, -4291, + -4291, -4291, 54, -4291, -4291, -567, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -188, 365, 1953, -4291, -4291, -4291, + 4341, -4291, 3784, -4291, -1915, 2336, -4291, -4291, -4291, -4291, + -4291, 2423, -1854, -4291, -4291, -4291, 1388, -4291, -4291, -4291, + -920, 36, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, 565, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, 2111, -4291, + -4291, 3704, -4291, -4291, -4291, 1369, -4291, -4291, -4291, -4291, + -4291, -4291, -1328, -4291, 1846, 1848, -4291, 1850, -4291, -306, + 245, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, 3224, -4291, + -4291, -4291, -2297, -4291, -4291, -2632, 2716, -4291, -1954, -4291, + -4291, -2109, -4291, -4291, -1869, 344, -4291, -4291, 975, -336, + -4291, -1593, -2123, -2112, -4291, -4291, -4291, -2170, -2169, -804, + 2471, -1247, -2550, -4291, -4291, -4291, -4291, -115, -4291, -4291, + 67, 1601, 2151, -4291, -2702, -4291, -4291, 747, -4291, -4291, + 1370, 572, 1368, -4291, 916, 2971, -1367, -4291, -4291, -4291, + -4291, -4291, -4291, -170, 129, -263, -4291, -4058, 580, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4290, -4291, -4291, + -4291, -414, -4291, -4291, -352, -4291, -4291, -390, -4291, -43, + -2510, -4291, -4291, -4291, -4291, 2226, -1547, -4291, -628, -4291, + 276, 1634, -2934, -2128, -4291, -1038, -1032, -3158, -4291, -4291, + -4291, -4291, 1157, -4291, 529, 1635, -2603, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, 1158, -4291, -4291, -3378, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -409, -4291, -222, 748, + -4291, -3187, 1074, 479, -4291, -4291, -4291, -4291, -909, -3189, + -753, -4291, 75, -2641, -2705, 450, -4291, -4291, 52, -3896, + -4291, -601, -2293, -2565, -227, -4291, -4291, 69, -3510, 1746, + -4291, 418, -908, -2742, 1511, -4291, -4291, 1037, -4291, -1940, + 1036, -4291, -4291, -4291, 1045, -4291, -323, -4291, -4291, -4291, + -4291, -3262, -4291, -1624, -2673, -4291, -4291, 4391, 4392, -2582, + -269, -268, -4291, -4291, -4291, 313, -4291, -4291, -1836, -145, + -38, -28, -2614, -3731, 148, -2945, -4291, 274, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, 1682, -1295, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -2686, -3082, -4291, -4291, 1215, + -2959, -2217, -2206, -2600, 3419, -4291, -4291, -4291, -4291, 3357, + -2430, -3610, -4291, -4291, -4291, -4291, -4291, -4291, -4291, 2886, + 1169, -4291, -4291, 1811, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, 312, 1922, -4291, -4291, -4291, -4291, -4291, + 2237, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -175, + -4291, -4291, -4291, -4291, -4291, 577, 2777, -4291, -4291, -4291, + -4291, -9, -4291, -4291, -4291, -4291, 2465, -4291, -4291, -4291, + -4291, 2807, -4291, -4291, -4291, -4291, -4291, -4291, 1482, -4291, + 1964, -4291, -1620, -4291, -4291, 1027, -147, 1907, -627, -4291, + 2064, -4291, 104, -4291, 3422, -4291, -4291, -3272, 3532, -4291, + -4291, -2640, -4291, 3533, -1487, -2871, 2424, 116, -141, -2058, + 1079, -127, 1442, 995, 4587, -4291, -1234, -1211, -4291, -4291, + -2, -4291, -4291, -4291, -4291, -4291, -4291, 2169, 2178, -647, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, 1550, -4291, -4291, -4291, -4291, -1314, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -924, -4291, -2231, -4291, -4291, -4291, + -512, -4291, 3308, -4291, -4291, -4291, -2476, -1497, 1908, 1003, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, 1911, -4291, -1706, + -4291, -2929, -4291, -4291, -4291, -4291, 1576, -4291, -4291, -4291, + -4291, -4291, -4291, -1845, -4291, -2139, 53, -4291, 230, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -237, 822, -232, -3039, + -1212, 1632, -4291, -4291, -1357, 3351, -1908, -4291, 750, -4291, + 2076, 1125, -4291, -4291, -4291, -4291, 616, -2969, 2928, -4291, + -4291, -3346, -1014, -4291, 2931, -4291, -1453, 1475, 429, -4291, + -292, -1196, -1578, -3183, -2558, -4291, 1292, 120, -4291, -4291, + -4291, -220, -4291, -4291, -4291, 1488, -4291, 437, 438, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -578, + -980, -4291, -4291, 2243, -2668, -498, 4498, -13, -4291, -4291, + -4, -4291, -4291, -4291, -4291, 3166, 3115, 2040, -4291, -4291, + -2587, -4291, -4291, 2003, -4291, 735, -985, -928, 1070, -4291, + -4291, 1073, -3475, -4291, -4291, -3, -4291, -4291, -4291, 1019, + -4291, -91, 3975, 0, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, 2856, -1141, 3885, -4291, -4291, -4291, -4291, -4291, + -4291, 2426, -4291, -4291, -4291, -4291, -4291, -4291, 3045, 3992, + -606, -1444, -4291, -812, 2427, 1915, -969, -4291, -4291, -4291, + 3489, 3997, -4291, -4291, 4494, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, 2648, 660, -4291, -4291, 527, -4291, + -4291, -4291, -4291, 3137, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, 1120, -226, -4291, + 310, -240, -4291, 133, -4291, -4291, -4291, -4291, -4291, -265, + -4291, -4291, -274, -4291, -1110, 3811, -1467, 233, -1352, -2763, + -4291, 1106, 3109, -2985, -703, -1262, -1270, -2886, -15, -4291, + -4291, 3755, 30, -471, -1844, -6, -851, -107, -624, -613, + -863, -4291, -515, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, 1961, -4291, -4291, -4291, 1071, -4291, + 4026, -4291, 2746, -1481, 4029, -586, 2507, 1976, 1982, -4291, + -4291, -4291, -4291, -1970, -4291, -4291, 188, -4291, 2630, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, -4291, -4291, -4291, -4291, 3014, -492, -476, 3154, + 4051, 3676, -4291, 3252, -4291, -4291, -4291, -4291, -4291, 370, + -4291, 1159, 2050, -1550, -2515, -4291, -4291, 2134, 928, -4291, + 1650, -328, -572, -4291, -4291, 367, -4291, -4291, -4291, 1371, + 1574, 4061, 3681, -4291, -4291, -4291, -4291, -4291, -2992, -975, + -4291, -3700, -1562, -4291, -4291, -4291, -2333, -3278, -4291, -4291, + -1095, -4291, -4291, -4291, -4291, -2224, -4291, -4291, -4291, -1, + 4023, 4024, 4025, -4291, -885, -4291, -4291, -4291, -4291, -4291, + -4291, -4291, 3557, -4291, -4291, -4291, -4291, -4291, 3023, 3565, + -4291, -4291, -4291, -4291, -4291, 3571, -4291, -4291, -4291, -4291, + -4291, 1717, -4291, -4291, -4291, -4291, -4291, -4291, -4291, -4291, + -4291 }; /* YYDEFGOTO[NTERM-NUM]. */ @@ -4661,107 +4669,108 @@ static const yytype_int16 yydefgoto[] = { -1, 64, 637, 1639, 65, 66, 67, 68, 69, 1454, 70, 868, 1358, 1950, 1951, 71, 571, 72, 1717, 2314, - 2315, 3735, 3736, 3729, 3730, 3732, 3733, 2316, 697, 698, - 73, 2716, 3900, 3586, 3587, 2208, 645, 646, 1110, 2710, - 2739, 2740, 1648, 3583, 3711, 4414, 3715, 4561, 4670, 4496, - 2819, 4013, 4415, 4416, 566, 2705, 1683, 4613, 2236, 4714, - 2237, 74, 690, 1160, 1710, 1711, 3889, 3890, 3891, 4131, - 4136, 4137, 4138, 4139, 2824, 930, 2272, 2825, 3721, 4241, - 4248, 4249, 3298, 4422, 4423, 4424, 4246, 974, 4425, 75, + 2315, 3739, 3740, 3733, 3734, 3736, 3737, 2316, 697, 698, + 73, 2718, 3907, 3590, 3591, 2208, 645, 646, 1110, 2712, + 2741, 2742, 1648, 3587, 3715, 4424, 3719, 4571, 4680, 4506, + 2821, 4020, 4425, 4426, 566, 2707, 1683, 4623, 2236, 4724, + 2237, 74, 690, 1160, 1710, 1711, 3896, 3897, 3898, 4140, + 4145, 4146, 4147, 4148, 2826, 930, 2272, 2827, 3725, 4250, + 4257, 4258, 3301, 4432, 4433, 4434, 4255, 974, 4435, 75, 597, 598, 976, 1490, 1966, 1491, 76, 77, 565, 1381, - 1382, 1383, 1384, 2515, 1967, 2510, 2511, 3467, 3299, 4244, + 1382, 1383, 1384, 2517, 1967, 2512, 2513, 3471, 3302, 4253, 931, 932, 79, 572, 933, 934, 935, 1438, 936, 937, - 938, 939, 3032, 940, 1434, 3491, 909, 910, 2542, 3482, - 3827, 80, 535, 693, 694, 1716, 2289, 695, 2290, 2830, - 3728, 696, 1162, 2286, 1164, 3495, 941, 2557, 942, 1430, - 81, 1153, 1702, 1703, 943, 1082, 2200, 963, 2050, 3496, - 1443, 944, 2558, 2560, 2559, 82, 582, 623, 592, 3897, - 4143, 669, 670, 708, 2337, 671, 1178, 1128, 1685, 2261, - 2262, 2745, 2746, 2865, 2866, 2867, 2253, 2254, 2255, 2326, + 938, 939, 3035, 940, 1434, 3495, 909, 910, 2544, 3486, + 3834, 80, 535, 693, 694, 1716, 2289, 695, 2290, 2832, + 3732, 696, 1162, 2286, 1164, 3499, 941, 2559, 942, 1430, + 81, 1153, 1702, 1703, 943, 1082, 2200, 963, 2050, 3500, + 1443, 944, 2560, 2562, 2561, 82, 582, 623, 592, 3904, + 4152, 669, 670, 708, 2337, 671, 1178, 1128, 1685, 2261, + 2262, 2747, 2748, 2867, 2868, 2869, 2253, 2254, 2255, 2326, 2327, 2328, 2243, 2244, 2245, 1689, 2240, 2241, 672, 1129, - 1139, 2256, 2257, 2258, 2871, 2330, 2331, 2332, 2333, 2259, - 1942, 2260, 3190, 3175, 4153, 4152, 3176, 3907, 4516, 4732, - 3596, 3597, 3279, 3663, 2278, 83, 585, 952, 1451, 2566, - 1452, 2568, 3037, 3038, 3039, 2032, 2033, 4101, 2037, 2565, - 4288, 4680, 4456, 4457, 3041, 4455, 3045, 3504, 3505, 3839, - 4103, 4291, 4685, 4585, 4766, 4683, 4762, 4684, 4764, 4834, - 4808, 4809, 4596, 4695, 4696, 4770, 4811, 4469, 4470, 4471, - 2588, 3054, 4106, 4156, 2700, 1675, 1676, 3616, 1102, 84, - 3177, 2802, 3178, 3179, 3686, 2804, 2805, 2996, 1565, 3676, - 3647, 3580, 3591, 3592, 3593, 3594, 3595, 4346, 4523, 4348, - 4349, 4520, 4642, 4519, 3696, 3609, 3213, 3214, 3284, 3699, - 4214, 4393, 4394, 4829, 4845, 4846, 4847, 85, 949, 4018, - 3994, 3995, 3996, 3997, 3998, 3999, 4000, 4402, 3362, 3363, - 4370, 4371, 4372, 3357, 3358, 3754, 4395, 4396, 4397, 4019, - 4544, 4042, 1530, 1531, 3532, 1543, 1544, 2653, 2116, 2654, - 1679, 4043, 4044, 4221, 3423, 4072, 3429, 3430, 3431, 2955, - 2956, 2957, 2958, 2959, 2454, 4398, 3698, 4185, 4363, 4366, - 4536, 4745, 3610, 3215, 3613, 1059, 647, 3216, 3217, 4619, - 4503, 4510, 4620, 4511, 4504, 4163, 2713, 4621, 4622, 4623, - 4513, 4506, 3168, 4147, 4148, 3602, 3442, 4373, 86, 142, - 2264, 1120, 1131, 1127, 1150, 676, 2268, 1132, 2820, 3292, - 4235, 659, 2806, 4178, 3925, 4182, 2807, 3626, 2808, 4157, - 4340, 2809, 3942, 4180, 4360, 3627, 3628, 2810, 2811, 2812, - 4627, 4628, 4629, 3218, 1418, 674, 675, 1143, 1144, 1145, - 2501, 3694, 3262, 87, 2196, 2191, 88, 1072, 1073, 1074, - 1610, 1611, 2194, 2195, 2693, 3150, 89, 700, 1721, 1464, - 2048, 90, 961, 2579, 2580, 2581, 3051, 91, 1152, 1699, - 1700, 2271, 3295, 3718, 4014, 4240, 4419, 4236, 4565, 4566, + 1139, 2256, 2257, 2258, 2873, 2330, 2331, 2332, 2333, 2259, + 1942, 2260, 3193, 3178, 4162, 4161, 3179, 3914, 4526, 4742, + 3600, 3601, 3282, 3667, 2278, 83, 585, 952, 1451, 2568, + 1452, 2570, 3040, 3041, 3042, 2032, 2033, 4110, 2037, 2567, + 4298, 4690, 4466, 4467, 3044, 4465, 3048, 3508, 3509, 3846, + 4112, 4301, 4695, 4595, 4776, 4693, 4772, 4694, 4774, 4844, + 4818, 4819, 4606, 4705, 4706, 4780, 4821, 4479, 4480, 4481, + 2590, 3057, 4115, 4165, 2702, 1675, 1676, 3620, 1102, 84, + 3180, 2804, 3181, 3182, 3690, 2806, 2807, 2998, 1565, 3680, + 3651, 3584, 3595, 3596, 3597, 3598, 3599, 4356, 4533, 4358, + 4359, 4530, 4652, 4529, 3700, 3613, 3216, 3217, 3287, 3703, + 4223, 4403, 4404, 4839, 4855, 4856, 4857, 85, 949, 4025, + 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4412, 3365, 3366, + 4380, 4381, 4382, 3360, 3361, 3758, 4405, 4406, 4407, 4026, + 4554, 4049, 1530, 1531, 3536, 1543, 1544, 2655, 2116, 2656, + 1679, 4050, 4051, 4230, 3426, 4079, 3432, 3433, 3434, 2957, + 2958, 2959, 2960, 2961, 2454, 4408, 3702, 4194, 4373, 4376, + 4546, 4755, 3614, 3218, 3617, 1059, 647, 3219, 3220, 4629, + 4513, 4520, 4630, 4521, 4514, 4172, 2715, 4631, 4632, 4633, + 4523, 4516, 3171, 4156, 4157, 3606, 3445, 4383, 86, 142, + 2264, 1120, 1131, 1127, 1150, 676, 2268, 1132, 2822, 3295, + 4244, 659, 2808, 4187, 3932, 4191, 2809, 3630, 2810, 4166, + 4350, 2811, 3949, 4189, 4370, 3631, 3632, 2812, 2813, 2814, + 4637, 4638, 4639, 3221, 1418, 674, 675, 1143, 1144, 1145, + 2501, 3698, 3265, 87, 2196, 2191, 88, 1072, 1073, 1074, + 1610, 1611, 2194, 2195, 2695, 3153, 89, 700, 1721, 1464, + 2048, 90, 961, 2581, 2582, 2583, 3054, 91, 1152, 1699, + 1700, 2271, 3298, 3722, 4021, 4249, 4429, 4245, 4575, 4576, 92, 702, 1171, 93, 540, 1729, 1730, 1731, 2319, 94, 1445, 150, 95, 960, 1457, 1460, 1461, 96, 689, 1154, - 1155, 1156, 1157, 2274, 97, 2013, 2545, 2546, 2547, 2548, - 1707, 2826, 1708, 1709, 2283, 3489, 98, 99, 633, 634, - 2461, 2462, 603, 986, 604, 605, 606, 2964, 2965, 2966, + 1155, 1156, 1157, 2274, 97, 2013, 2547, 2548, 2549, 2550, + 1707, 2828, 1708, 1709, 2283, 3493, 98, 99, 633, 634, + 2461, 2462, 603, 986, 604, 605, 606, 2966, 2967, 2968, 2093, 1003, 1004, 1005, 1513, 1515, 1516, 1607, 1517, 2029, - 3113, 4655, 1214, 1210, 830, 831, 832, 833, 1305, 1306, - 3707, 834, 1315, 1906, 3374, 3769, 4052, 1764, 1765, 835, - 836, 837, 838, 839, 840, 1933, 3395, 3396, 3785, 2487, - 2488, 2489, 841, 2375, 3380, 2389, 842, 1298, 1891, 1821, - 3777, 3388, 4057, 4262, 1749, 2351, 2903, 3750, 3365, 2991, + 3116, 4665, 1214, 1210, 830, 831, 832, 833, 1305, 1306, + 3711, 834, 1315, 1906, 3377, 3773, 4059, 1764, 1765, 835, + 836, 837, 838, 839, 840, 1933, 3398, 3399, 3789, 2487, + 2488, 2489, 841, 2375, 3383, 2389, 842, 1298, 1891, 1821, + 3781, 3391, 4064, 4271, 1749, 2351, 2905, 3754, 3368, 2993, 2456, 1237, 1238, 1195, 2358, 1755, 2094, 2095, 2096, 2097, - 2098, 3868, 3869, 4302, 4115, 4304, 4119, 2635, 2636, 2054, - 2055, 2099, 2100, 3090, 4113, 2457, 2458, 2459, 3091, 3539, - 3105, 3106, 4124, 2626, 2101, 3097, 4609, 4310, 4311, 4707, - 4706, 4312, 4122, 4123, 3870, 3871, 3306, 3307, 3308, 3068, - 1811, 1812, 1819, 1411, 1412, 1750, 2103, 2640, 3110, 3552, - 2478, 2642, 3550, 3876, 2815, 3655, 3656, 989, 990, 2079, - 2620, 3084, 1506, 1507, 1508, 2085, 3085, 3086, 4032, 4449, - 4247, 2960, 3139, 3191, 1782, 1783, 3662, 4127, 4490, 4709, - 4710, 4711, 2076, 2077, 2615, 2616, 2617, 991, 992, 1503, - 2078, 3078, 3857, 100, 547, 101, 1948, 2994, 1355, 2507, - 1169, 1469, 1736, 1737, 858, 854, 561, 102, 573, 2543, - 103, 593, 2052, 914, 966, 1470, 1471, 2589, 3055, 3062, - 2590, 3067, 3849, 3057, 3512, 3513, 2496, 2497, 3058, 3515, - 3846, 3823, 3824, 3484, 4097, 104, 621, 3571, 3151, 3152, - 4577, 4578, 967, 105, 546, 1182, 2879, 4256, 1742, 2339, - 4433, 1183, 1184, 2342, 713, 714, 106, 1077, 617, 1589, - 1590, 1591, 2178, 107, 609, 1060, 3140, 3566, 2162, 956, - 1352, 1570, 1063, 1571, 2148, 2675, 1554, 108, 1116, 1115, + 2098, 3875, 3876, 4312, 4124, 4314, 4128, 2637, 2638, 2054, + 2055, 2099, 2100, 3093, 4122, 2457, 2458, 2459, 3094, 3543, + 3108, 3109, 4133, 2628, 2101, 3100, 4619, 4320, 4321, 4717, + 4716, 4322, 4131, 4132, 3877, 3878, 3309, 3310, 3311, 3071, + 1811, 1812, 1819, 1411, 1412, 1750, 2103, 2642, 3113, 3556, + 2478, 2644, 3554, 3883, 2817, 3659, 3660, 989, 990, 2079, + 2622, 3087, 1506, 1507, 1508, 2085, 3088, 3089, 4039, 4459, + 4256, 2962, 3142, 3194, 1782, 1783, 3666, 4136, 4500, 4719, + 4720, 4721, 2076, 2077, 2617, 2618, 2619, 991, 992, 1503, + 2078, 3081, 3864, 100, 547, 101, 1948, 2996, 1355, 2509, + 1169, 1469, 1736, 1737, 858, 854, 561, 102, 573, 2545, + 103, 593, 2052, 914, 966, 1470, 1471, 2591, 3058, 3065, + 2592, 3070, 3856, 3060, 3516, 3517, 2496, 2497, 3061, 3519, + 3853, 3830, 3831, 3488, 4106, 104, 621, 3575, 3154, 3155, + 4587, 4588, 967, 105, 546, 1182, 2881, 4265, 1742, 2339, + 4443, 1183, 1184, 2342, 713, 714, 106, 1077, 617, 1589, + 1590, 1591, 2178, 107, 609, 1060, 3143, 3570, 2162, 956, + 1352, 1570, 1063, 1571, 2148, 2677, 1554, 108, 1116, 1115, 686, 109, 110, 654, 151, 1671, 111, 869, 1374, 1962, - 3003, 3004, 3452, 1375, 1376, 2508, 4078, 112, 594, 971, - 972, 1475, 1473, 2600, 2057, 113, 587, 957, 2043, 114, - 576, 919, 1422, 2012, 115, 116, 117, 921, 3490, 4678, - 4804, 580, 2015, 1426, 3908, 4112, 4297, 4298, 4300, 4480, - 4481, 4831, 4862, 4870, 4866, 4873, 4874, 4877, 4881, 4882, - 844, 1088, 1089, 845, 4355, 846, 847, 848, 3063, 3064, - 2621, 849, 3065, 850, 3285, 1170, 1739, 569, 531, 666, - 1090, 2612, 852, 946, 1123, 1458, 1982, 1983, 533, 534, - 118, 608, 1007, 2111, 1520, 1021, 1548, 1538, 1547, 2136, - 2670, 2139, 2671, 2672, 3563, 3131, 3564, 3132, 1066, 2132, - 1521, 3133, 1522, 2125, 2126, 2127, 2128, 3125, 1536, 2122, - 2145, 119, 922, 539, 1428, 1429, 2554, 120, 620, 121, - 1413, 2003, 2004, 2539, 3021, 2540, 122, 980, 981, 123, - 897, 2703, 2523, 1938, 1126, 1939, 1989, 900, 1387, 901, - 902, 1402, 1396, 1405, 1399, 4275, 4087, 4088, 2527, 1946, - 1984, 2066, 3013, 3816, 1985, 1976, 2517, 2518, 3818, 4090, - 3471, 4282, 4283, 124, 155, 125, 4715, 542, 705, 1177, - 1498, 126, 127, 128, 129, 1501, 1632, 2610, 1633, 1634, - 1635, 1636, 2206, 2073, 1887, 1888, 3440, 1295, 1296, 2464, - 2967, 2968, 1006, 1105, 1659, 1650, 143, 144, 145, 146, - 1147, 1148, 3288, 3706, 4003, 4229, 4230, 4413, 4559, 1652, - 3162, 4614, 4839, 4863, 1653, 1654, 1655, 3575, 4319, 4612, - 4781, 4838, 1656, 3161, 3894, 4493, 4716, 130, 1091, 631, - 1630, 1625, 1627, 2203, 2698, 131, 132, 133 + 3006, 3007, 3456, 1375, 1376, 2510, 2506, 3815, 3816, 4087, + 112, 594, 971, 972, 1475, 1473, 2602, 2057, 113, 587, + 957, 2043, 114, 576, 919, 1422, 2012, 115, 116, 117, + 921, 3494, 4688, 4814, 580, 2015, 1426, 3915, 4121, 4307, + 4308, 4310, 4490, 4491, 4841, 4872, 4880, 4876, 4883, 4884, + 4887, 4891, 4892, 844, 1088, 1089, 845, 4365, 846, 847, + 848, 3066, 3067, 2623, 849, 3068, 850, 3288, 1170, 1739, + 569, 531, 666, 1090, 2614, 852, 946, 1123, 1458, 1982, + 1983, 533, 534, 118, 608, 1007, 2111, 1520, 1021, 1548, + 1538, 1547, 2136, 2672, 2139, 2673, 2674, 3567, 3134, 3568, + 3135, 1066, 2132, 1521, 3136, 1522, 2125, 2126, 2127, 2128, + 3128, 1536, 2122, 2145, 119, 922, 539, 1428, 1429, 2556, + 120, 620, 121, 1413, 2003, 2004, 2541, 3024, 2542, 122, + 980, 981, 123, 897, 2705, 2525, 1938, 1126, 1939, 1989, + 900, 1387, 901, 902, 1402, 1396, 1405, 1399, 4285, 4096, + 4097, 2529, 1946, 1984, 2066, 3016, 3823, 1985, 1976, 2519, + 2520, 3825, 4099, 3475, 4292, 4293, 124, 155, 125, 4725, + 542, 705, 1177, 1498, 126, 127, 128, 129, 1501, 1632, + 2612, 1633, 1634, 1635, 1636, 2206, 2073, 1887, 1888, 3443, + 1295, 1296, 2464, 2969, 2970, 1006, 1105, 1659, 1650, 143, + 144, 145, 146, 1147, 1148, 3291, 3710, 4010, 4238, 4239, + 4423, 4569, 1652, 3165, 4624, 4849, 4873, 1653, 1654, 1655, + 3579, 4329, 4622, 4791, 4848, 1656, 3164, 3901, 4503, 4726, + 130, 1091, 631, 1630, 1625, 1627, 2203, 2700, 131, 132, + 133 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -4769,891 +4778,899 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 532, 154, 677, 1062, 681, 1019, 1058, 1096, 1672, 568, - 1532, 1535, 563, 1440, 562, 1502, 1849, 2080, 570, 2340, - 1781, 1549, 1969, 1826, 583, 530, 1567, 78, 1875, 947, - 586, 591, 2087, 668, 157, 1024, 962, 1125, 599, 947, - 2086, 602, 2282, 1124, 2016, 1440, 599, 1744, 1597, 2813, - 2645, 2646, 1103, 622, 2814, 1104, 2137, 1239, 855, 856, - 2279, 1874, 860, 861, 862, 899, 1459, 864, 865, 866, - 843, 600, 3169, 3061, 1677, 1190, 1907, 1908, 3255, 3435, - 1911, 1912, 1913, 1914, 2904, 1916, 1917, 1919, 1921, 1922, - 1923, 1924, 1925, 1943, 656, 3192, 2911, 1968, 2541, 982, - 2999, 1678, 1897, 657, 3641, 1435, 1436, 3192, 3192, 2210, - 1905, 3534, 2199, 3523, 898, 3334, 1069, 3888, 1619, 1076, - 1168, 1790, 3702, 1172, 2018, 2035, 2973, 2224, 2748, 660, - 2749, 532, 2169, 532, 667, 673, 2602, 2509, 3551, 2650, - 3858, 2803, 2912, 3553, 1563, 3181, 3212, 2246, 898, 1351, - 3149, 678, 2182, 3804, 682, 683, 662, 3877, 664, 3544, - 2185, 2186, 2872, 2873, 684, 4110, 3805, 685, 3220, 1598, - 3716, 4150, 3224, 3642, 4238, 3093, 1300, 1301, 4274, 1291, - 1292, 1293, 1409, 3239, 3102, 1300, 1301, 3259, 4009, 3767, - 3753, 1334, 2499, 1701, 3010, 3250, 2329, 2251, 3814, 2030, - 4219, 3364, 3425, 2869, 4500, 2870, 704, 1300, 1301, 1651, - 1660, 4843, 2639, 1300, 1301, 1300, 1301, 2041, 1084, 1751, - 1752, 1753, 1300, 1301, 2969, 3192, 3192, 577, 1084, 4202, - -2590, -2591, 2862, 4321, 1599, 1403, 1771, 614, 1300, 1301, - 1986, 1718, 4038, 581, 3916, 2024, 1300, 1301, 3359, 3360, - 4081, 590, 2318, 1698, 3366, 2469, 3368, 4039, 2576, 1300, - 1301, 2744, 2451, 3939, 4741, 3605, 1552, 3204, 3205, 1835, - 4447, 4040, 1839, 1335, 3605, 3331, 1300, 1301, 3001, 3289, - 3921, 1593, 1028, 1009, -2745, 4765, 3603, 4038, -484, 905, - 1173, 2129, 917, 1858, 1859, 2551, 3619, 1863, 3559, 2067, - 3936, 1117, 3387, 2751, -2104, 2624, 2474, 1613, 1420, 2784, - 4665, 4177, 2660, 3781, 1877, 1878, 3209, 1674, 3426, 3817, - 3692, 4666, 4868, -2672, 1940, -1616, 1335, 1028, 1009, 1424, - 1300, 1301, 1524, 1628, 1070, 3831, 4713, 1300, 1301, 4827, - 2119, 1300, 1301, 3160, -2590, -2591, 1622, 964, -937, 578, - 1674, 3269, 291, 3931, 293, 4518, 2238, 2787, 1432, 2443, - 1723, 3831, 680, 2130, 968, 1338, 1674, 3082, 2120, 1747, - 1300, 1301, -2507, 947, 947, 2731, 1356, 947, 1300, 1301, - 1747, -580, 3743, 4501, 574, 3340, 3341, 3050, 618, 4173, - 4108, 1511, 954, -2745, 1300, 1301, 2192, -581, 611, 1218, - 1085, 1086, 1175, 1568, 3606, 2428, 2356, 156, 4164, 947, - 1085, 1086, 2242, 3536, 2613, 4328, 4478, 3511, 3406, 2521, - 3346, 2702, 3208, 537, 2477, 4038, 538, 2248, 3895, 3470, - 2711, 3235, 2552, 1300, 1301, 1317, 1774, 2280, 3101, 2470, - 4039, 4082, 3798, 950, 1300, 1301, 3800, 2522, 4649, 2495, - 4479, 1572, 3896, 2712, 4040, 1987, 1569, 2522, 2953, 896, - 2281, 1945, 1578, 4140, 908, 1028, 1009, 537, 4334, 3549, - 538, 1409, 3518, 3141, 3537, 2280, 2335, 2193, 969, 4242, - 1512, 1724, 1176, 3083, 2954, 1725, 1719, 3700, 575, 701, - 2252, 1219, 619, 896, 1815, 1477, 1726, 1816, 2281, 1775, - 1400, 3693, 1748, 2577, 2025, 1977, 1453, 965, 3528, 3529, - 3530, 2239, 1789, 1770, 2068, 2201, 2452, 4869, 1433, 2112, - 1665, 2522, 1666, 1667, 1668, 1669, 1525, 1239, 1776, 2121, - 3332, 4133, 1118, 1071, 1425, 1629, 3270, 2133, 4667, 673, - 4134, 4713, 691, 3425, 1302, 4357, -2507, 1303, 4160, 4448, - 673, 4165, 4166, 3832, 3599, 970, 1592, 4828, 2598, 1119, - 667, 903, 1300, 1301, 1614, 667, 699, 3277, 915, 2661, - 2131, 4170, 1151, 4141, 1337, 1302, 4742, 2776, 1303, 3832, - 1941, 1302, 958, 1302, 1303, 918, 1303, 1336, 907, 2625, - 1302, 1722, 1594, 1303, 667, 1988, -1576, 1174, 1777, 2500, - 3863, 2064, 1020, 1500, 3867, 916, 1302, 1714, 2499, 1303, - 947, 2748, 1078, 2749, 1302, 959, 4761, 1303, 1553, 2648, - 156, 3782, 3922, 3843, 3607, 1300, 1301, 1302, 1727, 1677, - 1303, 1320, 1100, 1937, 1300, 1301, 2553, -1576, 3695, 4284, - 1336, 2118, 699, 1421, 1302, 699, 3614, 1303, 3427, 1079, - 906, 3237, 2471, 3192, 1988, 667, 1678, 1130, 4181, 3426, - 3590, 3872, 4306, 4740, 2026, 1300, 1301, 955, 2472, 3333, - 1970, 4743, 3290, 667, 1158, 2479, 1910, 1778, 4135, 1943, - 2803, 2164, 2578, 657, 2167, 1161, 2482, 3603, 2170, 2485, - 2173, 2872, 2873, 1931, 657, -2590, -2591, 657, 1302, 3924, - 1130, 1303, 1602, 4744, 1969, 1302, 2246, 1185, 1303, 1302, - 3192, 3002, 1303, 1720, 4712, 3932, 3933, 1720, 2188, 2189, - 2190, 1758, 1759, -1912, 2747, 4844, 1728, 615, 4085, -2590, - -2591, 4314, 2869, 3436, 2870, 1300, 1301, 3092, 1302, 2687, - 1404, 1303, 3260, 1087, 2089, -1616, 1302, 579, 1814, 1303, - 3206, 4502, 703, 1279, 4331, 1350, 1827, 2251, 1829, 2042, - 1240, 2317, 1302, 984, 3011, 1303, 3342, 2218, 1300, 1301, - 1842, 1843, 1844, 867, 3012, 1947, 2349, 2184, 1848, 1968, - 2031, 4203, 3145, 4198, 1322, 1323, 3815, -484, 1981, 2329, - -2672, 4643, 4342, 4645, 4646, 948, 1720, 1440, 1304, 2868, - 2242, 1302, 3560, 4497, 1303, 3608, 1410, 1304, 2476, 1300, - 1301, 3261, 1302, 3717, 4041, 1303, 2444, 4239, 3853, 3356, - 4292, 1297, -2672, 1299, -1616, 3753, 1300, 1301, 3207, 1304, - 3428, 1333, 1080, 1300, 1301, 1304, 2881, 1304, 4313, 4301, - 2027, 1300, 1301, 2563, 1304, 1720, 1644, -937, 1342, 532, - 1344, 2465, 1346, 1130, 532, 2348, 667, 4172, 532, 4041, - 1304, 3194, 2402, 2429, 1385, 2028, 2406, 2373, 1304, 4436, - 3739, 2065, 1300, 1301, 1343, 1958, 2357, 1124, 3407, 1348, - -580, 1304, -1616, 1353, 3601, 2049, 2360, 1349, 612, 3028, - 2430, 1354, 1300, 1301, 1779, -1912, -581, 898, 1304, 3740, - 2453, 1414, 3027, 3542, 3543, 4125, 1533, 1427, 1537, 4733, - 4734, 1540, 1545, 4737, 4650, 1573, 657, 2374, 1431, 3104, - 4128, 154, 1437, 4116, 4117, 1940, 1579, 1566, 3142, 4142, - 1302, 3449, 3850, 1303, 1401, 1325, 1326, 1327, 1328, 1329, - 1330, 1331, 1332, 1817, -208, 1462, 1818, 1300, 1301, 1534, - 2168, 1472, 1304, 667, 657, 2961, 1124, 1720, 3856, 1304, - 657, 3855, 613, 1304, 1780, 1649, 1649, 2152, 681, 1141, - 2364, 2247, 2242, 3909, 3349, 156, 3351, 1882, 1883, 2058, - 4751, 1882, 2393, 1455, 3501, 3009, 2248, 1300, 1301, 3427, - 4532, 3603, 1304, 1302, 3603, 3603, 1303, 4041, 1300, 1301, - 1304, 1020, 1302, 3061, 4789, 1303, 4174, 667, -1576, 667, - 2432, 2433, 667, 667, -1711, 2500, 1304, 3165, 2449, 2450, - 2334, 4216, 4338, 2113, 4606, 1981, 4607, 3885, 667, 4307, - 158, 1300, 1301, 1302, 2978, 2979, 1303, 3914, 1645, 1552, - 536, 3318, 3576, 2123, 3438, 1300, 1301, 1603, 4786, 2576, - 2252, 1300, 1301, 1300, 1301, 1304, 2213, 2214, 710, 3356, - 3928, 3434, 2813, 3364, 987, 1885, 1304, 2814, 2217, 2335, - 4308, 657, 898, 2748, 2347, 2749, 2226, 2090, 3472, 2875, - 4293, 1378, 699, 3212, 699, 2365, -1616, 4263, 541, 3862, - 4294, 48, 1179, 3866, 1747, 1410, 1641, 1940, 1055, 1640, - 3238, -2666, 2251, 1302, 3239, 2251, 1303, 2267, 4269, 4500, - 1673, 4047, 1142, 1664, 4632, 2656, 711, 2544, 682, 683, - 4050, 3746, -2649, 2400, 3134, 1693, 2632, 2074, 684, 1642, - 1643, 685, 1300, 1301, 657, 584, 1302, 2090, 3644, 1303, - 4796, 1300, 1301, 532, 3770, 3526, 657, 2087, 3546, 2087, - 2087, 2571, 2572, 2224, 2803, 3562, -2653, 3088, 3089, 2926, - -2652, 947, 1677, 3577, 3538, 657, 1738, 2583, 1697, 2683, - 2872, 2873, 2513, 1465, -2134, 1740, 2509, 1302, 2394, 4674, - 1303, 1941, 1604, 1747, 1304, 4033, 3166, 3135, 4533, 1678, - 898, 1892, 2246, 1926, 1302, 2699, -2650, 1303, 3155, 3859, - 988, 1302, 3384, 3385, 1303, -2651, 1605, 2747, 2883, 1302, - 543, 2869, 1303, 2870, 3645, 1240, 2730, 2124, 1300, 1301, - -2656, 14, 4758, 3746, 1300, 1301, 4411, 1834, 1930, 2490, - 1240, 1300, 1301, 1300, 1301, 3603, 1886, 2491, 3199, 3473, - 1302, 3046, 896, 1303, 3146, 1347, 1528, 1304, 2091, 712, - 134, 3033, 2092, 1646, 4186, 4187, 1304, 291, 746, 293, - 1302, 3364, 63, 1303, 3364, 3364, 2367, 1300, 1301, 2977, - 1055, 2982, 2983, 1971, 3391, 3392, 3722, 4339, 2514, 1876, - 2681, 3364, 148, 3747, 564, 2484, 3136, 1304, 4501, 2242, - 1528, 4534, 667, 2686, 2577, 4212, 2689, 2690, 3723, 3364, - 4217, 4220, 4222, 4223, 4295, 2366, 4188, 1902, 2091, 4189, - 1701, 544, 1300, 1301, 3646, 1302, 1838, 2242, 1303, 4081, - 2242, 751, 3042, 2329, -2134, 1300, 1301, 156, 2868, 667, - 1875, 27, 1300, 1301, 1934, 1211, 1212, 3315, 4336, 4208, - 4209, 4210, 3320, 667, -2134, 3578, 2040, 4213, 667, 657, - 3328, 3329, 1970, 1941, 4224, 1302, 3336, 1304, 1303, 588, - 1146, 4746, 3748, 2090, 2075, 3137, 1302, 149, 2502, 1303, - 3348, 136, 2976, 1240, 667, 3408, 3409, 4797, 1133, 3487, - 3547, 607, 2986, -2666, 1505, 3747, 4459, 4259, 2743, 4660, - 1304, 1553, 667, 1300, 1301, 2252, 1529, 4412, 2252, 1302, - 667, 699, 1303, 1472, -2649, 1999, 4460, 2002, 3446, 3447, - 1282, 1927, 657, 1302, 1940, 1647, 1303, 896, 709, 1302, - 765, 1302, 1303, 3709, 1303, 3621, 4690, 4691, 2020, 863, - 3685, 1304, 1134, 4889, 1928, 1300, 1301, 1875, -2653, 657, - 1529, 4309, -2652, 3742, 616, 1940, 3167, 667, 1304, 2008, - 2370, 3651, 3652, 1472, 3579, 1304, -2793, 1300, 1301, 657, - 3725, 2505, 657, 1304, 3751, 4573, 4729, 2371, 2575, 2159, - 3153, 1394, 2248, 2578, 2372, 1961, 1300, 1301, -2650, 545, - 1300, 1301, 2379, 4296, 3478, 3479, 3480, -2651, 667, 667, - 1300, 1301, 2070, 988, 1304, 1300, 1301, 1747, 1190, 781, - 1302, 2088, -2656, 1303, 1723, 699, 2215, 632, 2071, 1302, - 4082, 2109, 1303, 2380, 1304, 1300, 1301, 4703, 667, 2114, - 1608, -2286, 4345, 1135, 4347, 1720, 1300, 1301, 667, 2160, - 2247, 4175, 3022, 2386, 2091, 896, 4841, 4842, 2092, 42, - 2134, 1020, 635, 4446, 4572, 2156, -1939, 2158, 4133, 3612, - 3612, 532, 532, 532, 657, 532, 657, 4134, 2219, 2667, - 4773, 2603, 4638, 4704, 4404, 2165, 532, 4406, 667, 1304, - 48, 636, 532, 3710, 2394, 2228, 2153, 2154, 2155, 3749, - 2157, 4067, 3138, 2265, 2183, 911, 1302, 1055, 2391, 1303, - -2311, 2166, 1302, 657, 658, 1303, 1467, 2172, 1929, 1302, - 1609, 1302, 1303, 2335, 1303, 2998, 638, 2171, 2875, 1304, - 898, 4617, 2087, 2334, 4083, 1271, 4526, 4527, 1055, 2583, - 1304, -2431, 2704, 2874, 661, 1724, 2708, 2709, 2392, 1725, - 1862, 2717, 2718, 1898, 4618, 1302, 667, 667, 1303, 2396, - 1726, 2072, 4337, 1448, 2695, 663, 1449, 947, 2729, 136, - 2149, 2150, 4528, 1304, 2223, 1677, -1939, 2741, 2742, 667, - 2220, 2221, 2222, 657, 3128, 3339, 3887, 1304, 4367, 2747, - 1941, -2286, 2408, 1304, 912, 1304, 667, 1300, 1301, -1219, - 1302, 3749, 1678, 1303, 679, 1275, 2415, 58, 4500, 4705, - 2277, -2286, 2419, 1302, 2420, 4135, 1303, 3293, 2275, 657, - 1302, 1941, 2266, 1303, 4521, 4344, 4575, 1272, 4763, 1300, - 1301, 4767, 1945, 1969, 657, 1621, 810, 2161, 2250, 1681, - 687, 3548, 1300, 1301, 3623, 3622, 3184, 3624, 2857, 2858, - 2859, 2860, 1300, 1301, 3635, 1185, 1136, 2346, 3639, 3640, - -2311, 63, 3350, 1300, 1301, 913, 2585, 2586, 3648, 2490, - 3653, 1300, 1301, -2745, 1304, 3659, 3661, 3556, 3119, 3294, - -2311, 1302, 4634, 1304, 1303, 4258, 3122, 4368, 3678, 3680, - 3682, -2431, 1727, 2422, 3683, 3661, 3923, 1276, 1440, 3445, - 4084, 691, 2423, 601, 3700, 4576, 4204, 3123, 1968, 4205, - 3517, -2431, 2486, 1450, 1300, 1301, 1511, 4085, 1875, -1712, - 1300, 1301, 1137, 1302, 1138, 2322, 1303, 2868, 704, 4369, - 3937, 152, 153, 3287, 3731, 3734, 3737, 1899, 692, 1300, - 1301, 3941, 4515, 3124, 3943, 1302, 1240, 2401, 1303, 2628, - 706, 3514, 4832, 1317, 2981, 2528, 291, 2529, 293, 3027, - 1304, 291, 2503, 293, 1302, 3185, 1304, 1303, 1302, 1300, - 1301, 1303, 2359, 1304, 3506, 1304, 1300, 1301, 1302, 2427, - 707, 1303, -2745, 1302, -1939, 2445, 1303, 4501, 1300, 1301, - 1728, 4722, 3389, 2583, 3390, 1300, 1301, 1300, 1301, 1300, - 1301, 2584, 2038, 1302, 853, 1512, 1303, 2468, 4086, 1304, - 2562, 2984, 688, 2908, 1302, -1939, 537, 1303, 2913, 538, - 537, 1981, 2361, 538, 1981, 1317, 1657, 3302, 3401, 1300, - 1301, 857, 2920, 1300, 1301, 2607, 2608, 2609, 1300, 1301, - 3192, 2493, 859, 1300, 1301, 1300, 1301, 2039, 596, 2492, - 657, 3837, 1300, 1301, 1304, 3802, 596, 1300, 1301, 1300, - 1301, 3612, 657, 667, 1300, 1301, 2935, 1304, 1300, 1301, - 589, 2362, 1337, 3411, 1304, 896, 657, 3192, 3192, 3713, - 870, 1385, 1463, 904, 2242, 2381, 1385, 2629, 920, 2516, - 2618, 2525, 2525, 3412, 2525, 3714, 3838, 4720, 4721, 951, - 2526, 2526, 3073, 2526, 2630, 953, 3023, 699, 1124, 947, - 3873, 3874, 1300, 1301, 2995, 1875, 2631, 3192, 2549, 973, - 2585, 2586, 1427, 962, 667, 947, 947, 657, 2655, 152, - 153, 657, -1939, 2992, 4320, 1304, 2247, 3875, 1300, 1301, - 1317, 3238, 147, 4324, 1300, 1301, 1300, 1301, 3657, 1320, - 1900, 1462, 2574, 975, 4061, 1300, 1301, 1068, 667, 667, - 657, 657, 657, 898, 2587, 1302, 1901, 1075, 1303, 1300, - 1301, 965, 2525, 2525, 2525, 1240, 667, 1304, 1300, 1301, - 1097, 2526, 2526, 2526, 1300, 1301, -1939, 1098, -1826, 1019, - 1109, 667, 2570, 3882, 1099, 2382, 2006, 1302, 2632, 1304, - 1303, 1690, 1691, 2323, 1101, 2638, 2627, 2875, 1111, 1940, - 1302, 2363, 1337, 1303, 657, -1826, 1502, 2390, 1304, 1024, - 1302, 1320, 1304, 1303, 1020, 1112, 1440, 148, 1113, 667, - 1114, 1302, 1304, 907, 1303, 1121, 2404, 1304, -1826, 1302, - 2405, 1646, 1303, 1140, 2341, 1146, 1020, 1735, 1149, 3209, - 2409, 3565, 1300, 1301, 1612, 2413, 3930, 1304, 1300, 1301, - 1617, 1618, 947, 3744, 1159, -1826, 2679, 2334, 1304, 1163, - 3572, 2882, 2874, 1167, 3860, 2414, 3508, 3219, 1180, 2324, - 3222, 3223, 1302, 3225, 1187, 1303, 3228, 3229, 1302, 2688, - 3232, 1303, 3772, 3773, 1188, 3241, 1189, 2673, 657, 2676, - 3245, 3246, 3247, 3248, 3249, 1028, 1009, 1302, 3253, 3254, - 1303, 3256, 149, 2633, 2680, 3787, 2225, 3265, 3266, 3267, - 3268, 1191, 3053, 3272, 3273, 1192, 3275, 2706, 532, 2945, - 1193, 532, 3494, 3494, 3494, 3494, 1320, 1302, 1300, 1301, - 1303, 1337, 1300, 1301, 1302, 1196, 4048, 1303, 1146, 3795, - 1300, 1301, 1197, 2707, 1300, 1301, 1302, 1198, 4038, 1303, - 1199, 1300, 1301, 1302, 3235, 1302, 1303, 1302, 1303, 1340, - 1303, 1200, 2817, 4039, 1533, 1092, 1093, 3567, 1094, 2720, - 1095, 657, 1055, 657, 1875, 2634, 1533, 4040, 2727, 2728, - 3344, 947, 3669, 3310, 3670, 1201, 947, 1302, 1028, 4196, - 1303, 1302, 1202, 1647, 1303, 1087, 1302, 1203, 2280, 1303, - 2229, 1302, 1204, 1302, 1303, 1205, 1303, 1206, 1251, 1304, - 1302, 1300, 1301, 1303, 2230, 1302, 1341, 1302, 1303, 1207, - 1303, 2281, 1302, 1875, 2325, 1303, 1302, 2418, 3671, 1303, - 1270, 1208, 1300, 1301, -2793, 1209, 1300, 1301, 1213, 3373, - 1215, 1304, 2877, 1283, 1284, 2880, 1216, 1329, 1330, 1331, - 1332, 3672, 2368, 2369, 1304, 1941, 3153, 1300, 1301, 2421, - 1774, 2387, 1337, 1217, 1304, 667, 2395, 1337, 1220, 2974, - 1302, 1970, 2424, 1303, 1357, 1304, 1389, 667, 1978, 1322, - 1323, 1979, 2436, 1304, 1980, 1300, 1301, 3673, 3376, -1144, - 1556, 1221, -1144, 2455, 1774, 3540, 1302, 1317, 896, 1303, - 2997, 3353, 1302, 1440, 1302, 1303, 4581, 1303, 2397, 1337, - 1981, 1981, 1981, 1302, 2629, 993, 1303, 1327, 1328, 1329, - 1330, 1331, 1332, 1775, 4727, 1222, 1304, 1302, 4726, 1223, - 1303, 2630, 1304, 1224, 4190, 1225, 1302, 4193, 4194, 1303, - 1226, 4276, 1302, 3098, 3377, 1303, 1227, 3927, 1557, 1345, - 3383, 1304, 1776, 1228, 4206, 2398, 1832, 1775, 3236, 1390, - 2065, 2065, 2065, 1229, 1391, 1230, 1124, 1124, 1124, 3386, - 667, 1233, 4215, 1234, 3237, -1940, 2410, 1337, 1558, 1235, - 947, 1304, 2231, 1300, 1301, 3531, 3186, 1241, 1304, 1242, - 947, 947, 947, 947, 2947, 2993, 291, 1243, 293, 667, - 1304, 667, 667, 2411, 1337, 2251, 3393, 1304, 1392, 1304, - 1302, 1304, 3444, 1303, 1055, 2949, 1302, 3079, 3397, 1303, - 1244, 3845, 1777, 667, 1393, 3398, 667, 3399, 1386, 3400, - 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 3731, 1388, - 3734, 1304, 3737, 3574, 1245, 1304, 4277, 4278, 994, 1124, - 1304, 4279, 4280, 4281, 3879, 1304, 3187, 1304, 2232, 3402, - 1246, 2322, 1395, 3405, 1304, 3040, 2087, 3883, 3410, 1304, - 1247, 1304, 1406, 3413, 4255, 3415, 1304, 2251, 2412, 1337, - 1304, 1398, 3417, 2233, 1248, -1940, 4268, 3419, 624, 3420, - 3674, 3066, 1249, 1320, 3421, 3069, 1302, 1875, 3792, 1303, - 1302, 1778, 4790, 1303, 2416, 1337, 2963, 1337, 1302, 667, - 667, 1303, 1302, 3350, 1252, 1303, 3007, 3008, 667, 1302, - 2655, 1533, 1303, 1253, 1304, 995, 2088, 1254, 2088, 2088, - 3514, 1255, 3604, 2322, 3675, 3188, 3611, 3633, 1256, 625, - 3099, 2874, 3793, -1912, 1257, 2322, 2234, 3634, 1258, 3115, - 1304, 3117, 4487, 4488, 4822, 667, 1304, 4824, 1304, 1259, - 3643, 2864, 3202, 3203, 3372, 2369, 1260, 1304, 3794, 3375, - 1337, 3403, 1337, 3755, 4056, 2892, 1020, 1261, 4058, 1302, - 1262, 1304, 1303, 3520, 3521, 3114, 78, 3524, 3525, 4840, - 1304, 1875, 2229, 1559, 1028, 1009, 1304, 1263, 1876, 4060, - 1302, 2893, 1264, 1303, 1302, 1265, 2230, 1303, 3158, 3171, - 3172, 1266, 2634, 532, 4066, 626, 3807, 1337, 657, 657, - 2242, 667, 667, 1267, 3657, 1302, 1268, -1912, 1303, 3756, - 1269, 4816, 3757, 2864, 3825, 3826, 3840, 3841, 3163, 1273, - 3758, 1316, 2235, 4580, -687, 1274, 1322, 1323, 1277, -2720, - 4025, 4026, 4383, 1302, 1278, 3637, 1303, 2894, 3759, 1281, - 2895, 1285, 1409, 1286, 1304, 4027, 4028, 947, 2896, 1287, - 1304, 4383, 3195, 3196, 3197, 3198, 1288, 3200, 3201, 4029, - 4030, 1407, 4068, 4036, 4045, 1289, 2897, 1397, 4069, 4443, - 4444, 4445, 2242, -1940, 2888, 993, 1290, 4384, 2252, 1339, - 3271, 4062, 1337, 3760, 2242, 4076, 1337, 4385, 4231, 4195, - 4200, 4093, 4094, 4201, 1408, 3286, 4384, 1415, 1779, 1417, - 4041, 1419, 4356, 1423, -1940, 1580, 4385, 3300, 1441, 4227, - 4228, 3309, 4211, 1560, 4329, 4330, 1456, 4491, 4218, 2323, - 4197, 3991, 4890, 4333, 4330, 1940, 1444, -1616, 4417, 4418, - 1304, 1446, 3189, 1317, 1304, 1561, 4386, 1581, 1474, 2486, - 1476, 3761, 1304, 719, 4486, 3525, 1304, 1492, 4070, 1494, - 2252, 1495, 4071, 1304, 2231, 4386, 3316, 3317, 1496, 3319, - 4341, 3321, 3322, 3323, 3324, 3325, 3326, 3327, 4747, 2898, - 3330, 4437, 1497, 3335, 1500, 4261, 1562, 3338, 1326, 1327, - 1328, 1329, 1330, 1331, 1332, -1616, 1504, 3355, 4499, 4330, - 1582, 2323, 134, 2065, 1505, 1583, 3474, 1940, 1509, 1124, - 1514, 996, 997, 2323, 999, 3780, 1001, 1523, 994, 1940, - 4387, 2296, 2297, 1304, 4530, 4531, 1546, -1616, 2732, -1616, - 1550, -1940, 1551, 1002, 1555, 1317, 4350, 2310, 4538, 4539, - 2232, 3497, 3498, 746, 1304, 291, -1616, 293, 1304, 1318, - 1574, -1616, 1575, 3762, 2592, 1576, 3763, 627, 4540, 4539, - 1019, 1577, 152, 153, 291, 2233, 293, 1596, -1616, 1304, - 3808, 1600, 1319, 2618, 1601, -1616, 1606, -856, 1615, 628, - 4583, 4584, -1616, 1616, 2899, -1940, 1623, 1865, 1866, 2324, - 1024, 1624, -1616, 4639, 3841, 995, -856, 1304, 1626, 750, - 1385, 1631, 2516, 1638, -1616, 135, 751, 667, 1055, -1616, - 3486, 1414, 667, 667, 667, 629, 1674, 2593, -1616, 657, - 1680, 3915, 1682, 136, 3918, 3919, 3492, 1684, 2234, 4356, - 4671, 4672, 4377, 3764, 1317, 756, 757, 2733, 1687, 1320, - 1688, 4381, 3040, 667, 4701, 3525, 2594, 3042, 1692, 1876, - 4403, 4702, 3525, 4719, 3203, 4405, 1695, 1584, 1704, 152, - 153, 1696, 2592, -2788, 1240, 3658, 2312, 2313, 667, 667, - 667, 4736, 4330, 1705, 667, 630, 1706, 152, 153, 1715, - 1055, 2088, 1732, 4388, 4374, 4675, -1616, 4738, 4330, 1733, - 4389, 1941, 1055, 137, 4739, 4330, 152, 153, 1743, 4374, - 4771, 4772, 4388, 1741, 1795, 765, 3555, 1335, -1616, 4389, - 4787, 4330, 2628, 1747, 4788, 4330, 2595, 3148, -1616, 2296, - 2297, 4791, 4330, 1754, 2235, 2593, 3345, 4724, 1773, 2900, - 4390, 1320, 1585, 1784, 2997, 2310, 1321, 4794, 3841, 1820, - 2417, 1831, 3554, 1832, 2325, 4517, 4805, 4806, 1833, 4390, - -1616, 667, 1478, 1909, 2594, 3585, 532, 1856, 3588, 4823, - 4330, 1873, 1479, 1941, 657, 4837, 3727, 657, 3286, 776, - 1884, 3765, 4879, 4880, 1893, 1941, 1480, 138, 1440, 4543, - 1915, 3582, -679, 780, 781, 3819, 3820, 1935, 1481, 1482, - 1483, 1936, 1322, 1323, 1875, 2596, 1586, 3209, 1944, 2901, - 3766, -1616, 1949, 4391, 3286, 2734, 1799, 1484, 1324, 3210, - 2861, 1956, 3620, 3618, 3286, 1952, 2735, 1953, 3630, 1954, - 3629, 1960, 4391, 2736, 2595, -1616, 1955, 4579, 2902, 1957, - 1320, 4091, 4092, 1959, 1972, 667, 3629, 1973, 1975, 1974, - 2005, 3650, 3654, 1774, 2592, 2009, 1876, 3666, 3665, 2014, - 2629, 1317, 2017, 2019, 3667, 3668, 657, 2022, 3631, 3632, - 4439, 4582, -679, 1307, 2312, 2313, 1774, 2630, 3629, 4095, - 2023, 2036, 947, -1616, 2044, 3286, 3691, 3209, 2045, 2631, - 2047, 3704, 2046, -2482, 1322, 1323, 3664, 2056, 2053, 3210, - 2060, 996, 997, 998, 999, 1000, 1001, 2061, 3629, 2062, - 1308, 1317, 2063, 2596, 2104, 2102, 1775, 2593, 139, 2105, - 1800, 4392, -679, 1002, 1803, 1587, 2106, 3703, 640, 1525, - 2110, 1804, 2737, 4159, 2592, 2115, 2138, 3660, -1616, 1775, - 4392, 2146, 2147, 1440, 2174, 1776, 2594, 3738, 2151, -1616, - -1616, 3741, 595, 1325, 1326, 1327, 1328, 1329, 1330, 1331, - 1332, 2175, 1309, 2176, 1588, 2177, 2280, 3394, 3186, 2179, - -1616, 2632, -1616, 2180, 1310, 4599, 4600, 2181, 4602, 1409, - 2197, 4651, 2202, 4653, 2211, 2207, 1410, 2216, 802, 2281, - 2227, 140, 4351, 1322, 1323, 4352, 2249, 2593, 2270, -1616, - -1616, 2284, -679, -1616, -1616, 2269, 808, 4554, 640, 2285, - 4692, 810, 1805, 2287, 811, 1777, 2595, 2288, 2336, 2320, - 2338, 2344, 2597, 2350, 2352, -2788, 2594, 2592, 2738, 1875, - 3677, 2353, 2354, 2376, 1533, 2377, 1485, 2378, 3187, 2385, - 2383, 4652, 2384, 2394, 2388, 3806, 2280, 1327, 1328, 1329, - 1330, 1331, 1332, 3115, 1486, 2399, 141, 1320, 2403, 2407, - 2425, 2426, 4579, 1311, -1616, 2434, 2431, 4375, 4376, 2281, - 1807, 4748, 2435, 4353, 4354, 2446, 2447, 2460, 4250, 2448, - 4379, 947, 2463, 2467, -1295, 2473, 2633, 4382, 1332, 3114, - 2593, 2495, 2483, 1218, 1778, 2596, 2595, -1441, 4407, 4408, - 2498, 2504, 1271, 4698, 3040, 4699, 4700, 1320, 2592, 4562, - 1275, 3679, -2127, 2520, 4631, 4569, 2550, 3188, 2556, 2594, - 2519, -2788, -1616, 1720, 2561, 3066, 3852, 2564, 2567, 3854, - 2597, 667, 2591, 2599, 4810, 667, 1533, 2604, 2592, 2605, - 2606, 3681, -679, 2611, 1325, 1326, 1327, 1328, 1329, 1330, - 1331, 1332, 947, 2622, 2623, 1502, -1616, 2637, 2634, 3454, - 2993, 639, 2641, 2643, 2649, 2647, 2651, 1020, 1020, 3455, - 2659, 2593, 2657, -1616, 1876, 2596, 2530, 2658, -1616, 3892, - 2662, 2663, 2664, 3456, 3903, 1487, 4677, 2628, 2665, 2595, - 2531, 2666, 2674, 657, 2691, 3457, 3458, 3459, 2682, 2678, - 2594, 2593, -1616, 4810, 2694, 3910, 3211, 2692, 3884, -1616, - 1322, 1323, 1808, 2697, 3460, 3917, 2696, 2522, 1875, -1616, - 2628, 2714, -679, 3920, 3629, 2715, 2719, 3286, 1810, 1875, - 2594, -1616, 2721, 1875, 2722, 2726, -1616, 667, 1875, 2818, - 642, 3629, 2723, 3286, 3286, -1616, 2724, 1488, 640, 2822, - 2823, 4875, 2532, 2725, 2533, 2827, 2832, 3286, 3629, 2829, - 1322, 1323, 4883, 2833, 1489, 2834, 4875, 872, 2596, 3629, - 2595, 4883, 3629, 2835, 3929, 2856, 2836, 2863, 4505, 2837, - 2838, 2839, 4512, 3935, 2840, 2841, -886, 2878, 2855, 2842, - 3947, 2843, 2754, 2844, 2755, 4472, 3946, 2845, 2882, 657, - 2595, 2846, 2847, 2848, 4001, 2849, 2850, 947, 2851, 4002, - 2891, 1779, 2597, -1616, 2852, 2853, 532, 2854, 2915, 2916, - 642, 2972, 2886, -679, 4017, 2629, -826, -826, 3005, 2757, - 3014, 3309, 2914, 2491, 3189, -1616, 2990, -826, 2927, 2928, - 2940, 4010, 2630, 2962, 2971, -1616, 2534, 2760, 2980, 2596, - 1312, 1313, 1314, 2989, 2631, 2761, 3006, 873, 2629, 4860, - 3018, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 3016, - 3019, 3020, 3017, 3025, 3029, 2630, 3030, -1616, 3031, 2596, - 3043, 3047, 2763, 3044, 3049, 2031, 3048, 2631, 3056, 875, - 4461, 3071, 2597, 3070, 3074, 3075, 1674, 4557, 4462, 2764, - 3076, 2535, 4145, -679, 876, 3087, 3080, 3094, 3081, 4783, - 3095, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 3096, - 3108, 3109, 3120, 3111, 3121, 4463, 1990, 2123, -1616, 2769, - 1991, 2124, 3130, 3461, 3143, 3157, 2632, 3156, 4099, 3159, - 3164, 3170, 1992, 4104, 3182, 3183, 3209, 3221, 1876, 3226, - 548, 3462, -1616, 4505, 3227, 3231, 4080, 3230, 4114, 3233, - 4512, 3234, 3240, 3242, 3243, 880, 3244, 3251, 3252, 2632, - 1359, 3257, -1912, 947, 4472, 3258, 3263, 4587, 4588, 947, - 3264, 4591, 4592, 4593, 4594, 2597, 3274, 3291, 3303, 3304, - 4886, 4118, 3343, 881, 3312, 291, 3313, 293, 3314, 882, - -1616, 3347, 2345, 667, 2773, 4149, 4149, 3367, 549, 3356, - 3286, 2774, 3361, 3369, 3370, 3422, 641, 4625, 3371, 4161, - 3453, 3378, 3286, 3286, 3379, 3475, 2775, 3432, 3286, 3433, - 3629, 4852, 3481, 4132, 3286, 3437, 3441, -143, 550, 883, - 3443, 3448, 1876, 3451, 3476, 1533, 3629, 4464, 657, 3483, - 3488, 2633, 3499, 1448, 3503, -1616, 4867, 3500, 3509, 3510, - 642, 3516, 3527, 3519, 3463, 3522, 2597, -1616, 3541, 4287, - 3545, 988, 1360, 3557, 3558, 551, 3561, 3568, 3569, 3570, - 3573, 3584, 3464, 2777, 2633, 3581, 3160, -1616, 2784, -1616, - 3615, 3636, 3638, 3705, 3700, 3712, 2597, 3719, 1361, 3720, - 3724, 1362, 2778, 1410, -1750, 4688, 4689, 557, 3727, 3726, - 3752, 3775, 3771, 3776, 4697, 3783, -1616, -1616, 4237, 3784, - -1616, -1616, 552, 2634, 2452, 3796, 4465, 3427, 3810, 3811, - 2536, 2537, 2538, 3812, 3828, 2088, 3813, 3830, 1363, 3834, - 3836, 3842, 2583, 643, 3465, 4466, 667, 3864, 3865, 3844, - 3893, 644, 4233, 3898, 3901, 3899, 2634, 2782, 1364, 2783, - 3902, 3466, 3904, 3905, 291, 3906, 293, 2785, 4467, 3911, - 3912, 3913, 1993, 3926, 3934, 3938, 3945, 4004, 3944, 4005, - 4008, 4011, 4012, 4015, 4016, 3531, 4020, 4505, 4512, 4021, - 4022, 4024, 886, 4031, 4034, 4046, 4035, 4036, 4037, 4049, - 1994, 4051, 4053, 4063, 4064, 4054, 4065, 4055, 1995, 4074, - 4059, 4077, 4429, 4073, 4079, 4089, 4098, 4100, 4094, 4109, - 4111, 1365, 3556, 4129, 4121, 3069, -1528, 4126, 4144, 4155, - 4315, -1533, 4130, 4146, 3892, 4151, 4162, 4167, 889, 2791, - 4168, 4169, 4176, 3892, 4184, 1366, 4191, 4192, -69, 3289, - 4149, 890, 1996, 553, 4207, 4232, 4226, 4234, 4243, 4219, - 4260, 4266, 4045, 3286, 4265, 4267, 4270, 4271, 4272, 4273, - 4285, 4358, 2754, 947, 2755, 4286, 4290, 4299, 4289, 4359, - 657, 987, 4303, 4305, 4322, 4325, 4327, 4323, 4364, 4332, - 4365, 1300, 1301, 4362, 4495, 4216, 4378, 2792, 2793, 2794, - 4401, 4430, 4432, 1997, 2795, 554, -826, -826, 4434, 2757, - 4431, 4435, 4438, 4440, 4442, 4472, 4451, -826, 4454, 4473, - 2796, 4474, 4399, 2797, 4475, 4476, 555, 2760, 4483, 4492, - 4409, 4509, 4410, 893, 4529, 2761, 719, 4485, 4498, 4522, - 4535, 4546, 2798, 4524, 4547, 4427, 4525, 1055, 4548, 4426, - 1367, 4549, 4550, 4552, 4553, 894, 4555, 895, 4558, 1368, - 2800, 4571, 2763, 4468, 4570, 4586, 4589, 4560, 4590, 4595, - 4598, 4601, 4603, 4604, 1369, 4608, 1674, 4611, 4626, 2764, - 4633, 4452, 4637, 4640, 4656, 4663, 4641, 2655, 4644, 4647, - 657, 556, 1370, 4458, 4654, 947, 557, 1791, 1792, 1793, - 1794, 1795, 851, 4657, 4664, 1025, 4658, 4669, 4679, 2769, - 2776, 4682, 4676, 4694, -1699, 558, 2751, 4735, 1026, 4350, - 947, 4752, 3598, 4753, 4754, 4761, 746, 4774, 4775, 954, - 1027, 4779, 4776, 4782, 4149, 4777, 1371, 945, 4784, 1372, - 559, 4780, 4785, 4795, 4798, 4799, 4802, 945, 4800, 4801, - 4803, 3695, 4826, 4825, 1028, 1009, 560, 4830, 4833, 4836, - 4848, 4853, 4855, 4851, 1065, 4857, 1029, 4859, 4861, 1373, - 4864, 4865, 4876, 3000, 4885, 291, 3118, 293, 851, 3337, - 4253, 4251, 750, 4616, 2773, 4252, 1595, 3600, 667, 751, - 4326, 2774, 1030, 1442, 1031, 1658, 1032, 4615, 4718, 4820, - 1796, 1797, 1798, 1799, 4399, 4818, 2775, 4494, 1033, 4673, - 1686, 4245, 610, 1067, 2512, 2601, 3468, 4096, 756, 757, - 3173, 2831, 4563, 4567, 3493, 4542, 3036, 1166, 2263, 15, - 16, 3034, 4636, 3035, 1734, 2494, 4514, 3278, 2801, 3940, - 3502, 4102, 3507, 3835, 4681, 2034, 4453, 4760, 4850, 851, - 4105, 4813, 4835, 4597, 2701, 1876, -1912, 1034, 4335, 3690, - 3276, 1035, 4154, 2777, 1036, 3283, 3697, 4856, 4750, 3993, - 3768, 4199, 4225, 851, 4537, 4551, 4759, 4541, 851, 3180, - 4708, 4257, 2778, 3799, 3801, 3424, 3797, 3069, 765, 3069, - 4821, 648, 649, 1037, 4792, 1038, 4793, 4693, 4343, 4723, - 4635, 4630, 4380, 1039, 3689, 1040, 1620, 1800, 3280, 1801, - 1802, 1803, 4508, 3147, 1694, 4361, 851, 2821, 1804, 2198, - 4756, 3052, 4171, 291, 3485, 293, 4149, 950, 4149, 4149, - 3026, 1041, 1042, 851, 2573, 4648, 3829, 2782, 2970, 2783, - 4624, 2321, 2276, 3077, 4556, 1518, 4749, 2785, 3809, 1510, - 3450, 2644, 776, 1043, 2907, 1637, 3103, 2905, 4662, 1302, - 1830, 3861, 1303, 3100, 4610, 4489, 780, 781, 3439, 4814, - 4023, 4815, 4427, 1772, 4075, 1044, 4426, 851, 851, 851, - 851, 2987, 3803, 4179, 4318, 2204, 2205, 3535, 4458, 851, - 3684, 4574, 4817, 3533, 4661, 4316, 4317, 2876, 667, 1805, - 2997, 650, 2007, 2051, 1045, 3024, 3059, 4107, 3848, 4717, - 3886, 3847, 4757, 1081, 2343, 1186, 2684, 2163, 657, 2791, - 1061, 1064, 1670, 2685, 1377, 655, 4183, 4686, 4687, 3144, - 2506, 2059, 3833, 4849, 4858, 4731, 4477, 4605, 4884, 4887, - 1280, 4545, 3851, 3129, 4149, 4149, 3881, 1022, 4149, 4708, - 2108, 2466, 1023, 4819, 2669, 3126, 1806, 1807, 3127, 2069, - 2555, 983, 2209, 1493, 3015, 851, 3072, 4441, 4450, 3469, - 3708, 4730, 1046, 4812, 1998, 985, 4567, 2792, 2793, 2794, - 1876, 945, 945, 1499, 2795, 945, 1106, 1107, 1108, 0, - 2212, 0, 0, 1661, 0, 0, 1662, 0, 1047, 1663, - 2796, 667, 0, 2797, 0, 851, 0, 0, 0, 1048, - 1049, 0, 0, 1050, 1051, 0, 0, 945, 0, 0, - 0, 0, 2798, 0, 0, 0, 0, 0, 4768, 4769, - 0, 0, 0, 0, 1052, 0, 0, 0, 0, 4149, - 2800, 0, 0, 0, 0, 2291, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4888, 1791, 1792, 1793, 1794, - 1795, 802, 0, 0, 0, 4351, 0, 0, 4352, 0, - 0, 0, 0, 0, 667, 4878, 0, 0, 0, 808, - 3309, 3309, 1053, 0, 810, 0, 0, 811, 0, 0, - 0, 0, 0, 0, 0, 1054, 0, 0, 0, 1808, - 3174, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1304, 1809, 1810, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -2526, 0, - 0, 2292, 1055, 2293, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4353, 4354, 0, 0, - 1056, 0, 0, 0, 0, 0, 0, 0, 0, 1796, - 1797, 1798, 1799, 0, 0, 0, 0, 0, 0, 1876, - 0, 0, 0, 0, 0, 0, 667, 0, 0, 0, - 1876, 0, 0, 4854, 1876, 0, 0, 0, 0, 1876, - 0, 2294, 0, 2295, 2296, 2297, 2298, 2299, 0, 2300, - 2301, 2302, 2303, 2304, 2305, 2306, 2307, 2308, -2526, 2309, - 2310, 2311, 0, 0, 851, 0, 1057, 851, 945, 0, + 532, 154, 677, 1062, 681, 1096, 1672, 1019, 1058, 568, + 1440, 1502, 563, 1103, 562, 1875, 1104, 1781, 570, 2080, + 1826, 1567, 1024, 1874, 583, 962, 530, 1969, 1532, 1535, + 586, 591, 2340, 668, 157, 843, 78, 1124, 599, 1549, + 2087, 602, 1440, 1597, 1744, 1849, 599, 2815, 1125, 2647, + 2648, 855, 856, 622, 2086, 860, 861, 862, 2816, 1351, + 864, 865, 866, 1239, 1563, 1968, 2137, 947, 2906, 600, + 2016, 1190, 3001, 1897, 898, 1435, 1436, 947, 3527, 3064, + 2913, 1905, 1677, 2035, 3258, 2282, 3645, 2279, 1678, 1598, + 899, 3337, 2246, 2210, 656, 2543, 1459, 1619, 3438, 3538, + 3172, 3895, 2018, 657, 1943, 1907, 1908, 3706, 898, 1911, + 1912, 1913, 1914, 2511, 1916, 1917, 1919, 1921, 1922, 1923, + 1924, 1925, 1168, 2199, 982, 1172, 3555, 1790, 2224, 660, + 2975, 532, 2169, 532, 667, 673, 2805, 1069, 682, 2750, + 1076, 2329, 2652, 2914, 3557, 678, 2604, 683, 684, 3215, + 2751, 685, 2182, 3096, 3223, 3184, 4119, 662, 3227, 664, + 2185, 2186, 3105, 3646, 3152, 3809, 3720, 2874, 2875, 3242, + 3808, 4247, 1701, 3195, 3548, 1291, 1292, 1293, 4159, 3757, + 4284, 3253, 1300, 1301, 3821, 3195, 3195, 1334, 4016, 3771, + 3362, 3363, 3865, 3207, 3208, 1409, 3369, 4228, 3371, 3013, + 2251, 4045, 2030, 3262, 704, 2251, 1300, 1301, 1403, 3884, + 1300, 1301, 3428, -484, 2871, 4853, 4046, 14, 2864, 581, + 611, 1651, 1660, 1300, 1301, 2872, 4090, 590, 3563, 614, + 4047, 2615, 1674, 4045, 1674, 2971, 3349, 1300, 1301, 4211, + 2451, 1028, 1009, 2041, 4331, 1300, 1301, 1599, 3603, 1300, + 1301, 3334, 3053, 1300, 1301, 1534, 2641, 3367, 3004, 2024, + 1986, 4045, 2251, 3168, -937, 1698, -580, 1751, 1752, 1753, + 2318, 3292, 2499, 1028, 1009, 3609, 4046, 3928, 1552, 3943, + 4775, 1300, 1301, 1774, 1771, 1335, 3838, 1572, 2499, -1576, + 4047, 4528, 1300, 1301, 1300, 1301, 905, 917, 3785, 1674, + 2746, 1028, 1009, 3195, 3195, 2067, 1300, 1301, 2753, 4837, + 4457, 3343, 3344, 1117, 577, 3946, 4090, 1835, 2322, 2129, + 1839, 1335, 1613, 1300, 1301, 1173, -2678, 3607, 27, 3429, + -1576, -581, 4806, 4186, 1300, 1301, 1524, 3623, 680, -1616, + 1622, 1858, 1859, 1424, -1912, 1863, 1718, 1775, 1084, 1070, + -2110, 3390, 3696, 1300, 1301, 1300, 1301, 1885, 3838, 2238, + 3476, 4510, 1877, 1878, 3144, 3713, 1409, 1528, 1141, 1356, + 1179, 1747, 1747, 1338, 1084, 2733, 1776, 4117, 574, 1300, + 1301, 1300, 1301, 3747, 2089, 618, 2515, 543, 1218, 148, + 1747, 2130, 1300, 1301, 4045, 1747, 2192, 537, 1271, 3540, + 538, -1912, 4773, 1300, 1301, 4777, 3610, 2428, 2361, 4046, + 3296, 947, 947, 2356, 1568, 947, 2242, 3515, 4091, 2866, + 2477, 2242, 4488, 4047, 4338, 4182, 4659, 2523, 3902, 2443, + 2713, 4149, 3717, 3169, 1028, 4205, 2955, 578, 2248, 156, + 1578, 156, 4330, 950, 1300, 1301, 1777, 947, 3718, 158, + 3211, 4334, 3903, 2714, 1644, 2524, 4489, 2362, 1337, 896, + 3541, 4344, 2956, 701, 908, 2947, 541, 1569, 536, 3553, + 1300, 1301, 3297, 3409, 149, 1987, 3522, 2193, 2242, 3056, + 1219, 1665, 575, 1666, 1667, 1668, 1669, 2335, 544, 619, + 1272, 1945, 2516, 896, 2252, 2452, 3104, 1300, 1301, 2252, + 2359, 1300, 1301, 1477, 3839, 1748, 1770, 3335, 4091, 1400, + 291, 1142, 293, 2201, 2239, 4251, 3714, 1529, 1789, 2025, + 2068, 3477, 4092, 1347, 1834, 1778, 4842, 4838, 1886, 1838, + 1525, 1085, 1086, 1239, 3697, 1977, 42, 2112, -2596, 673, + 1453, 4511, 4150, 1937, 1118, 3428, 1940, 3618, 1071, 1425, + 673, 1302, 1528, 4179, 1303, 2133, 2252, 1085, 1086, 3627, + 667, 903, 3532, 3533, 3534, 667, 699, 48, 915, 4367, + 4807, 1119, 1151, 3643, 3644, 1302, 3839, 1592, 1303, 1614, + 1300, 1301, 958, 2778, 3609, 3657, 4317, 1300, 1301, 4458, + 918, 1719, 1302, 1722, 667, 1303, 1714, 2323, 2131, 4750, + 1336, 2164, 1020, 1940, 2167, 916, 1302, 3786, 2170, 1303, + 2173, 4771, 1078, 959, 1302, 1988, 3870, 1303, 1302, 3929, + 3874, 1303, 1302, 1337, 2750, 1303, 3611, 4318, 4294, 2650, + 1553, 2064, 1100, 1174, 907, 2751, 1336, 1677, 2188, 2189, + 2190, -1616, 699, 1678, 3850, 699, 3336, 1645, 947, 1079, + 1302, 2246, -2596, 1303, 2949, 667, 545, 1130, 906, 3430, + 1988, 1302, 3429, 1302, 1303, 3293, 1303, 3594, 3916, 2749, + 3923, 2118, 1910, 667, 1158, 1302, 1970, 2805, 1303, 2026, + 2500, 1602, 3879, 657, 58, 1161, 1758, 1759, 4093, 1931, + 1943, 3005, 1302, 3170, 657, 1303, 2500, 657, 2874, 2875, + 1130, -1576, 1529, 1302, 2479, 4094, 1303, 1185, 3031, 1969, + 1720, 612, -484, 1814, 1404, 2482, 3744, 2090, 2485, 1055, + 615, 1827, 1302, 1829, 1302, 1303, 4722, 1303, 703, 3607, + 4854, 1720, 3195, 3564, 2329, 1842, 1843, 1844, 63, 2689, + 2317, 3931, 1779, 1848, 2870, 2871, 3439, 1968, 1302, 867, + 1302, 1303, 1573, 1303, 3345, 1350, 2872, 3939, 3940, 3263, + 1240, 1302, 984, -937, 1303, -580, 1300, 1301, 1300, 1301, + 3014, 948, 1302, 3822, 4048, 1303, 1055, 1947, -1616, 2218, + 3015, 3148, 1981, 3095, 2031, 613, 2042, 4207, 4324, 3195, + 2184, 3209, 4212, -2678, 1440, 4094, 4095, 3743, 4225, 1300, + 1301, 4653, 1941, 4655, 4656, 1304, 4048, 3612, 1080, 4507, + 3721, 4341, 1780, 1302, 2476, 4248, 1303, 3359, 3757, 3145, + 1410, 1297, 1720, 1299, 2349, -2678, 3860, 2465, 3264, 1304, + -581, 1333, 3210, 1304, 4048, 579, 3359, 2745, -1616, 1302, + 2565, 3431, 1303, 4302, 4311, 2373, 1304, 2883, 1342, 532, + 1344, 4181, 1346, 1130, 532, 2027, 667, 898, 532, 1941, + 1304, 4323, 1646, 3197, 1385, 2429, 1302, 2028, 1304, 1303, + 1302, 1124, 1304, 1303, 1087, 1343, 1304, 1720, 2578, 2453, + 1348, 2247, 2065, 2357, 1353, 1349, 2444, 2049, 2091, 1354, + 1882, 1883, 2092, 4660, 3348, 2374, 1958, 4134, 4151, -1939, + 1279, 1414, 1300, 1301, 1304, 1579, 1533, 1427, 1537, 4512, + 2402, 1540, 1545, 3605, 2406, 1304, 657, 1304, 1431, 4743, + 4744, 154, 1437, 4747, 1723, 4137, 4446, 1566, 2152, 1304, + 2334, 3030, 3452, 3410, 3107, 1882, 2393, 3857, 2430, 3921, + 1300, 1301, 4125, 4126, 1401, 1462, 1304, 2432, 2433, 1302, + 1124, 1472, 1303, 667, 657, 3938, 1302, 1304, 3699, 1303, + 657, 2168, 3546, 3547, 2348, 1649, 1649, 4048, 681, 1146, + 3863, 3012, 3937, 3352, 4761, 3354, 1304, 4169, 1304, 1926, + 4174, 4175, -1616, 1455, -2672, 1420, 3505, 4206, 3998, 2578, + -2655, 1410, 3430, 2626, 2449, 2450, 2360, 2248, 4319, 4542, + 2058, 1020, 1304, -2596, 1304, 1552, 4348, 667, 954, 667, + -1939, 3064, 667, 667, 4799, 1304, 3862, 2213, 2214, 1981, + 2980, 2981, 3387, 3388, 1647, 1628, 1304, 1603, 667, 2217, + 1300, 1301, 898, 3394, 3395, 3272, 3607, -2596, 2662, 3607, + 3607, 3750, 4796, 3892, 3411, 3412, 1724, 4723, 2113, -2659, + 1725, 4183, 1300, 1301, 1593, 4054, 4751, 1378, 1300, 1301, + 3437, 1726, 48, 2815, 4057, -2799, 4303, 1304, 2267, 3869, + 2469, 657, 3935, 3873, 2816, 4510, 4304, -2658, 2226, 4272, + 2335, 3163, 699, 3824, 699, 3449, 3450, 2750, 3215, -2656, + 2877, 4316, 3242, 1304, 1300, 1301, 1641, -2751, 2751, 1640, + -2657, 4878, 682, 584, -2662, 1300, 1301, 1664, 1317, 564, + 1673, 683, 684, 4278, 1747, 685, 1432, 4142, 2074, 2265, + 1304, 3367, 1511, 2579, 1304, 1693, 4143, 1642, 1643, 2400, + 1300, 1301, -2513, 2658, 657, 1302, 1317, 1302, 1303, 2246, + 1303, 1815, 2364, 532, 1816, 3241, 657, 2546, 3774, 1465, + 898, 588, 2805, -2597, 2749, 2511, 2224, 2087, 3530, 2087, + 2087, 3566, 1604, 2251, 2685, 657, 1738, 2123, 1302, 1697, + 1677, 1303, 4642, 3091, 3092, 1740, 1678, 3580, 2874, 2875, + 1448, 2573, 2574, 1449, 2786, 2159, 1605, 607, 2928, 710, + 2701, 1892, 2634, 1727, 1940, 1300, 1301, 4543, 1927, 947, + 2683, 3049, 616, 1304, 3751, 2885, -2751, 3866, 1467, 2251, + 1304, 1512, 4768, 2688, 3550, 1240, 2691, 2692, -1939, 2322, + 3273, 1928, 2347, 4352, 291, 2871, 293, 1629, 1930, 2365, + 1240, 3036, 2789, 63, 2579, 2553, 2872, 4684, 968, 2266, + 2979, 2071, 896, 964, 1556, 2160, 3149, 711, 1862, -1939, + 1300, 1301, 4723, 4197, 2470, 4511, 4198, 1300, 1301, 1300, + 1301, 4349, 3321, 4190, 4144, 632, -2672, -2597, 2984, 2985, + 2329, 1302, -2655, 1971, 1303, 2870, 1433, 2627, 1505, 1876, + 691, 2484, 3607, 3752, 955, 2524, 4217, 4218, 4219, 1701, + 4305, 1728, 667, 156, 4222, 2663, 4879, 2719, 2720, 3581, + 4544, 4233, 2580, 1557, 1320, 2251, -2513, 1902, 4268, 1302, + 1300, 1301, 1303, 2090, 2731, 4195, 4196, 1300, 1301, 1875, + 2866, 1421, 3367, 2743, 2744, 3367, 3367, 1621, 1657, 667, + 1450, -2659, 1320, 1558, 1934, 1300, 1301, 1300, 1301, 1300, + 1301, 2124, 3367, 667, 1300, 1301, 2040, 134, 667, 657, + 1300, 1301, 969, 3045, 1720, 2075, 4221, 1553, 1970, -2658, + 3367, 4226, 4229, 4231, 4232, 1594, -1939, 635, 2585, 4752, + 2502, -2656, 2554, 1240, 667, 2072, 1300, 1301, 2978, 2242, + 712, 4670, -2657, 3351, 3726, 1929, -2662, 988, 2988, 1304, + 1133, 1304, 667, 156, 2859, 2860, 2861, 2862, 4756, 1302, + 667, 699, 1303, 1472, 965, 1999, 3727, 2002, 2367, 3491, + 2370, 3441, 657, 2580, 1300, 1301, 1500, 896, 4700, 4701, + -1939, 1302, 1304, 4899, 1303, 2242, 1875, 1302, 2020, 970, + 1303, 2090, 4421, 2161, 3156, 1300, 1301, 1300, 1301, 657, + 2247, 2371, 3280, 3746, 1134, 2594, 3551, 667, 3662, 2008, + 1941, 1300, 1301, 1472, 4616, 636, 4617, 2252, 4739, 657, + 4583, 658, 657, 1302, 4753, 3187, 1303, 2471, 136, 4306, + 2577, 3482, 3483, 3484, 1302, 1300, 1301, 1303, 1690, 1691, + -2751, 3582, 2507, 2472, 2091, 2248, 4675, 4414, 667, 667, + 4416, 3802, 2070, 1961, 1190, 3804, 4754, 4676, 2323, 1302, + 3753, 2088, 1303, 2252, 1940, 699, 2215, 1300, 1301, 2595, + 4184, 2109, 1300, 1301, 1300, 1301, 1300, 1301, 667, 2114, + 709, 2242, 1720, 2334, 1735, 1304, 2242, 4456, 667, 3025, + -208, 863, 3542, 2876, 4648, 896, 1135, 638, 2596, 4346, + 2134, 1020, 911, 1646, 2372, 2156, 2669, 2158, 1559, 4783, + -1219, 532, 532, 532, 657, 532, 657, 4355, 2219, 4357, + 4173, 4644, -2140, 1304, 1302, 2165, 532, 1303, 667, 2119, + 898, 4582, 532, 4851, 4852, 2228, 2555, 2153, 2154, 2155, + -1711, 2157, 2379, 2706, 2183, 3188, 2605, 2710, 2711, -2751, + 3583, 1817, 2166, 657, 1818, 3616, 3616, 2120, 2172, 2252, + 4536, 4537, 2091, 4422, 3648, 663, 2092, 2171, 2597, 3085, + 1327, 1328, 1329, 1330, 1331, 1332, 2335, 2749, -2597, 1302, + 601, 2877, 1303, 2087, 4377, -2292, 1302, 2394, 1302, 1303, + 987, 1303, 912, 2697, 4040, 3000, 667, 667, 2038, 3704, + 1329, 1330, 1331, 1332, 1175, 2630, 1940, 3625, 1300, 1301, + 1146, 1940, -2597, 1304, 2223, 4347, 1300, 1301, 136, 667, + 2220, 2221, 2222, 657, 3342, 1677, 4538, 3894, 2149, 2150, + 4732, 1678, 2380, 3655, 3656, 1304, 667, 1055, 4354, 1302, + 3649, 1304, 1303, 2039, 3131, 947, 1302, 2598, 1560, 1303, + 2277, 1608, 3750, 1275, 2386, 152, 153, 3137, 2275, 657, + 2391, 661, 4585, 913, 1302, 1647, 1302, 1303, 1302, 1303, + 1561, 1303, -2140, 1302, 657, 4677, 1303, 1304, 2250, 1302, + 2394, 1969, 1303, 4378, 1176, -1912, 3086, 4074, 1304, 688, + 1300, 1301, -2140, 1211, 1212, 1185, 2392, 2346, 1300, 1301, + 4531, 3353, 1300, 1301, 1945, 1302, -2799, 2396, 1303, 1136, + 3552, 1562, 3448, 1304, 4713, 2870, 4267, 3704, 2121, 1968, + 1941, 3138, 1300, 1301, 2600, 4379, 988, 4510, 2280, 1300, + 1301, 1609, 2408, 1300, 1301, -2292, 679, 1440, 1300, 1301, + 3650, 4586, 2704, 1302, 2631, 1276, 1303, 687, 1875, 2490, + 3122, 2281, 2486, 1300, 1301, -2292, 3518, 2491, 1300, 1301, + 4714, 2632, 2242, 2490, 1302, 691, 1302, 1303, 1282, 1303, + 2495, 3560, 291, 2633, 293, 1137, 993, 1138, 1304, 1055, + 1302, 1300, 1301, 1303, 1055, 3222, 1240, 2401, 3225, 3226, + 2983, 3228, 3125, 3290, 3231, 3232, 4525, 2415, 3235, -2317, + 1300, 1301, 2503, 3244, 1302, 1300, 1301, 1303, 3248, 3249, + 3250, 3251, 3252, 3126, 3510, 3751, 3256, 3257, 2910, 3259, + 3139, 1300, 1301, 2915, 692, 3268, 3269, 3270, 3271, 1394, + 3030, 3275, 3276, 1304, 3278, 1511, 1302, 2922, -1712, 1303, + 1304, 1302, 1304, 1302, 1303, 1302, 1303, 2468, 1303, 3127, + 2564, 3844, 2419, 1300, 1301, 2634, 704, 1981, 706, 2420, + 1981, 2422, 1941, 707, 2599, 4469, 3305, 1941, 1300, 1301, + 853, 2937, 1300, 1301, 1300, 1301, 291, 4123, 293, 1300, + 1301, 2493, -1940, 1300, 1301, 4470, 4715, 1940, 2247, 2492, + 657, 1300, 1301, 1304, 3755, 3474, 3845, 857, 3347, 3140, + 1304, 1898, 657, 667, 859, 1300, 1301, 4511, 3376, 870, + 994, 904, 2423, 1300, 1301, 896, 657, 2734, 1304, 2427, + 1304, 1385, 1304, 2524, 1512, 2006, 1385, 1304, 951, 2518, + 2620, 2527, 2527, 1304, 2527, 920, 2366, 3026, 2994, 2445, + 2528, 2528, 3689, 2528, 1124, 1875, 3392, 699, 3616, -2317, + 147, 953, 3393, 3661, 962, 3076, 973, 596, 2551, 1304, + 1300, 1301, 1427, 898, 667, 596, 3195, 657, 2657, -2317, + 2635, 657, 3729, 4730, 4731, 1300, 1301, 1302, 3404, 2997, + 1303, 537, 1300, 1301, 538, 1302, 975, 995, 1303, 947, + 965, 1462, 2576, -1940, 1068, 1300, 1301, 1304, 667, 667, + 657, 657, 657, 3195, 3195, 947, 947, 537, 1300, 1301, + 538, 1075, 2527, 2527, 2527, 1240, 667, 4142, 1304, 2334, + 1304, 2528, 2528, 2528, 2876, 1097, 4143, 2735, 3241, 1098, + -2437, 667, 2572, 1019, 1304, 148, 1101, 3414, 1099, 3415, + 1300, 1301, 2636, 3195, 1109, 2640, 2629, 3889, 1024, 1300, + 1301, 1580, 1111, 4068, 657, 1502, 2363, 1337, 1304, 1302, + 1055, 2877, 1303, 1112, 1020, 4213, 1440, 1302, 4214, 667, + 1303, 1302, 1113, 1463, 1303, 1114, 2381, 1681, -1826, 152, + 153, 1300, 1301, 1581, 907, 1899, 1020, 1300, 1301, 3569, + 1304, 1302, 1300, 1301, 1303, 1304, 1140, 1304, 1302, 1304, + 1121, 1303, 1302, 3748, 1146, 1303, 2681, 1302, 2382, 537, + 1303, 3753, 538, 2390, 1149, 2404, 3141, 2405, 1300, 1301, + 149, 2963, 1302, 1159, 4800, 1303, 1180, 1302, -1826, 2690, + 1303, 3576, 3776, 3777, 2341, 1163, 1582, 2675, 657, 2678, + 3571, 1583, 947, 1941, 3867, 3498, 3498, 3498, 3498, 3512, + 1302, 1167, 2682, 1303, 1774, 3791, 1337, 1300, 1301, 589, + 2630, 1300, 1301, 1774, 4144, 1300, 1301, 2708, 532, 1302, + 1187, 532, 1303, 1340, 1302, 1188, 4832, 1303, 2732, 4834, + -2437, 1251, 3880, 3881, 1300, 1301, 1300, 1301, 1189, 3799, + 1302, 1300, 1301, 1303, 2709, 2736, 1300, 1301, 1612, 3379, + -2437, -1940, 1191, 1270, 1617, 1618, 2737, 1300, 1301, 3882, + 624, 4850, 2819, 2738, 1533, 1875, 1283, 1284, 1775, 2722, + 1192, 657, 1302, 657, 3313, 1303, 1533, 1775, 2729, 2730, + 4627, 1304, -1940, 2951, 2368, 2369, 1193, 1302, 746, 1304, + 1303, 1302, 1196, 1302, 1303, 2585, 1303, 1776, 1302, 2409, + 1197, 1303, 1302, 4628, 1198, 1303, 1776, 2413, 1199, 2585, + 1302, 625, 1200, 1303, 1875, 1201, 3638, 2586, -1826, 1028, + 1009, 947, 3156, 1202, 1302, 3212, 947, 1303, 1203, 3647, + 2225, 134, 1302, 996, 997, 1303, 999, 1978, 1001, 3930, + 1979, 1204, 2879, 1980, 1584, 2882, 1307, 1205, 1900, 2631, + 1389, 1341, 751, 1092, 1093, 1002, 1094, -1144, 1095, 1206, + -1144, 1207, 2739, 1304, 1901, 667, 2632, 1777, -1826, 2976, + 1208, 1304, 1209, 3944, 2884, 1304, 1777, 667, 2633, 1302, + 1970, 2414, 1303, 1308, 3948, 1300, 1301, 3950, 626, 2418, + 2387, 1337, 1087, 2421, 1302, 1304, 1055, 1303, 896, -1940, + 2999, 1302, 1304, 1440, 1303, 1213, 1304, 1981, 1981, 1981, + 1215, 1304, 1345, 2424, 1302, 4591, 3158, 1303, 1216, 1585, + 2436, 1217, 2587, 2588, 2455, 1220, 1304, 1302, 2631, 3356, + 1303, 1304, 4737, 1390, 135, 1309, 2587, 2588, 1391, 2395, + 1337, 3238, 4736, 1357, 3380, 2632, 1778, 1310, 3934, 3386, + 1221, 765, 136, -1940, 1304, 1778, 3202, 3101, 2740, 1302, + 2634, 1222, 1303, 1124, 1124, 1124, 3521, 2322, 1302, 1223, + 667, 1303, 3389, 1304, 2065, 2065, 2065, 1224, 1304, 3447, + 2589, 1225, 1392, 1586, 2890, 2280, 2397, 1337, 2398, 1832, + 3535, 3396, 1226, -2794, 1304, 2995, 3400, 1227, 1393, 667, + 1302, 667, 667, 1303, 1228, 2474, 1302, 2322, 2281, 1303, + 1229, 1302, 3401, 4515, 1303, 2410, 1337, 4522, 1386, 3082, + 1230, 947, 1233, 137, 1234, 667, 1304, 1235, 667, 1388, + 781, 947, 947, 947, 947, 1241, 1311, 1302, 1723, 1242, + 1303, 1304, 1243, 3852, 3402, 1304, 1124, 1304, 2411, 1337, + -1912, 1244, 1304, 3886, 2876, 3318, 1304, 3578, 1395, 3403, + 3323, 3358, 1397, 3405, 1304, 3408, 3890, 3043, 3331, 3332, + 3413, 2412, 1337, 1398, 3339, 2635, 1302, 1245, 1304, 1303, + 1302, 2087, 3416, 1303, 1302, 1406, 1304, 1303, 3212, 2416, + 1337, 1875, 1246, 3069, 1247, 4264, 3608, 3072, 1248, 3518, + 3615, 2594, 1587, 1302, 3418, 1302, 1303, 138, 1303, 2986, + 1302, 667, 667, 1303, 3353, 1302, 993, 1249, 1303, 1252, + 667, 1253, 2657, 1533, 2965, 1337, 1302, 2242, 2088, 1303, + 2088, 2088, 2894, 1304, 1254, 1317, 3010, 3011, 3205, 3206, + 627, 1588, 3637, 2296, 2297, 3239, 3458, 2636, 1304, 3375, + 2369, 3118, 1774, 3120, 3102, 1304, 3459, 667, 2895, 2310, + 1724, 3240, 628, 1779, 1725, 2595, 3420, 2242, 1304, 1255, + 3460, 1256, 1779, 3422, 1257, 1726, 3378, 1337, 1020, 1258, + 4065, 1304, 3461, 3462, 3463, 1875, 3423, 3117, 4515, 4286, + 3406, 1337, 1259, 3661, 2596, 4522, 1409, 78, 629, 3424, + 1876, 3464, 3524, 3525, 3238, 4497, 4498, 3528, 3529, 1260, + 3161, 3174, 3175, 1304, 2896, 532, 1775, 2897, 1028, 1009, + 657, 657, 1304, 667, 667, 2898, 2636, 1261, 1316, 3811, + 1337, 3796, 1407, 4757, -679, 3832, 3833, 1262, 139, 1317, + 4826, 3166, 3501, 3502, 2899, 3189, 2323, 810, 2280, 3212, + 994, 3641, 1940, 1263, 1304, 291, 1264, 293, 630, 1265, + 1304, 3213, 3847, 3848, 2597, 1304, 4590, 3544, 4032, 4033, + -679, 2281, 3797, 1266, 3198, 3199, 3200, 3201, 3798, 3203, + 3204, -1616, 1408, 4063, 1267, 3212, 2323, 1268, 2312, 2313, + 1269, 1304, 1940, 1273, 4287, 4288, 1274, 3213, 1277, 4289, + 4290, 4291, 3274, 3151, 1278, 2296, 2297, 1727, 947, 4067, + 1317, 140, 4240, 4034, 4035, 3190, 1415, 3289, 4036, 4037, + 1281, 2310, 2324, 1312, 1313, 1314, 1285, 995, 1286, 3303, + 1304, 1320, 1287, 3312, 1304, 1417, 4366, 1288, 1304, 1289, + -1616, 1317, 1290, 2598, 1339, -2794, 1419, 2900, 4073, 4501, + 1423, 4900, 4075, 1446, 1795, 1441, 4076, 1304, 1456, 1304, + 1474, 2486, 2324, 4055, 1304, -679, 1444, 2594, 1476, 1304, + 3664, 640, -1616, 1492, -1616, 4077, 141, 4078, 3319, 3320, + 1304, 3322, 4351, 3324, 3325, 3326, 3327, 3328, 3329, 3330, + 1494, -1616, 3333, 3784, 3191, 3338, -1616, 1495, 4447, 3341, + 1497, -679, 1496, 1317, 1500, 1728, -687, 640, 1504, 2280, + 4043, 4052, 1505, -1616, 4393, 1865, 1866, 1124, 1509, 3478, + -1616, 3465, 4515, 4522, 3240, 1055, 1514, -1616, 2065, 4069, + 1337, 2595, 2281, 4083, 1337, 1320, 1523, -1616, 1546, 3466, + 1550, -2794, 1551, 2594, 3626, 2280, 3628, 1318, 3812, -1616, + 2312, 2313, 2901, 3639, -1616, 4084, 4085, 1799, 1555, 4394, + 2596, 4102, 4103, -1616, 1574, 1055, 1575, 3652, 2281, 4395, + 1319, 4236, 4237, 1576, 3663, 3665, 1019, 2325, 4339, 4340, + 1577, 1774, 4343, 4340, 1322, 1323, 2620, 3682, 3684, 3686, + 595, 1024, 1596, 3687, 3665, 1600, 3922, 4427, 4428, 3925, + 3926, 4496, 3529, 4509, 4340, 1601, 1320, 2595, 1941, 2417, + 4540, 4541, 1615, 1385, 1606, 2518, 1616, 2325, 4396, 1623, + 667, 4548, 4549, 3490, 1414, 667, 667, 667, 4550, 4549, + 2597, -1616, 657, 3735, 3738, 3741, 2596, 1320, 1624, 3496, + 4593, 4594, 1626, 2863, 1631, 1775, 4649, 3848, 1941, 4681, + 4682, 1638, 3467, -1616, 4366, 3043, 667, 152, 153, 1674, + 2599, 1800, 1876, -1616, 4199, 1803, 1680, 4202, 4203, 3214, + 3468, 1682, 1804, 1684, 3189, 4204, 4209, 1240, 1687, 4210, + 1688, 667, 667, 667, 4215, -679, 1692, 667, 1322, 1323, + 4711, 3529, 1695, 4397, 2088, -1616, 3045, 2902, 4220, 1320, + 1696, 4384, 4224, 1704, 4227, 1705, 2597, 4685, 1706, 2598, + 1732, 3192, 4712, 3529, 4729, 3206, 4384, 1715, 291, 3559, + 293, -679, 4471, 996, 997, 998, 999, 1000, 1001, 1733, + 4472, 1743, 3469, 1741, 1321, 1325, 1326, 1327, 1328, 1329, + 1330, 1331, 1332, 1335, 3190, 1002, -1616, 2999, 3759, 3470, + -856, 4746, 4340, 1805, 3806, 3558, 2530, 4473, 2531, 1322, + 1323, 4270, 4527, 1747, 667, 3826, 3827, 2903, 3589, 532, + -1616, 3592, 1773, 3814, 4748, 4340, 1754, 657, 4749, 4340, + 657, 3289, 1784, 642, 1820, 2598, 4781, 4782, 4797, 4340, + 1322, 1323, 4798, 4340, 1440, 3586, 2904, 4801, 4340, 4804, + 3848, 1875, 4815, 4816, 3760, -1912, 1324, 3761, 1831, 4589, + 1832, 1807, 4833, 4340, 719, 3762, 1856, 3289, -1616, 642, + 4847, 3731, 1833, 3191, 1873, 3624, 3622, 3289, 1884, 2594, + 1893, 3634, 3681, 3633, 3763, 1909, 2609, 2610, 2611, 1325, + 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1915, 667, 3633, + 152, 153, 1322, 1323, 3654, 3658, 4398, 4889, 4890, 1876, + 3670, 3669, 1935, 4399, 4100, 4101, -679, 3671, 3672, 657, + 1936, 3635, 3636, -1616, 4449, 4104, 1944, 1949, 4592, 3764, + 4474, 3633, 1952, 1953, -1616, -1616, 1954, 1955, 3289, 3695, + 872, 1956, 1957, 2595, 3708, 1959, 1960, 4360, 1972, 3668, + 1973, 4168, -679, 4400, 746, -1616, 2594, -1616, 1974, 3683, + 4387, 3633, 1327, 1328, 1329, 1330, 1331, 1332, 1975, 4391, + 2009, 1410, 2596, 2005, 2014, 2017, 2599, 947, 4413, 2019, + 3707, 2036, 2022, 4415, -1616, -1616, 2023, 3765, -1616, -1616, + 2044, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 1440, + 3742, 2045, 2594, 1808, 3745, 3685, 2046, 2047, -2488, 4475, + 2053, 750, 2056, 2061, 2060, 2062, 2102, 2063, 751, 1810, + 2595, 2104, 2105, 639, 2106, 1525, 4401, 2115, 4476, 2532, + 873, 2110, 2138, 4609, 4610, 2146, 4612, 2147, 1317, 2174, + 2175, 2151, 2597, 2533, 2176, 2177, 2181, 756, 757, 2596, + 2179, 4477, 2599, 1325, 1326, 1327, 1328, 1329, 1330, 1331, + 1332, 2180, 875, 2197, 2202, 2207, 2595, 4702, 2211, 2216, + 2227, 2249, 1409, 2270, 2269, 2284, 1875, 2287, 876, 2285, + 3673, 2288, 3674, 2229, 4589, 4564, 2320, 2336, 1533, 3766, + 3192, 2338, 3767, 2344, 2377, 2596, 2350, 2230, 3810, 4662, + 1990, 2352, 2353, 2354, 1991, 2534, 3118, 2535, 2376, 4385, + 4386, 640, 2378, 2383, 2384, 2385, 1992, 765, 2388, 2597, + 2394, 2598, 4389, 2403, 4259, 2399, 3675, 2460, 4758, 4392, + 2407, 1317, 2425, 2426, 4402, 2431, 2463, 2434, 2446, 880, + 4417, 4418, 3117, 2435, 2467, 2447, 2448, 1332, -1295, -886, + 3676, 2473, 2483, 2505, -1441, 1218, 2495, -1616, 3043, 2498, + 2504, 4708, 1271, 4709, 4710, 2597, 4572, 881, 1275, 3768, + 2521, -2133, 4579, 882, 2522, 2552, 947, 1720, 2563, 3069, + 3859, 776, 2558, 3861, 2566, 667, 3677, 2569, 2593, 667, + 1533, 4553, 4641, 2601, 2606, 780, 781, 2607, 2598, 2536, + 2608, 2624, 2613, 4597, 4598, 2625, 2639, 4601, 4602, 4603, + 4604, 1502, 2643, 883, 2995, 4393, -1616, 2645, 2649, 2659, + 2651, 1020, 1020, 4820, 2653, 2660, 2661, 2680, 1876, 2666, + 1055, 2664, 2665, 3899, 1320, 2676, 2667, 3397, 3910, 2668, + 2684, 2693, 2694, 4635, 2598, 2696, 4478, 657, 2698, 947, + -1616, 2699, 2524, 2716, 2537, 2717, 2721, 2723, 2728, 3917, + 4394, 1317, 3891, 2724, 4687, 1875, 2231, -1616, 2725, 3924, + 4395, 2726, -1616, 4885, 2727, 2630, 1875, 3927, 3633, 2820, + 1875, 3289, 2824, 2825, 4893, 1875, 2829, 2831, 4885, 2857, + 2834, 667, 4820, 4893, 2865, 3633, -1616, 3289, 3289, 2835, + 4661, 2858, 4663, -1616, 2836, 2837, 2630, 3769, 2838, 2839, + 2840, 3289, 3633, -1616, 2841, 2842, 2843, 2844, 2845, 4396, + 2846, 2847, 2848, 3633, 2849, -1616, 3633, 1320, 3936, 2850, + -1616, 4698, 4699, 2880, 2893, 2917, 3770, 3942, 2599, -1616, + 4707, 2851, 2232, 2852, 3954, 2853, 1993, 2854, 2855, 2856, + 3953, 2884, 2888, 657, 2918, 4482, 2491, 2916, 4008, 3017, + 2974, 3021, 3022, 4009, 2929, 548, 886, 2233, 2930, 2942, + 532, 2964, 2973, 2982, 1994, 2992, 2991, 3019, 4024, 641, + 3023, 3003, 1995, 3032, 3009, 3312, 3008, 1322, 1323, 3678, + 802, 3020, 2229, 3028, 4361, 3033, 4017, 4362, 3046, 3034, + -143, 3735, 3050, 3738, 947, 3741, 2230, -1616, 808, 3047, + 1300, 1301, 889, 810, 2631, 2599, 811, 4870, 2031, 291, + 3051, 293, 3052, 642, 549, 890, 1996, 3059, 3074, -1616, + 2234, 2632, 3073, 3679, 3077, 3078, 3079, 3090, 3083, -1616, + 3084, 3099, 3097, 2633, 3098, 2631, 3111, 3112, 3114, 4277, + -2726, -856, 3123, 3814, 550, 4567, 3124, 1320, 2123, 4154, + 2124, 2599, 2632, 3146, 3133, 3159, 4793, -1750, 3160, 3162, + 557, -1616, 3167, 3173, 2633, 4363, 4364, 1997, 3185, 3186, + 1322, 1323, 3212, 2538, 2539, 2540, 3233, 3224, 3229, 3230, + 3234, 551, 3236, 3237, 3243, 4108, 3245, 3246, 3247, 1478, + 4113, 3254, 3255, 3260, 3261, 1876, 643, 893, 3294, 1479, + 3266, 3267, 3306, 4089, 644, 3277, 1791, 1792, 1793, 1794, + 1795, 3346, -1616, 1480, 3307, 2634, 2235, 3315, 3316, 894, + 3350, 895, 3317, 2345, 4482, 1481, 1482, 1483, 552, 1326, + 1327, 1328, 1329, 1330, 1331, 1332, -1616, 4127, 3370, 3372, + 3359, 152, 153, 3364, 1484, 3373, 2634, 4398, 3374, 3381, + 667, 3425, 4158, 4158, 4399, 3382, 3455, 3289, 4896, 3440, + 719, 947, 3435, 3457, 3436, 2231, 4170, 947, 3446, 3289, + 3289, 3444, 3451, 3454, 3480, 3289, 3479, 3633, 4862, 3487, + 4141, 3289, 3485, 3492, -1616, 3503, 1448, 3507, 3504, 1876, + 3514, 3513, 1533, 3633, 4400, 657, 3520, 3523, 3526, 3531, + 1322, 1323, 3545, 4877, 3549, 988, 3561, 3562, 3565, 3572, + 1796, 1797, 1798, 1799, 3573, 3574, 3163, 3585, 4297, 3577, + 3588, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 2786, + 2635, 3619, 3640, 3642, 3704, 2756, 3709, 2757, 3716, -1616, + 3723, 2232, 3724, 4360, 3728, 4453, 4454, 4455, 3779, 3730, + 746, -1616, 3731, 3775, -69, 3756, 3780, 3787, 3788, 553, + 3800, 2635, 2452, 152, 153, 4246, 2233, 4401, 3430, -826, + -826, -1616, 2759, -1616, 3817, 3818, 3819, 3820, 3835, 3837, + -826, 3841, 2088, 3843, 3849, 2585, 3871, 1410, 3851, 3872, + 2762, 3900, 3905, 667, 3906, 3908, 3909, 3918, 2763, 4242, + -1616, -1616, 2636, 3911, -1616, -1616, 3913, 750, 3912, 3919, + 3920, 554, 3933, 3945, 751, 3941, 3952, 1800, 3951, 1801, + 1802, 1803, 4011, 4012, 4015, 2765, 4018, 4019, 1804, 2234, + 4022, 4023, 555, 2636, 4027, 4028, 4038, 3535, 4029, 1674, + 4031, 4041, 2766, 756, 757, 4042, 4043, 4044, 4053, 4056, + 4058, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, 4070, + 4060, 4439, 4071, 4061, 1485, 4062, 4066, 4072, 4080, 1302, + 4081, 4086, 1303, 2771, 3072, 4402, 4088, 4098, 4107, 4325, + 4109, 4103, 1486, 3899, 4118, 4120, 3560, -1528, 4138, -1533, + 4130, 4135, 3899, 4139, 4153, 4155, 4164, 556, 4160, 4158, + 4176, 4177, 557, 4171, 4178, 4185, 4193, 4200, 4201, 1805, + 4216, 3292, 3289, 765, 4241, 4243, 4252, 4235, 4228, 4269, + 4368, 558, 4052, 4274, 4275, 2235, 4280, 4276, 4369, 657, + 4295, 4281, 4282, 4283, 4296, 4309, 987, 4374, 4299, 291, + 4300, 293, 4313, 4315, 4505, 4332, 559, 4333, 2775, 4335, + 4337, 4372, 4342, 4411, 4225, 2776, 4375, 4388, 4440, 4441, + 4442, 947, 560, 4444, 4448, 4482, 1806, 1807, 4445, 4450, + 2777, 4409, 4452, 4461, 4464, 4483, 4484, 776, 4485, 4419, + 4486, 4420, 4502, 4493, 4519, 4539, 4495, 4508, 4532, 4534, + 4556, 780, 781, 4535, 4437, 4545, 4557, 4558, 4436, 4559, + 4560, 4562, 4563, 4565, 4568, 4570, 4580, 4581, 4605, 4599, + 4600, 4596, 4608, 1487, 2756, 4611, 2757, 4613, 4614, 4618, + 4621, 4650, 4636, 4666, 4673, 4667, 4651, 2779, 4704, 4643, + 4647, 4462, 4674, 4654, 4657, 4664, 4668, 2657, 4679, 4686, + 657, 4689, 4692, 4468, 2778, 2753, 2780, -1699, -826, -826, + 4762, 2759, 851, 4763, 4745, 4764, 3691, 4784, 4771, -826, + 4785, 4786, 2753, 4787, 2754, 4792, 4794, 4789, 4795, 2762, + 4805, 4790, 4808, 4809, 4810, 1488, 4811, 2763, 2756, 4835, + 2757, 4812, 3699, 947, 4158, 4813, 4836, 945, 4843, 4840, + 4846, 4858, 1489, 4734, 4861, 4863, 4865, 945, 4867, 4869, + 4871, 2784, 4874, 2785, 2765, 4875, 4886, 3121, 947, 1808, + 2758, 2787, 4895, 1442, 1065, 2759, 4262, 3002, 1674, 3340, + 4260, 2766, 1595, 1304, 1809, 1810, 4626, 4261, 851, 3604, + 4336, 1658, 4728, 2762, 4625, 4830, 4828, 4504, 667, 1686, + 4683, 2763, 4254, 610, 1067, 2514, 2603, 3472, 4105, 1166, + 2833, 2764, 2771, 1734, 4409, 3497, 3037, 2263, 2494, 4646, + 3039, 3038, 4524, 3281, 3947, 2803, 3506, 4111, 2765, 3511, + 3842, 2034, 4573, 4577, 4691, 4552, 4463, 4770, 4114, 4860, + 4823, 4845, 1674, 2793, 2703, 2766, 802, 4607, 4345, 3279, + 4361, 3694, 4163, 4362, 2767, 3701, 4760, 4866, 3286, 851, + 3772, 4000, 3692, 4208, 808, 1876, 4547, 4234, 4561, 810, + 2770, 4769, 811, 4551, 4266, 3183, 2771, 3427, 291, 3803, + 293, 3805, 3801, 851, 4831, 648, 649, 2775, 851, 4802, + 4718, 4803, 4353, 4645, 2776, 4733, 4640, 3072, 4518, 3072, + 4390, 2794, 2795, 2796, 3283, 3693, 2773, 4703, 2797, 2777, + 1620, 1694, 2198, 4371, 3150, 3055, 2823, 4766, 2321, 4180, + 3489, 2575, 2276, 3176, 2798, 3029, 851, 2799, 3836, 3080, + 1637, 4363, 4364, 1510, 2972, 4566, 4158, 950, 4158, 4158, + 2646, 3813, 291, 851, 293, 4658, 2800, 1518, 2909, 4759, + 4634, 2775, 3453, 2907, 1830, 3103, 3868, 3106, 2776, 4824, + 3442, 4620, 4499, 4030, 2802, 4825, 2779, 4082, 4672, 1772, + 2989, 4188, 3807, 2777, 2204, 3539, 4328, 2205, 3688, 4584, + 4827, 3537, 4437, 4326, 4327, 2780, 4436, 851, 851, 851, + 851, 2878, 650, 2051, 2007, 3027, 4116, 2778, 4468, 851, + 3855, 3062, 3854, 3893, 4671, 4767, 1081, 2343, 667, 1186, + 2999, 1061, 3147, 655, 1670, 2686, 1064, 2687, 2508, 4727, + 2163, 4192, 4279, 2059, 3840, 4859, 3602, 4487, 657, 4868, + 2779, 4897, 1280, 4615, 1377, 4894, 2108, 4696, 4697, 4555, + 2784, 3858, 2785, 3132, 1022, 4741, 2466, 1023, 3888, 2780, + 2787, 3130, 2671, 2781, 4158, 4158, 3129, 2557, 4158, 4718, + 2069, 983, 2291, 4829, 1493, 4451, 2209, 3075, 3018, 4460, + 1998, 3473, 985, 3712, 1661, 851, 1499, 2212, 1106, 1107, + 1108, 4740, 1662, 4822, 0, 0, 4577, 0, 1663, 0, + 1876, 945, 945, 0, 0, 945, 0, 2783, 0, 0, + 0, 0, 0, 0, 2784, 0, 2785, 0, 0, 0, + 0, 667, 0, 0, 2787, 851, 0, 0, 0, 0, + 0, 0, 2793, 0, 0, 0, 0, 945, 1359, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4778, 4779, + 0, 0, 0, 0, 0, 0, 0, 0, 2292, 4158, + 2293, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2790, 0, 0, 0, 0, 4898, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2794, 2795, 2796, 0, 667, 4888, 2793, 2797, 0, 0, + 3312, 3312, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2798, 0, 0, 2799, 0, 2294, 0, + 2295, 2296, 2297, 2298, 2299, 0, 2300, 2301, 2302, 2303, + 2304, 2305, 2306, 2307, 2308, 2800, 2309, 2310, 2311, 0, + 0, 1360, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2802, 2794, 2795, 2796, 0, 0, 0, + 0, 2797, 0, 0, 0, 0, 0, 1361, 0, 0, + 1362, 0, 0, 0, 0, 0, 0, 2798, 0, 0, + 2799, 0, 0, 0, 0, 0, 0, 0, 0, 1876, + 0, 0, 0, 0, 0, 0, 667, 0, 0, 2800, + 1876, 0, 0, 4864, 1876, 0, 0, 1363, 0, 1876, + 0, 0, 0, 3177, 0, 0, 0, 2802, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1364, 0, 0, + 0, 0, 0, 291, 851, 293, 0, 851, 945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 851, 851, 0, 0, 0, 0, 0, 0, + 0, 0, 1791, 1792, 1793, 1794, 1795, 0, 0, 0, + 0, 0, 851, 851, 0, 0, 2312, 2313, 0, 0, 0, 851, 851, 851, 851, 851, 851, 851, 851, 851, - 851, 851, 851, 0, 0, 0, 1800, 0, 1801, 1802, - 1803, 851, 851, 0, 851, 851, 0, 1804, 0, 851, + 851, 851, 851, 0, 0, 0, 0, 0, 0, 0, + 1365, 851, 851, 0, 851, 851, 0, 0, 0, 851, 851, 0, 0, 851, 851, 851, 851, 0, 851, 851, - 851, 0, 0, 0, 0, 0, 0, 851, 851, 0, + 851, 0, 0, 0, 1366, 0, 0, 851, 851, 0, 851, 851, 851, 851, 851, 0, 0, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 851, 0, 851, 0, 0, 851, 851, 0, 0, 0, 851, 0, 0, - 0, 851, 851, 851, 0, 0, 0, 0, 0, 2312, - 2313, 0, 0, 851, 851, 851, 0, 0, 0, 0, - 0, 0, 851, 0, 0, 0, 0, 0, 1805, 851, - 851, 851, 851, 0, 0, 0, 1359, 0, 0, 0, + 0, 851, 851, 851, 0, 0, 1796, 1797, 1798, 1799, + 0, 2752, 0, 851, 851, 851, 0, 2753, 0, 2754, + 0, 2755, 851, 0, 0, 0, 0, 0, 0, 851, + 851, 851, 851, 2756, 0, 2757, 0, 0, 0, 0, 851, 851, 851, 0, 851, 851, 851, 851, 851, 0, 851, 851, 851, 851, 851, 851, 851, 851, 0, 0, - 0, 851, 851, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2754, 0, 2755, 0, - 0, 0, 0, 0, 0, 1806, 1807, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2750, 0, 0, 0, - 0, 0, 2751, 0, 2752, 0, 2753, 0, 0, 0, - -826, -826, 0, 2757, 0, 0, 0, 0, 2754, 0, - 2755, -826, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2760, 0, 0, 0, 0, 0, 0, 1360, 2761, - 0, 0, 0, 0, 0, 0, 0, 851, 1083, 0, - 2756, 0, 0, 0, 0, 2757, 2758, 0, 0, 0, - 0, 2759, 0, 851, 1361, 0, 2763, 1362, 0, 0, - 0, 0, 0, 2760, 0, 0, 0, 0, 0, 0, - 1674, 2761, 0, 2764, 0, 0, 0, 0, 0, 0, - 0, 2762, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1363, 0, 0, 0, 2763, 0, - 0, 0, 0, 2769, 0, 0, 0, 0, 0, 1165, - 0, 0, 1674, 0, 1364, 2764, 0, 0, 1808, 0, - 291, 0, 293, 2765, 2766, 0, 0, 0, 0, 0, - 0, 2767, 851, 1809, 1810, 0, 0, 0, 1194, 2768, - 0, 0, 0, -965, 0, 2769, 0, 851, 0, 0, - 0, 0, 0, 0, 0, 2770, 0, 0, 0, 0, - 0, 0, 0, 0, 851, 0, 0, 0, 0, 291, - 0, 293, 0, 0, 0, 2771, 1232, 1365, 2773, 0, - 0, 0, 0, 0, 0, 2774, 0, 0, 0, 0, - 0, 0, 0, 1250, 0, 0, 0, 0, 0, 0, - 2775, 1366, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 291, 0, 293, 0, 0, 0, 0, 2772, 0, - 2773, 851, 0, 0, 0, 0, 0, 2774, 0, 0, + 0, 851, 851, 0, 0, 2758, 0, 0, 0, 1367, + 2759, 2760, 0, 0, 0, 0, 2761, 0, 1368, 0, + 0, 0, 0, 0, 0, 0, 0, 1359, 2762, 0, + 0, 0, 0, 1369, 0, 0, 2763, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2764, 0, 0, 0, + 0, 1370, 0, 1800, 0, 1801, 1802, 1803, 0, 0, + 0, 0, 0, 2765, 1804, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1674, 0, 0, + 2766, 0, 0, 0, 0, 0, 0, 851, 0, 2767, + 2768, 0, 0, 0, 0, 1371, 0, 2769, 1372, 0, + 0, 0, 0, 851, 0, 2770, 0, 0, 0, -965, + 0, 2771, 0, 0, 0, 0, 0, 0, 0, 0, + 1083, 2772, 0, 0, 0, 0, 0, 0, 1373, 0, + 1360, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2773, 0, 0, 0, 1805, 0, 537, 0, 0, + 538, 0, 0, 0, 0, 0, 1361, 0, 0, 1362, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1294, 0, 2775, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2777, 0, 0, - 0, 0, 0, 0, 0, 0, 2776, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2778, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 291, 0, 293, + 0, 0, 851, 0, 2774, 0, 2775, 0, 0, 0, + 0, 1165, 0, 2776, 0, 0, 1363, 851, 0, 3955, + 3956, 0, 1806, 1807, 0, 3957, 0, 3958, 2777, 3959, + 3960, 0, 0, 0, 851, 0, 1364, 0, 0, 0, + 1194, 0, 291, 0, 293, 0, 3759, 0, 0, 0, + 0, 0, 2778, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2777, - 0, 0, 0, 0, 0, 0, 1367, 0, 0, 0, - 0, 0, 0, 0, 0, 1368, 0, 0, 2778, 0, - 0, 0, 2779, 0, 0, 1416, 0, 0, 0, 945, - 1369, 2782, 0, 2783, 0, 0, 0, 0, 0, 0, - 0, 2785, 0, 0, 0, 0, 0, 0, 1370, 2754, - 0, 2755, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2780, 0, 0, 0, 1447, 2781, 0, 0, 851, - 0, 0, 0, 2782, 0, 2783, 0, 0, 0, 0, - 2784, 0, 0, 2785, 0, 0, 2757, 0, 0, 0, - 0, 0, 1371, 0, 0, 1372, 0, 0, 0, 0, - 0, 0, 0, 0, 2760, 0, 0, 0, 0, 0, - 0, 0, 2761, 2791, 2786, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1373, 0, 0, 2787, 2788, - 2789, 2790, 0, 0, 0, 0, 0, 0, 0, 2763, - 0, 0, 0, 0, 537, 0, 0, 538, 0, 0, - 0, 0, 0, 1674, 0, 2791, 2764, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1232, 0, + 0, 0, 0, 0, 0, 2779, 0, 0, 0, 0, + 0, 851, 0, 0, 0, 1250, 0, 0, 0, 1365, + 0, 0, 3961, 0, 2780, 3962, 0, 0, 2781, 0, + 0, 0, 0, 3963, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1366, 0, 0, 0, 0, 0, 0, + 0, 0, 3964, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1294, 0, 0, 0, 0, 2782, 0, 0, + 3965, 0, 2783, 0, 0, 0, 0, 0, 0, 2784, + 0, 2785, 0, 0, 0, 1808, 2786, 0, 0, 2787, + 0, 0, 0, 0, 0, 3966, 0, 3967, 0, 0, + 1809, 1810, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3968, 3969, 0, 0, 0, 0, 0, 0, 945, + 2788, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2789, 2790, 2791, 2792, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1416, 1367, 0, + 0, 0, 0, 0, 0, 3970, 0, 1368, 0, 851, + 0, 2793, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1369, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3971, 0, 0, 1447, 0, 0, + 1370, 0, 0, 3972, 3973, 0, 3974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2792, 2793, 2794, 0, 0, 0, 0, 2795, 0, - 0, 0, 0, 851, 851, 851, 2769, 0, 0, 0, - 0, 0, 0, 0, 2796, 0, 0, 2797, 851, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2794, + 2795, 2796, 0, 0, 0, 0, 2797, 0, 0, 0, + 3975, 3976, 3977, 0, 1371, 0, 0, 1372, 0, 0, + 0, 0, 2798, 0, 0, 2799, 0, 0, 0, 3978, + 3979, 3980, 0, 0, 0, 0, 0, 3981, 0, 0, + 3982, 0, 0, 0, 2800, 0, 0, 1373, 0, 2801, + 0, 0, 0, 851, 851, 851, 3983, 3984, 0, 0, + 0, 0, 2802, 0, 0, 0, 0, 0, 851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2792, 2793, 2794, 2798, 0, 0, 0, - 2795, 0, 0, 0, 851, 0, 0, 0, 0, 0, - 851, 0, 0, 851, 2800, 851, 2796, 0, 0, 2797, - 0, 851, 0, 851, 851, 0, 0, 0, 0, 0, - 0, 0, 291, 0, 293, 0, 0, 0, 2798, 0, - 0, 2773, 0, 2799, 0, 0, 0, 0, 2774, 0, - 0, 0, 0, 0, 1712, 1377, 2800, 1713, 0, 0, - 0, 0, 0, 2775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1745, 1746, 0, 0, 0, 0, 0, 0, - 0, 1756, 1757, 0, 0, 1760, 1761, 1762, 1763, 1766, - 1767, 1768, 1769, 0, 0, 0, 0, 0, 0, 0, - 0, 1785, 1786, 0, 1787, 1788, 0, 0, 0, 1813, - 2777, 0, -965, 1822, 1823, 1824, 1825, 0, 0, 1828, - 0, 0, 0, 0, 0, 0, 851, 1836, 1837, 2778, - 1840, 1841, 0, 0, 0, 851, 0, 1845, 1846, 1847, - 0, 0, 1850, 1851, 1852, 1853, 1854, 1855, 0, 1857, - 0, 0, 1860, 1861, 0, 0, 0, 1864, 0, 0, - 0, 1867, 1871, 1872, 851, 0, 0, 0, 0, 0, - 0, 0, 0, 1879, 1880, 1881, 0, 1, 0, 2, - 0, 0, 1889, 0, 2782, 0, 2783, 0, 0, 1894, - 1895, 1896, 0, 0, 2785, 0, 0, 851, 0, 0, - 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 6, 0, 851, 0, - 0, 0, 1932, 8, 0, 0, 851, 0, 9, 10, - 0, 0, 0, 0, 0, 851, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, + 0, 0, 3985, 3986, 851, 0, 0, 0, 0, 0, + 851, 0, 0, 851, 0, 851, 0, 0, 0, 0, + 0, 851, 0, 851, 851, 0, 0, 3987, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -965, 0, + 0, 0, 0, 0, 0, 2756, 0, 2757, 0, 0, + 0, 0, 0, 0, 0, 1377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2791, 12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -826, + -826, 0, 2759, 3988, 0, 0, 1712, 3989, 0, 1713, + -826, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2762, 3990, 0, 0, 0, 0, 0, 0, 2763, 0, + 0, 0, 0, 0, 1745, 1746, 0, 0, 0, 0, + 0, 0, 0, 1756, 1757, 0, 0, 1760, 1761, 1762, + 1763, 1766, 1767, 1768, 1769, 2765, 851, 0, 0, 0, + 0, 0, 0, 1785, 1786, 851, 1787, 1788, 0, 1674, + 0, 1813, 2766, 0, 0, 1822, 1823, 1824, 1825, 3991, + 0, 1828, 3992, 0, 0, 3993, 3994, 3995, 3996, 1836, + 1837, 0, 1840, 1841, 851, 0, 0, 0, 0, 1845, + 1846, 1847, 0, 2771, 1850, 1851, 1852, 1853, 1854, 1855, + 0, 1857, 0, 0, 1860, 1861, 0, 0, 1025, 1864, + 0, 0, 0, 1867, 1871, 1872, 0, 851, 3997, 3998, + 0, 1026, 0, 0, 0, 1879, 1880, 1881, 0, 0, + 0, 0, 954, 1027, 1889, 0, 0, 0, 851, 0, + 0, 1894, 1895, 1896, 0, 3999, 851, 0, 0, 0, + 0, 0, 0, 0, 0, 851, 0, 1028, 1009, 291, + 0, 293, 0, 0, 0, 0, 0, 0, 2775, 1029, + 0, 0, 0, 0, 1932, 2776, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2777, 0, 0, 0, 0, 1030, 0, 1031, 0, 1032, 0, 0, 0, 0, 0, 945, 0, 0, 0, 0, - 0, 13, 0, 0, 0, 0, 0, 0, 0, 14, - 15, 16, 0, 0, 0, 0, 0, 2011, 0, 0, - 0, 0, 0, 17, 18, 0, 0, 0, 0, 0, - 0, 0, 0, 2021, 2792, 2793, 2794, 0, 0, 0, - 0, 2795, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 0, 0, 0, 0, 0, 0, 2796, 0, 2816, - 2797, 0, 0, 0, 0, 0, 0, 21, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2798, - 851, 0, 0, 22, 0, 23, 0, 0, 0, 24, - 0, 0, 0, 25, 0, 0, 0, 2800, 0, 0, + 0, 1033, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 15, 16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2779, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2011, + -1912, 1034, 0, 0, 0, 1035, 2780, 0, 1036, 2818, + 0, 0, 0, 0, 0, 2021, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2107, 0, 0, 0, 0, 0, 0, 27, - 0, 28, 0, 0, 0, 0, 0, 2117, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, - 0, 0, 851, 0, 2144, 0, 851, 0, 0, 0, - 0, 851, 851, 0, 0, 30, 0, 0, 0, 31, - 851, 0, 851, 0, 851, 851, 851, 851, 0, 0, - 851, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 851, 0, 0, 0, 0, 0, 0, 1037, 0, 1038, + 0, 0, 0, 0, 0, 0, 0, 1039, 0, 1040, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2784, 0, 2785, 0, 0, 0, 291, 0, 293, + 0, 2787, 0, 0, 0, 1041, 1042, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 851, 0, 2107, 0, 851, 1043, 0, 0, + 0, 851, 851, 0, 0, 0, 0, 0, 0, 2117, + 851, 0, 851, 0, 851, 851, 851, 851, 0, 1044, + 851, 0, 0, 0, 0, 0, 2144, 0, 0, 0, 851, 851, 0, 851, 851, 0, 851, 851, 851, 851, - 0, 851, 0, 0, 851, 0, 0, 0, 0, 0, - 0, 2187, 0, 851, 0, 0, 0, 0, 0, 0, + 0, 851, 0, 2793, 851, 0, 0, 0, 1045, 0, + 0, 0, 0, 851, 0, 0, 0, 0, 0, 0, 851, 0, 851, 0, 851, 851, 0, 851, 851, 0, 0, 0, 851, 851, 851, 0, 0, 0, 851, 851, - 851, 0, 851, 0, 851, 0, 851, 0, 851, 0, - 851, 0, 0, 0, 0, 851, 0, 0, 0, 0, - 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, - 0, 0, 851, 0, 0, 0, 0, 0, 0, 851, - 0, 34, 851, 35, 0, 0, 0, 0, 851, 0, - 0, 851, 0, 0, 0, 851, 36, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, + 851, 0, 851, 2187, 851, 0, 851, 0, 851, 0, + 851, 0, 2756, 0, 2757, 851, 0, 0, 0, 0, + 0, 2794, 2795, 2796, 0, 0, 0, 0, 2797, 0, + 0, 0, 851, 0, 0, 0, 1046, 0, 0, 851, + 0, 0, 851, 0, 2798, 0, 0, 2799, 851, 2759, + 0, 851, 0, 0, 0, 851, 0, 0, 0, 0, + 0, 0, 1047, 0, 0, 0, 2800, 2762, 0, 0, + 0, 0, 0, 1048, 1049, 2763, 0, 1050, 1051, 0, + 0, 0, 0, 0, 2802, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1052, 0, + 0, 0, 2765, 0, 0, 0, 0, 0, 0, 945, + 0, 0, 0, 0, 0, 0, 1674, 0, 0, 2766, + 0, 0, 0, 0, 0, 945, 945, 851, 0, 851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, - 0, 0, 39, 0, 40, 0, 0, 42, 0, 0, - 43, 44, 0, 0, 0, 0, 0, 945, 0, 0, - 0, 45, 0, 0, 46, 0, 0, 0, 0, 2355, - 0, 0, 47, 945, 945, 851, 0, 851, 48, 0, - 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, - 0, 50, 51, 52, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1053, 0, 0, 0, + 2771, 2355, 0, 0, 0, 0, 0, 0, 0, 1054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, - 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 851, 0, 0, 0, 0, + 0, 0, -2532, 0, 0, 0, 1055, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 851, 0, 0, + 0, 0, 0, 0, 1056, 0, 291, 0, 293, 0, + 0, 0, 0, 0, 0, 2775, 0, 0, 0, 0, + 0, 0, 2776, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2777, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, - 0, 0, 0, 2438, 2440, 2442, 0, 0, 56, 0, - 0, 0, 57, 0, 0, 58, 0, 0, 0, 0, - 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 945, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2475, 0, 0, 0, 0, 0, - 61, 2816, 0, 2480, 0, 2481, 62, 0, 0, 0, - 0, 0, 0, 0, 3193, 0, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 3193, 3193, 0, 0, + 0, 0, 945, 0, 0, 2438, 2440, 2442, 0, 0, + 0, 0, -2532, 0, 0, 0, 0, 0, 0, 0, + 1057, 0, 0, 2818, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3196, 0, 0, 0, + 0, 0, 0, 0, 2779, 0, 2475, 0, 3196, 3196, + 0, 0, 0, 0, 0, 2480, 0, 2481, 0, 0, + 0, 0, 0, 2780, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2818, 0, 0, 0, 0, 0, 0, 0, 2784, 0, + 2785, 0, 0, 0, 0, 0, 0, 0, 2787, 0, + 0, 945, 0, 0, 0, 0, 945, 851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2816, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 945, - 0, 0, 0, 0, 945, 851, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2569, 0, 0, 0, - 0, 0, 0, 0, 0, 2582, 0, 0, 0, 0, - 0, 0, 0, 0, 3193, 3193, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3196, 3196, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2571, 0, + 0, 0, 0, 0, 0, 0, 0, 2584, 0, 0, + 0, 851, 0, 0, 0, 851, 0, 0, 0, 0, + 2793, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2621, 0, 0, 0, + 0, 0, 851, 851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2619, 1, 0, 2, 0, 851, - 0, 0, 0, 851, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 2144, 0, 0, - 851, 851, 0, 5, 6, 0, 0, 7, 0, 0, - 0, 8, 0, 0, 0, 0, 9, 10, 2668, 0, + 0, 0, 0, 851, 0, 0, 0, 0, 0, 2144, + 0, 0, 851, 0, 851, 0, 851, 0, 2794, 2795, + 2796, 0, 0, 0, 0, 2797, 0, 0, 0, 0, + 2670, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2798, 0, 0, 2799, 0, 851, 2679, 0, 0, 0, 851, 0, 0, 0, 0, 0, 0, 0, 0, - 851, 0, 851, 0, 851, 2677, 11, 0, 0, 0, + 0, 0, 0, 2800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, - 0, 0, 0, 0, 851, 0, 0, 0, 0, 851, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, - 0, 0, 0, 0, 0, 0, 0, 14, 15, 16, + 0, 2802, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 945, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 945, 945, 945, 945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 18, 0, 0, 0, 0, 0, 945, 0, - 0, 0, 0, 0, 19, 0, 0, 0, 945, 945, - 945, 945, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 22, 0, 23, 0, 0, 851, 24, 0, 0, - 2828, 25, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, - 0, 0, 0, 851, 0, 0, 0, 27, 0, 28, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 851, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2885, 30, 0, 0, 2887, 31, 0, 0, - 0, 2889, 2890, 0, 32, 0, 0, 0, 0, 0, - 1763, 0, 2906, 0, 1763, 0, 2909, 2910, 0, 0, - 0, 0, 0, 0, 2816, 0, 0, 0, 0, 0, - 2917, 2918, 0, 2919, 0, 0, 2921, 2922, 2923, 2924, - 0, 2925, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2929, 0, 0, 0, 0, 0, 0, - 2930, 0, 2931, 0, 2932, 2933, 0, 2934, 0, 0, - 0, 0, 2937, 2938, 2939, 0, 0, 0, 2941, 2942, - 2943, 0, 2944, 0, 2946, 0, 2948, 0, 2950, 0, - 2951, 0, 33, 0, 0, 2952, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, - 0, 35, 2975, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2816, 0, 36, 0, 0, 0, 2985, 0, - 0, 2988, 0, 0, 0, 37, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 851, 0, 0, 0, + 0, 0, 2830, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 945, 0, 38, 0, 0, - 39, 0, 40, 0, 41, 42, 0, 0, 43, 44, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, - 0, 0, 46, 0, 0, 0, 0, 0, 0, 3193, - 47, 0, 0, 0, 0, 0, 48, 0, 0, 0, - 851, 0, 0, 0, 49, 1083, 0, 0, 0, 50, - 51, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 851, 0, 0, 0, 851, 851, 0, 851, 0, 0, - 0, 0, 53, 0, 0, 0, 851, 0, 0, 0, - 54, 851, 0, 0, 851, 0, 851, 851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3107, 0, 0, 0, 0, - 0, 0, 851, 0, 55, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, - 57, 0, 0, 58, 0, 0, 0, 0, 59, 0, - 0, 0, 0, 0, 0, 0, 851, 0, 0, 0, - 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, - 60, 0, 0, 0, 0, 0, 0, 0, 61, 0, - 0, 0, 3, 0, 62, 0, 4, 0, 0, 0, - 851, 0, 0, 0, 0, 0, 0, 63, 0, 0, - 5, 6, 0, 0, 7, 0, 0, 0, 8, 0, - 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 851, 0, 0, - 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 851, 0, 0, - 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2887, 0, 0, 2818, 2889, 0, + 0, 0, 0, 2891, 2892, 0, 0, 0, 0, 0, + 0, 0, 1763, 0, 2908, 0, 1763, 0, 2911, 2912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2816, 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 14, 15, 16, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, - 0, 0, 0, 0, 0, 3311, 0, 0, 0, 0, + 0, 0, 2919, 2920, 0, 2921, 0, 0, 2923, 2924, + 2925, 2926, 0, 2927, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2931, 0, 0, 0, 0, + 0, 0, 2932, 0, 2933, 0, 2934, 2935, 0, 2936, + 0, 0, 0, 0, 2939, 2940, 2941, 0, 0, 0, + 2943, 2944, 2945, 0, 2946, 0, 2948, 0, 2950, 0, + 2952, 0, 2953, 0, 0, 2818, 0, 2954, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, + 0, 0, 0, 0, 2977, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 945, 0, + 2987, 0, 0, 2990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 22, 3352, - 23, 0, 0, 3354, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 26, 0, 851, 851, 0, 0, 0, 0, - 3381, 3382, 0, 0, 27, 0, 28, 0, 0, 0, + 0, 0, 3196, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3404, 29, 0, 0, 0, 0, 0, 0, 0, - 3414, 0, 3416, 0, 3418, 0, 0, 0, 0, 0, - 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, - 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 851, 0, 0, 0, 851, 851, 1083, + 851, 0, 0, 3, 0, 0, 0, 4, 0, 851, + 0, 0, 0, 0, 851, 0, 0, 851, 0, 851, + 851, 5, 6, 0, 0, 7, 0, 0, 0, 8, + 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 11, 851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 12, 0, 0, 0, 0, 0, 3110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3687, 0, 0, 0, 0, 0, 2751, - 0, 2752, 0, 0, 0, 0, 0, 0, 0, 0, - 945, 0, 0, 0, 0, 2754, 0, 2755, 0, 0, + 851, 0, 0, 0, 0, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 851, 0, 0, 0, 0, 0, 0, 0, 0, 33, - 0, 0, 0, 0, 0, 0, 0, 2756, 0, 0, - 0, 0, 2757, 851, 0, 0, 34, 0, 35, 0, - 851, 0, 0, 0, 0, 0, 2619, 0, 0, 0, - 2760, 36, 0, 0, 0, 0, 0, 0, 2761, 0, - 0, 0, 37, 0, 0, 0, 0, 0, 2762, 0, - 0, 0, 0, 2619, 0, 0, 851, 0, 0, 0, - 0, 0, 0, 0, 38, 2763, 0, 39, 0, 40, - 0, 41, 42, 2144, 0, 43, 44, 0, 0, 1674, - 0, 0, 2764, 0, 0, 0, 45, 0, 0, 46, - 2765, 0, 0, 0, 0, 0, 0, 47, 3688, 3948, - 3949, 0, 0, 48, 0, 3950, 2768, 3951, 0, 3952, - 3953, 49, 2769, 0, 0, 0, 50, 51, 52, 0, - 0, 0, 0, 0, 0, 0, 3755, 0, 0, 0, + 17, 18, 0, 0, 851, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2771, 0, 0, 0, 0, 0, 0, 53, - 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 945, - 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, - 293, 0, 3954, 0, 0, 3955, 0, 2773, 0, 0, - 0, 0, 0, 3956, 2774, 0, 0, 0, 0, 0, - 0, 55, 851, 0, 0, 0, 851, 0, 0, 2775, - 0, 3957, 0, 56, 0, 0, 0, 57, 0, 0, - 58, 0, 0, 0, 0, 59, 0, 0, 0, 3958, - 0, 0, 0, 2776, 0, 0, 0, 0, 0, 851, - 945, 0, 0, 0, 0, 0, 0, 60, 0, 0, - 0, 0, 0, 0, 3959, 61, 3960, 0, 0, 0, - 0, 62, 0, 0, 0, 0, 2777, 0, 0, 0, - 3961, 3962, 0, 0, 63, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2778, 0, 0, 0, 2779, - 0, 0, 0, 0, 0, 0, 0, 0, 2816, 0, - 3745, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3963, 0, 0, 0, 0, 0, + 0, 851, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3774, 0, 0, 2781, 3778, 3779, 0, 0, 0, 0, - 2782, 0, 2783, 3964, 0, 0, 3786, 0, 0, 0, - 2785, 3788, 3965, 3966, 3789, 3967, 3790, 3791, 0, 4400, + 22, 851, 23, 0, 0, 0, 24, 0, 0, 0, + 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 26, 0, 0, 2818, 0, 0, + 0, 0, 0, 0, 0, 0, 27, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 851, 3968, - 3969, 3970, 0, 0, 0, 945, 2788, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3971, 3972, - 3973, 0, 0, 0, 0, 0, 3974, 0, 0, 3975, - 0, 0, 2791, 0, 0, 0, 3822, 0, 0, 0, - 0, 0, 851, 0, 0, 3976, 3977, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 851, 0, 851, + 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 32, 0, 0, 0, 0, 0, 3314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3822, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3978, 3979, 0, 4507, 0, 0, 0, 4507, 0, - 2792, 2793, 2794, 0, 0, 0, 0, 2795, 0, 0, - 0, 0, 0, 0, 0, 0, 3980, 3878, 0, 0, - 0, 0, 0, 2796, 0, 0, 2797, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3822, 0, 0, - 0, 0, 0, 0, 0, 2798, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4400, 0, 2800, 0, 0, 0, 0, 0, 0, - 0, 0, 3981, 0, 0, 0, 3982, 0, 0, 0, - 0, 945, 0, 0, 0, 0, 0, 945, 0, 0, - 3983, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 851, 851, + 0, 0, 0, 3355, 0, 0, 0, 3357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3984, 0, - 0, 3985, 0, 0, 3986, 3987, 3988, 3989, 0, 0, - 0, 0, 0, 0, 4507, 0, 0, 0, 0, 4507, - 0, 0, 0, 0, 4006, 4007, 4507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3990, 3991, 0, + 0, 33, 0, 0, 3384, 3385, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, + 35, 0, 0, 0, 0, 3407, 0, 0, 0, 0, + 0, 0, 0, 36, 3417, 0, 3419, 0, 3421, 0, + 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 38, 0, 0, 39, + 0, 40, 0, 41, 42, 0, 0, 43, 44, 0, + 0, 0, 0, 0, 0, 0, 0, 945, 45, 0, + 0, 46, 0, 0, 0, 0, 0, 0, 0, 47, + 0, 0, 0, 0, 0, 48, 0, 851, 0, 0, + 0, 0, 0, 49, 0, 0, 0, 0, 50, 51, + 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 851, 0, 0, 0, 0, 0, 0, 851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3992, 851, 0, 0, 0, 0, + 0, 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2621, 0, 851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 2, 0, 0, 2621, 0, + 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 56, 0, 4, 2144, 57, + 0, 0, 58, 0, 0, 0, 0, 59, 0, 0, + 0, 5, 6, 0, 0, 7, 0, 0, 0, 8, + 0, 0, 0, 0, 9, 10, 0, 0, 0, 60, + 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, + 0, 0, 0, 62, 11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, + 0, 0, 0, 12, 0, 0, 945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 15, 16, 851, + 0, 0, 0, 851, 0, 0, 0, 0, 0, 0, + 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20, 851, 945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4507, 0, 0, 0, 0, - 0, 4725, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3822, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 23, 0, 0, 0, 24, 0, 0, 0, + 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 26, 0, 0, 2818, 0, 0, + 0, 0, 0, 0, 0, 0, 27, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4120, 851, 0, 0, 0, 0, 0, - 2619, 0, 851, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 3749, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 32, 0, 3778, 0, 0, 4410, 3782, + 3783, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3790, 0, 0, 0, 0, 3792, 0, 0, 3793, + 0, 3794, 3795, 0, 0, 0, 0, 851, 0, 0, + 0, 0, 0, 0, 945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 851, 0, 0, 4158, 0, 0, 0, - 0, 945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 4507, 0, 4507, 4507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 851, + 0, 0, 851, 0, 0, 0, 0, 0, 0, 0, + 0, 33, 0, 0, 0, 0, 0, 851, 0, 851, + 0, 0, 3829, 0, 0, 0, 0, 0, 34, 0, + 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 36, 4517, 0, 0, 0, 4517, 0, + 0, 0, 0, 0, 37, 0, 3829, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 38, 0, 0, 39, + 0, 40, 0, 41, 42, 0, 0, 43, 44, 0, + 0, 0, 0, 3885, 0, 0, 0, 0, 45, 0, + 0, 46, 0, 0, 0, 0, 0, 0, 0, 47, + 0, 4410, 0, 3829, 0, 48, 0, 0, 0, 0, + 0, 0, 0, 49, 0, 0, 0, 0, 50, 51, + 52, 945, 0, 0, 0, 0, 0, 945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 4507, 0, 0, 4507, 0, 0, 0, + 851, 0, 1, 0, 2, 0, 0, 0, 0, 0, + 0, 53, 0, 0, 0, 0, 0, 0, 0, 54, + 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 6, 0, 0, 0, 0, 0, 0, 8, 0, + 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, + 0, 0, 0, 55, 4517, 0, 0, 0, 0, 4517, + 0, 0, 0, 11, 0, 56, 4517, 0, 0, 57, + 0, 0, 58, 0, 0, 0, 0, 59, 0, 0, + 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, + 4013, 4014, 0, 0, 0, 0, 0, 0, 0, 60, + 0, 0, 0, 0, 0, 0, 13, 61, 0, 0, + 0, 0, 0, 62, 14, 851, 15, 16, 0, 0, + 0, 0, 0, 0, 0, 0, 63, 0, 0, 17, + 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4507, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 851, 0, - 0, 0, 0, 945, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2619, 0, 0, 0, 4264, 0, 945, 0, + 0, 0, 0, 21, 0, 4517, 0, 0, 0, 0, + 0, 4735, 0, 0, 0, 0, 0, 0, 0, 22, + 0, 23, 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 851, 0, 0, 0, 0, 0, 3822, + 0, 0, 0, 0, 851, 27, 0, 28, 0, 3829, + 0, 0, 851, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 4129, 0, 0, 0, 0, 0, 0, 2621, + 0, 30, 0, 851, 0, 31, 0, 0, 0, 0, + 0, 945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4517, 0, 4517, 4517, 4167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 851, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4517, 0, 0, 4517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 4517, 35, + 0, 0, 0, 0, 0, 0, 0, 0, 851, 0, + 0, 0, 36, 945, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 945, 0, + 0, 0, 0, 0, 0, 38, 0, 0, 39, 0, + 40, 0, 0, 42, 0, 0, 43, 44, 0, 0, + 0, 2621, 0, 851, 0, 4273, 0, 45, 0, 0, + 46, 0, 0, 0, 0, 0, 0, 0, 47, 0, + 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, + 0, 0, 49, 0, 0, 0, 0, 50, 51, 52, + 3829, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 56, 0, 0, 0, 57, 0, + 0, 58, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, + 0, 0, 62, 0, 0, 0, 0, 0, 0, 4438, + 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4428, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4492, + 0, 4494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4482, 0, 4484, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5664,10 +5681,10 @@ static const yytype_int16 yytable[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2621, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -5676,27 +5693,32 @@ static const yytype_int16 yytable[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 159, 0, 160, 715, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 716, 0, 169, 170, 171, 172, 173, - 174, 175, 717, 177, 0, 178, 0, 0, 718, 179, - 719, 720, 721, 180, 722, 0, 181, 182, 183, 1868, - 184, 0, 185, 186, 0, 0, 187, 723, 724, 188, - 189, 0, 190, 725, 726, 192, 193, 0, 194, 195, - 196, 197, 727, 199, 4755, 728, 201, 729, 730, 731, - 732, 733, 3822, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 734, 221, - 0, 222, 735, 736, 223, 0, 0, 224, 737, 225, - 738, 739, 226, 4778, 227, 740, 741, 0, 228, 229, - 230, 742, 743, 744, 0, 0, 0, 0, 745, 233, - 746, 0, 0, 747, 234, 0, 235, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4765, 0, 0, 0, + 0, 0, 0, 0, 3829, 159, 0, 160, 715, 162, + 163, 164, 165, 0, 0, 166, 0, 0, 0, 167, + 0, 0, 716, 0, 169, 170, 171, 172, 173, 174, + 175, 717, 177, 0, 178, 4788, 0, 718, 179, 719, + 720, 721, 180, 722, 0, 181, 182, 183, 1868, 184, + 0, 185, 186, 0, 0, 187, 723, 724, 188, 189, + 0, 190, 725, 726, 192, 193, 0, 194, 195, 196, + 197, 727, 199, 0, 728, 201, 729, 730, 731, 732, + 733, 0, 207, 208, 209, 210, 211, 212, 213, 214, + 0, 215, 216, 0, 217, 218, 219, 734, 221, 0, + 222, 735, 736, 223, 0, 0, 224, 737, 225, 738, + 739, 226, 0, 227, 740, 741, 0, 228, 229, 230, + 742, 743, 744, 0, 0, 0, 0, 745, 233, 746, + 0, 0, 747, 234, 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, @@ -5704,7 +5726,7 @@ static const yytype_int16 yytable[] = 0, 261, 262, 263, 264, 749, 750, 265, 266, 0, 267, 268, 269, 751, 0, 270, 0, 0, 0, 752, 272, 0, 273, 0, 274, 0, 275, 276, 753, 278, - 754, 280, 281, 0, 282, 0, 755, 283, 284, 285, + 754, 280, 281, 0, 282, 3829, 755, 283, 284, 285, 0, 286, 756, 757, 0, 287, 288, 0, 0, 0, 758, 290, 291, 292, 293, 759, 0, 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, 760, 298, 299, @@ -5712,7 +5734,7 @@ static const yytype_int16 yytable[] = 0, 0, 0, 305, 0, 0, 306, 307, 762, 0, 1869, 309, 0, 763, 310, 311, 0, 0, 0, 0, 0, 764, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 765, 3822, 0, 0, 318, 319, 320, 321, + 0, 0, 765, 0, 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, 766, 338, 339, 340, 341, 767, 342, 343, 344, 0, 0, 0, 0, @@ -5763,6 +5785,601 @@ static const yytype_int16 yytable[] = 738, 739, 226, 0, 227, 740, 741, 0, 228, 229, 230, 742, 743, 744, 0, 0, 0, 0, 745, 233, 746, 0, 0, 2142, 234, 0, 235, 0, 0, 0, + 0, 236, 0, 237, 238, 239, 240, 241, 0, 0, + 0, 0, 242, 0, 0, 243, 244, 245, 0, 0, + 0, 246, 0, 247, 248, 0, 249, 250, 251, 0, + 252, 253, 0, 254, 255, 256, 257, 258, 259, 260, + 748, 0, 261, 262, 263, 264, 749, 750, 265, 266, + 0, 267, 268, 269, 751, 0, 270, 0, 0, 0, + 752, 272, 0, 273, 0, 274, 0, 275, 276, 753, + 278, 754, 280, 281, 0, 282, 0, 755, 283, 284, + 285, 0, 286, 756, 757, 0, 287, 288, 0, 0, + 0, 758, 290, 291, 292, 293, 759, 0, 0, 294, + 295, 296, 0, 0, 297, 0, 0, 0, 760, 298, + 299, 761, 0, 0, 300, 0, 301, 302, 0, 303, + 304, 0, 0, 0, 305, 0, 0, 306, 307, 762, + 0, 0, 309, 0, 763, 310, 311, 0, 0, 0, + 0, 0, 764, 313, 0, 314, 0, 315, 0, 316, + 317, 0, 0, 765, 0, 0, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 0, 334, 335, 336, 337, 766, 338, + 339, 340, 341, 767, 342, 343, 344, 0, 0, 0, + 0, 345, 346, 347, 348, 768, 350, 0, 0, 769, + 352, 770, 353, 0, 354, 771, 772, 773, 774, 775, + 359, 360, 361, 362, 363, 364, 0, 776, 365, 0, + 0, 366, 367, 368, 369, 777, 778, 779, 370, 371, + 0, 780, 781, 372, 0, 373, 374, 782, 2143, 376, + 377, 378, 379, 0, 380, 381, 0, 0, 0, 0, + 0, 0, 0, 0, 382, 383, 384, 0, 783, 385, + 0, 386, 0, 387, 388, 784, 390, 391, 392, 393, + 785, 786, 396, 787, 0, 397, 398, 399, 0, 400, + 0, 401, 402, 403, 404, 405, 0, 788, 407, 408, + 0, 0, 409, 0, 0, 0, 410, 411, 412, 413, + 414, 0, 0, 415, 416, 417, 418, 419, 0, 420, + 421, 0, 422, 423, 424, 789, 790, 425, 0, 426, + 0, 427, 428, 0, 429, 430, 0, 431, 0, 791, + 0, 792, 433, 434, 435, 436, 437, 438, 793, 794, + 441, 442, 443, 444, 0, 795, 446, 0, 0, 0, + 447, 448, 449, 450, 0, 0, 0, 451, 0, 0, + 0, 452, 0, 453, 454, 455, 456, 457, 458, 0, + 459, 460, 461, 462, 463, 464, 0, 0, 0, 0, + 0, 0, 465, 466, 0, 467, 0, 0, 468, 0, + 0, 0, 469, 470, 471, 0, 0, 0, 472, 796, + 797, 473, 474, 0, 475, 476, 798, 478, 479, 480, + 799, 800, 481, 482, 483, 484, 801, 485, 486, 0, + 0, 487, 488, 489, 490, 0, 802, 491, 492, 0, + 803, 804, 805, 806, 0, 0, 0, 0, 0, 497, + 498, 499, 0, 807, 808, 809, 501, 502, 503, 810, + 504, 505, 811, 506, 507, 0, 508, 509, 0, 0, + 510, 0, 0, 511, 0, 512, 0, 812, 514, 0, + 0, 813, 814, 815, 816, 515, 0, 0, 516, 817, + 0, 818, 517, 518, 519, 520, 521, 819, 820, 0, + 0, 0, 0, 0, 0, 524, 525, 0, 526, 527, + 528, 0, 0, 821, 0, 0, 0, 0, 0, 0, + 0, 822, 823, 0, 0, 0, 0, 824, 825, 0, + 0, 826, 827, 0, 0, 828, 829, 159, 0, 160, + 715, 162, 163, 164, 165, 0, 0, 166, 0, 0, + 0, 167, 0, 0, 716, 0, 169, 170, 171, 172, + 173, 174, 175, 717, 177, 0, 178, 0, 0, 718, + 179, 719, 720, 721, 180, 722, 0, 181, 182, 183, + 0, 184, 0, 185, 186, 0, 0, 187, 723, 724, + 188, 189, 0, 190, 725, 726, 192, 193, 0, 194, + 195, 196, 197, 727, 199, 0, 728, 201, 729, 730, + 731, 732, 733, 0, 207, 208, 209, 210, 211, 212, + 213, 214, 0, 215, 216, 0, 217, 218, 219, 734, + 221, 0, 222, 735, 736, 223, 0, 0, 224, 737, + 225, 738, 739, 226, 0, 227, 740, 741, 0, 228, + 229, 230, 742, 743, 744, 0, 0, 0, 0, 745, + 233, 746, 0, 0, 747, 234, 0, 235, 0, 0, + 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, + 0, 0, 0, 242, 0, 0, 243, 244, 245, 0, + 0, 0, 246, 0, 247, 248, 0, 249, 250, 251, + 0, 252, 253, 0, 254, 255, 256, 257, 258, 259, + 260, 748, 0, 261, 262, 263, 264, 749, 750, 265, + 266, 0, 267, 268, 269, 751, 0, 270, 0, 0, + 0, 752, 272, 2437, 273, 0, 274, 0, 275, 276, + 753, 278, 754, 280, 281, 0, 282, 0, 755, 283, + 284, 285, 0, 286, 756, 757, 0, 287, 288, 0, + 0, 0, 758, 290, 291, 292, 293, 759, 0, 0, + 294, 295, 296, 0, 0, 297, 0, 0, 0, 760, + 298, 299, 761, 0, 0, 300, 0, 301, 302, 0, + 303, 304, 0, 0, 0, 305, 0, 0, 306, 307, + 762, 0, 0, 309, 0, 763, 310, 311, 0, 0, + 0, 0, 0, 764, 313, 0, 314, 0, 315, 0, + 316, 317, 0, 0, 765, 0, 0, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 0, 334, 335, 336, 337, 766, + 338, 339, 340, 341, 767, 342, 343, 344, 0, 0, + 0, 0, 345, 346, 347, 348, 768, 350, 0, 0, + 769, 352, 770, 353, 0, 354, 771, 772, 773, 774, + 775, 359, 360, 361, 362, 363, 364, 0, 776, 365, + 0, 0, 366, 367, 368, 369, 777, 778, 779, 370, + 371, 0, 780, 781, 372, 0, 373, 374, 782, 0, + 376, 377, 378, 379, 0, 380, 381, 0, 0, 0, + 0, 0, 0, 0, 0, 382, 383, 384, 0, 783, + 385, 0, 386, 0, 387, 388, 784, 390, 391, 392, + 393, 785, 786, 396, 787, 0, 397, 398, 399, 0, + 400, 0, 401, 402, 403, 404, 405, 0, 788, 407, + 408, 0, 0, 409, 0, 0, 0, 410, 411, 412, + 413, 414, 0, 0, 415, 416, 417, 418, 419, 0, + 420, 421, 0, 422, 423, 424, 789, 790, 425, 0, + 426, 0, 427, 428, 0, 429, 430, 0, 431, 0, + 791, 0, 792, 433, 434, 435, 436, 437, 438, 793, + 794, 441, 442, 443, 444, 0, 795, 446, 0, 0, + 0, 447, 448, 449, 450, 0, 0, 0, 451, 0, + 0, 0, 452, 0, 453, 454, 455, 456, 457, 458, + 0, 459, 460, 461, 462, 463, 464, 0, 0, 0, + 0, 0, 0, 465, 466, 0, 467, 0, 0, 468, + 0, 0, 0, 469, 470, 471, 0, 0, 0, 472, + 796, 797, 473, 474, 0, 475, 476, 798, 478, 479, + 480, 799, 800, 481, 482, 483, 484, 801, 485, 486, + 0, 0, 487, 488, 489, 490, 0, 802, 491, 492, + 0, 803, 804, 805, 806, 0, 0, 0, 0, 0, + 497, 498, 499, 0, 807, 808, 809, 501, 502, 503, + 810, 504, 505, 811, 506, 507, 0, 508, 509, 0, + 0, 510, 0, 0, 511, 0, 512, 0, 812, 514, + 0, 0, 813, 814, 815, 816, 515, 0, 0, 516, + 817, 0, 818, 517, 518, 519, 520, 521, 819, 820, + 0, 0, 0, 0, 0, 0, 524, 525, 0, 526, + 527, 528, 0, 0, 821, 0, 0, 0, 0, 0, + 0, 0, 822, 823, 0, 0, 0, 0, 824, 825, + 0, 0, 826, 827, 0, 0, 828, 829, 159, 0, + 160, 715, 162, 163, 164, 165, 0, 0, 166, 0, + 0, 0, 167, 0, 0, 716, 0, 169, 170, 171, + 172, 173, 174, 175, 717, 177, 0, 178, 0, 0, + 718, 179, 719, 720, 721, 180, 722, 0, 181, 182, + 183, 0, 184, 0, 185, 186, 0, 0, 187, 723, + 724, 188, 189, 0, 190, 725, 726, 192, 193, 0, + 194, 195, 196, 197, 727, 199, 0, 728, 201, 729, + 730, 731, 732, 733, 0, 207, 208, 209, 210, 211, + 212, 213, 214, 0, 215, 216, 0, 217, 218, 219, + 734, 221, 0, 222, 735, 736, 223, 0, 0, 224, + 737, 225, 738, 739, 226, 0, 227, 740, 741, 0, + 228, 229, 230, 742, 743, 744, 0, 0, 0, 0, + 745, 233, 746, 0, 0, 747, 234, 0, 235, 0, + 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, + 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, + 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, + 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, + 259, 260, 748, 0, 261, 262, 263, 264, 749, 750, + 265, 266, 0, 267, 268, 269, 751, 0, 270, 0, + 0, 0, 752, 272, 2439, 273, 0, 274, 0, 275, + 276, 753, 278, 754, 280, 281, 0, 282, 0, 755, + 283, 284, 285, 0, 286, 756, 757, 0, 287, 288, + 0, 0, 0, 758, 290, 291, 292, 293, 759, 0, + 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, + 760, 298, 299, 761, 0, 0, 300, 0, 301, 302, + 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, + 307, 762, 0, 0, 309, 0, 763, 310, 311, 0, + 0, 0, 0, 0, 764, 313, 0, 314, 0, 315, + 0, 316, 317, 0, 0, 765, 0, 0, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, + 766, 338, 339, 340, 341, 767, 342, 343, 344, 0, + 0, 0, 0, 345, 346, 347, 348, 768, 350, 0, + 0, 769, 352, 770, 353, 0, 354, 771, 772, 773, + 774, 775, 359, 360, 361, 362, 363, 364, 0, 776, + 365, 0, 0, 366, 367, 368, 369, 777, 778, 779, + 370, 371, 0, 780, 781, 372, 0, 373, 374, 782, + 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, + 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, + 783, 385, 0, 386, 0, 387, 388, 784, 390, 391, + 392, 393, 785, 786, 396, 787, 0, 397, 398, 399, + 0, 400, 0, 401, 402, 403, 404, 405, 0, 788, + 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, + 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, + 0, 420, 421, 0, 422, 423, 424, 789, 790, 425, + 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, + 0, 791, 0, 792, 433, 434, 435, 436, 437, 438, + 793, 794, 441, 442, 443, 444, 0, 795, 446, 0, + 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, + 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, + 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, + 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, + 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, + 472, 796, 797, 473, 474, 0, 475, 476, 798, 478, + 479, 480, 799, 800, 481, 482, 483, 484, 801, 485, + 486, 0, 0, 487, 488, 489, 490, 0, 802, 491, + 492, 0, 803, 804, 805, 806, 0, 0, 0, 0, + 0, 497, 498, 499, 0, 807, 808, 809, 501, 502, + 503, 810, 504, 505, 811, 506, 507, 0, 508, 509, + 0, 0, 510, 0, 0, 511, 0, 512, 0, 812, + 514, 0, 0, 813, 814, 815, 816, 515, 0, 0, + 516, 817, 0, 818, 517, 518, 519, 520, 521, 819, + 820, 0, 0, 0, 0, 0, 0, 524, 525, 0, + 526, 527, 528, 0, 0, 821, 0, 0, 0, 0, + 0, 0, 0, 822, 823, 0, 0, 0, 0, 824, + 825, 0, 0, 826, 827, 0, 0, 828, 829, 159, + 0, 160, 715, 162, 163, 164, 165, 0, 0, 166, + 0, 0, 0, 167, 0, 0, 716, 0, 169, 170, + 171, 172, 173, 174, 175, 717, 177, 0, 178, 0, + 0, 718, 179, 719, 720, 721, 180, 722, 0, 181, + 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, + 723, 724, 188, 189, 0, 190, 725, 726, 192, 193, + 0, 194, 195, 196, 197, 727, 199, 0, 728, 201, + 729, 730, 731, 732, 733, 0, 207, 208, 209, 210, + 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, + 219, 734, 221, 0, 222, 735, 736, 223, 0, 0, + 224, 737, 225, 738, 739, 226, 0, 227, 740, 741, + 0, 228, 229, 230, 742, 743, 744, 0, 0, 0, + 0, 745, 233, 746, 0, 0, 747, 234, 0, 235, + 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, + 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, + 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, + 250, 251, 0, 252, 253, 0, 254, 255, 256, 257, + 258, 259, 260, 748, 0, 261, 262, 263, 264, 749, + 750, 265, 266, 0, 267, 268, 269, 751, 0, 270, + 0, 0, 0, 752, 272, 2441, 273, 0, 274, 0, + 275, 276, 753, 278, 754, 280, 281, 0, 282, 0, + 755, 283, 284, 285, 0, 286, 756, 757, 0, 287, + 288, 0, 0, 0, 758, 290, 291, 292, 293, 759, + 0, 0, 294, 295, 296, 0, 0, 297, 0, 0, + 0, 760, 298, 299, 761, 0, 0, 300, 0, 301, + 302, 0, 303, 304, 0, 0, 0, 305, 0, 0, + 306, 307, 762, 0, 0, 309, 0, 763, 310, 311, + 0, 0, 0, 0, 0, 764, 313, 0, 314, 0, + 315, 0, 316, 317, 0, 0, 765, 0, 0, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, + 337, 766, 338, 339, 340, 341, 767, 342, 343, 344, + 0, 0, 0, 0, 345, 346, 347, 348, 768, 350, + 0, 0, 769, 352, 770, 353, 0, 354, 771, 772, + 773, 774, 775, 359, 360, 361, 362, 363, 364, 0, + 776, 365, 0, 0, 366, 367, 368, 369, 777, 778, + 779, 370, 371, 0, 780, 781, 372, 0, 373, 374, + 782, 0, 376, 377, 378, 379, 0, 380, 381, 0, + 0, 0, 0, 0, 0, 0, 0, 382, 383, 384, + 0, 783, 385, 0, 386, 0, 387, 388, 784, 390, + 391, 392, 393, 785, 786, 396, 787, 0, 397, 398, + 399, 0, 400, 0, 401, 402, 403, 404, 405, 0, + 788, 407, 408, 0, 0, 409, 0, 0, 0, 410, + 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, + 419, 0, 420, 421, 0, 422, 423, 424, 789, 790, + 425, 0, 426, 0, 427, 428, 0, 429, 430, 0, + 431, 0, 791, 0, 792, 433, 434, 435, 436, 437, + 438, 793, 794, 441, 442, 443, 444, 0, 795, 446, + 0, 0, 0, 447, 448, 449, 450, 0, 0, 0, + 451, 0, 0, 0, 452, 0, 453, 454, 455, 456, + 457, 458, 0, 459, 460, 461, 462, 463, 464, 0, + 0, 0, 0, 0, 0, 465, 466, 0, 467, 0, + 0, 468, 0, 0, 0, 469, 470, 471, 0, 0, + 0, 472, 796, 797, 473, 474, 0, 475, 476, 798, + 478, 479, 480, 799, 800, 481, 482, 483, 484, 801, + 485, 486, 0, 0, 487, 488, 489, 490, 0, 802, + 491, 492, 0, 803, 804, 805, 806, 0, 0, 0, + 0, 0, 497, 498, 499, 0, 807, 808, 809, 501, + 502, 503, 810, 504, 505, 811, 506, 507, 0, 508, + 509, 0, 0, 510, 0, 0, 511, 0, 512, 0, + 812, 514, 0, 0, 813, 814, 815, 816, 515, 0, + 0, 516, 817, 0, 818, 517, 518, 519, 520, 521, + 819, 820, 0, 0, 0, 0, 0, 0, 524, 525, + 0, 526, 527, 528, 0, 0, 821, 0, 0, 0, + 0, 0, 0, 0, 822, 823, 0, 0, 0, 0, + 824, 825, 0, 0, 826, 827, 0, 0, 828, 829, + 159, 0, 160, 715, 162, 163, 164, 165, 0, 0, + 166, 0, 0, 0, 167, 0, 0, 716, 0, 169, + 170, 171, 172, 173, 174, 175, 717, 177, 0, 178, + 0, 0, 718, 179, 719, 720, 721, 180, 722, 0, + 181, 182, 183, 0, 184, 0, 185, 186, 0, 0, + 187, 723, 724, 188, 189, 0, 190, 725, 726, 192, + 193, 0, 194, 195, 196, 197, 727, 199, 0, 728, + 201, 729, 730, 731, 732, 733, 0, 207, 208, 209, + 210, 211, 212, 213, 214, 0, 215, 216, 0, 217, + 218, 219, 734, 221, 0, 222, 735, 736, 223, 0, + 0, 224, 737, 225, 738, 739, 226, 0, 227, 740, + 741, 0, 228, 229, 230, 742, 743, 744, 0, 0, + 0, 0, 745, 233, 746, 0, 0, 747, 234, 0, + 235, 0, 0, 0, 0, 236, 0, 237, 238, 239, + 240, 241, 0, 0, 0, 0, 242, 0, 0, 243, + 244, 245, 0, 0, 0, 246, 0, 247, 248, 0, + 249, 250, 251, 0, 252, 253, 0, 254, 255, 256, + 257, 258, 259, 260, 748, 0, 261, 262, 263, 264, + 749, 750, 265, 266, 0, 267, 268, 269, 751, 0, + 270, 0, 0, 0, 752, 272, 0, 273, 0, 274, + 0, 275, 276, 753, 278, 754, 280, 281, 0, 282, + 0, 755, 283, 284, 285, 0, 286, 756, 757, 0, + 287, 288, 0, 0, 0, 758, 290, 291, 292, 293, + 759, 0, 0, 294, 295, 296, 0, 0, 297, 0, + 0, 0, 760, 298, 299, 761, 0, 0, 300, 0, + 301, 302, 0, 303, 304, 0, 0, 0, 305, 0, + 0, 306, 307, 762, 0, 0, 309, 0, 763, 310, + 311, 0, 0, 0, 0, 0, 764, 313, 0, 314, + 0, 315, 0, 316, 317, 0, 0, 765, 0, 0, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 0, 334, 335, + 336, 337, 766, 338, 339, 340, 341, 767, 342, 343, + 344, 0, 0, 0, 0, 345, 346, 347, 348, 768, + 350, 0, 0, 769, 352, 770, 353, 0, 354, 771, + 772, 773, 774, 775, 359, 360, 361, 362, 363, 364, + 0, 776, 365, 0, 0, 366, 367, 368, 369, 777, + 778, 779, 370, 371, 0, 780, 781, 372, 0, 373, + 374, 782, 0, 376, 377, 378, 379, 0, 380, 381, + 0, 0, 0, 0, 0, 0, 0, 0, 382, 383, + 384, 0, 783, 385, 0, 386, 0, 387, 388, 784, + 390, 391, 392, 393, 785, 786, 396, 787, 0, 397, + 398, 399, 0, 400, 0, 401, 402, 403, 404, 405, + 0, 788, 407, 408, 0, 0, 409, 0, 0, 0, + 410, 411, 412, 413, 414, 0, 0, 415, 416, 417, + 418, 419, 0, 420, 421, 0, 422, 423, 424, 789, + 790, 425, 0, 426, 0, 427, 428, 0, 429, 430, + 0, 431, 0, 791, 0, 792, 433, 434, 435, 436, + 437, 438, 793, 794, 441, 442, 443, 444, 0, 795, + 446, 0, 0, 0, 447, 448, 449, 450, 0, 0, + 0, 451, 0, 0, 0, 452, 0, 453, 454, 455, + 456, 457, 458, 0, 459, 460, 461, 462, 463, 464, + 0, 0, 0, 0, 0, 0, 465, 466, 0, 467, + 0, 0, 468, 0, 0, 0, 469, 470, 471, 0, + 0, 0, 472, 796, 797, 473, 474, 0, 475, 476, + 798, 478, 479, 480, 799, 800, 481, 482, 483, 484, + 801, 485, 486, 0, 0, 487, 488, 489, 490, 0, + 802, 491, 492, 0, 803, 804, 805, 806, 0, 0, + 0, 0, 0, 497, 498, 499, 0, 807, 808, 809, + 501, 502, 503, 810, 504, 505, 811, 506, 507, 0, + 508, 509, 0, 0, 510, 0, 0, 511, 0, 512, + 0, 812, 514, 0, 0, 813, 814, 815, 816, 515, + 0, 0, 516, 817, 0, 818, 517, 518, 519, 520, + 521, 819, 820, 0, 0, 0, 0, 0, 0, 524, + 525, 0, 526, 527, 528, 0, 0, 821, 0, 0, + 0, 0, 0, 0, 0, 822, 823, 0, 0, 0, + 0, 824, 825, 0, 0, 826, 827, 0, 0, 828, + 829, 159, 0, 160, 715, 162, 163, 164, 165, 0, + 0, 166, 0, 0, 0, 167, 0, 0, 716, 0, + 169, 170, 171, 172, 173, 174, 175, 717, 177, 0, + 178, 0, 0, 718, 179, 719, 720, 721, 180, 722, + 0, 181, 182, 183, 0, 184, 0, 185, 186, 0, + 0, 187, 723, 724, 188, 189, 0, 190, 725, 726, + 192, 193, 0, 194, 195, 196, 197, 727, 199, 0, + 728, 201, 729, 730, 731, 732, 733, 0, 207, 208, + 209, 210, 211, 212, 213, 214, 0, 215, 216, 0, + 217, 218, 219, 734, 221, 0, 222, 735, 736, 223, + 0, 0, 224, 737, 225, 738, 739, 226, 0, 227, + 740, 741, 0, 228, 229, 230, 742, 743, 744, 0, + 0, 0, 0, 745, 233, 746, 0, 0, 747, 234, + 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, + 239, 240, 241, 0, 0, 0, 0, 242, 0, 0, + 243, 244, 245, 0, 0, 0, 246, 0, 247, 248, + 0, 249, 250, 251, 0, 252, 253, 0, 254, 255, + 256, 257, 258, 259, 260, 748, 0, 261, 262, 263, + 264, 749, 750, 265, 266, 0, 267, 268, 269, 751, + 0, 270, 0, 0, 0, 752, 272, 0, 273, 0, + 274, 0, 275, 276, 753, 278, 754, 280, 281, 0, + 282, 0, 755, 283, 284, 285, 0, 286, 756, 757, + 0, 287, 288, 0, 0, 0, 758, 290, 291, 292, + 293, 759, 0, 0, 294, 295, 296, 0, 0, 297, + 0, 0, 0, 760, 298, 299, 761, 0, 0, 300, + 0, 301, 302, 0, 303, 304, 0, 0, 0, 305, + 0, 0, 306, 307, 762, 0, 0, 309, 0, 763, + 310, 311, 0, 0, 0, 0, 0, 764, 313, 0, + 314, 0, 315, 0, 316, 317, 0, 0, 765, 0, + 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, + 335, 336, 337, 766, 338, 339, 340, 341, 767, 342, + 343, 344, 0, 0, 0, 0, 345, 346, 347, 348, + 768, 350, 0, 0, 769, 352, 770, 353, 0, 354, + 771, 772, 773, 774, 775, 359, 360, 361, 362, 363, + 364, 0, 776, 365, 0, 0, 366, 367, 368, 369, + 777, 778, 779, 370, 371, 0, 780, 781, 372, 0, + 373, 374, 782, 0, 376, 377, 378, 379, 0, 380, + 381, 0, 0, 0, 0, 0, 0, 0, 0, 382, + 383, 384, 0, 783, 385, 0, 386, 0, 387, 388, + 784, 390, 391, 392, 393, 785, 786, 396, 787, 0, + 397, 398, 399, 0, 400, 0, 401, 402, 403, 404, + 405, 0, 788, 407, 408, 0, 0, 409, 0, 0, + 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, + 417, 418, 419, 0, 420, 421, 0, 422, 423, 424, + 789, 790, 425, 0, 426, 0, 427, 428, 0, 429, + 430, 0, 431, 0, 791, 0, 792, 433, 434, 435, + 436, 437, 438, 793, 794, 441, 442, 443, 444, 0, + 795, 446, 0, 0, 0, 447, 448, 449, 450, 0, + 0, 0, 451, 0, 0, 0, 452, 0, 453, 454, + 455, 456, 457, 458, 0, 459, 460, 461, 462, 463, + 464, 0, 0, 0, 0, 0, 0, 465, 466, 0, + 467, 0, 0, 468, 0, 0, 0, 469, 470, 471, + 0, 0, 0, 472, 796, 797, 473, 474, 0, 475, + 476, 798, 478, 479, 480, 799, 800, 481, 482, 483, + 484, 801, 485, 486, 0, 0, 487, 488, 489, 490, + 0, 802, 491, 492, 0, 803, 804, 805, 806, 0, + 0, 0, 0, 0, 497, 498, 499, 0, 807, 808, + 809, 501, 502, 503, 810, 504, 505, 811, 506, 507, + 0, 508, 509, 0, 0, 510, 0, 0, 511, 0, + 512, 0, 812, 514, 0, 0, 813, 814, 815, 816, + 515, 0, 0, 516, 817, 0, 818, 517, 518, 519, + 520, 521, 819, 820, 0, 0, 0, 0, 0, 0, + 524, 525, 0, 526, 527, 528, 0, 0, 821, 0, + 0, 0, 0, 0, 0, 0, 822, 823, 0, 0, + 0, 0, 824, 1231, 0, 0, 826, 827, 0, 0, + 828, 829, 159, 0, 160, 715, 162, 163, 164, 165, + 1903, 0, 166, 0, 0, 0, 1904, 0, 0, 716, + 0, 169, 170, 171, 172, 173, 174, 175, 717, 177, + 0, 178, 0, 0, 718, 179, 719, 720, 721, 180, + 722, 0, 181, 182, 183, 0, 184, 0, 185, 186, + 0, 0, 187, 723, 724, 188, 189, 0, 190, 725, + 726, 192, 193, 0, 194, 195, 196, 197, 727, 199, + 0, 728, 201, 729, 730, 731, 732, 733, 0, 207, + 208, 209, 210, 211, 212, 213, 214, 0, 215, 216, + 0, 217, 218, 219, 734, 221, 0, 222, 735, 736, + 223, 0, 0, 224, 737, 225, 738, 739, 226, 0, + 227, 740, 741, 0, 228, 229, 230, 742, 743, 744, + 0, 0, 0, 0, 745, 233, 746, 0, 0, 747, + 234, 0, 235, 0, 0, 0, 0, 236, 0, 237, + 238, 239, 240, 241, 0, 0, 0, 0, 242, 0, + 0, 243, 244, 245, 0, 0, 0, 246, 0, 247, + 248, 0, 249, 250, 251, 0, 252, 253, 0, 254, + 255, 256, 257, 258, 259, 260, 748, 0, 261, 262, + 263, 264, 749, 750, 265, 266, 0, 267, 268, 269, + 751, 0, 270, 0, 0, 0, 752, 272, 0, 273, + 0, 274, 0, 275, 276, 753, 278, 754, 280, 281, + 0, 282, 0, 755, 283, 284, 285, 0, 286, 756, + 757, 0, 287, 288, 0, 0, 0, 758, 290, 291, + 292, 293, 759, 0, 0, 294, 295, 296, 0, 0, + 297, 0, 0, 0, 760, 298, 299, 761, 0, 0, + 300, 0, 301, 302, 0, 303, 304, 0, 0, 0, + 305, 0, 0, 306, 307, 762, 0, 0, 309, 0, + 763, 310, 311, 0, 0, 0, 0, 0, 764, 313, + 0, 314, 0, 315, 0, 316, 317, 0, 0, 765, + 0, 0, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 0, + 334, 335, 336, 337, 766, 338, 339, 340, 341, 767, + 342, 343, 344, 0, 0, 0, 0, 345, 346, 347, + 348, 768, 350, 0, 0, 769, 352, 770, 353, 0, + 354, 771, 772, 773, 774, 775, 359, 360, 361, 362, + 363, 364, 0, 776, 365, 0, 0, 366, 367, 368, + 369, 777, 0, 779, 370, 371, 0, 780, 781, 372, + 0, 373, 374, 782, 0, 376, 377, 378, 379, 0, + 380, 381, 0, 0, 0, 0, 0, 0, 0, 0, + 382, 383, 384, 0, 783, 385, 0, 386, 0, 387, + 388, 784, 390, 391, 392, 393, 785, 786, 396, 787, + 0, 397, 398, 399, 0, 400, 0, 401, 402, 403, + 404, 405, 0, 788, 407, 408, 0, 0, 409, 0, + 0, 0, 410, 411, 412, 413, 414, 0, 0, 415, + 416, 417, 418, 419, 0, 420, 421, 0, 422, 423, + 424, 789, 790, 425, 0, 426, 0, 427, 428, 0, + 429, 430, 0, 431, 0, 791, 0, 792, 433, 434, + 435, 436, 437, 438, 793, 794, 441, 442, 443, 444, + 0, 795, 446, 0, 0, 0, 447, 448, 449, 450, + 0, 0, 0, 451, 0, 0, 0, 452, 0, 453, + 454, 455, 456, 457, 458, 0, 459, 460, 461, 462, + 463, 464, 0, 0, 0, 0, 0, 0, 465, 466, + 0, 467, 0, 0, 468, 0, 0, 0, 469, 470, + 471, 0, 0, 0, 472, 796, 797, 473, 474, 0, + 475, 476, 798, 478, 479, 480, 799, 800, 481, 482, + 483, 484, 801, 485, 486, 0, 0, 487, 488, 489, + 490, 0, 802, 491, 492, 0, 803, 804, 805, 806, + 0, 0, 0, 0, 0, 497, 498, 499, 0, 807, + 808, 809, 501, 502, 503, 810, 504, 505, 811, 506, + 507, 0, 508, 509, 0, 0, 510, 0, 0, 511, + 0, 512, 0, 812, 514, 0, 0, 813, 814, 815, + 816, 515, 0, 0, 516, 817, 0, 818, 517, 518, + 519, 520, 521, 819, 820, 0, 0, 0, 0, 0, + 0, 524, 525, 0, 526, 527, 528, 0, 0, 821, + 0, 0, 0, 0, 0, 0, 0, 822, 823, 0, + 0, 0, 0, 824, 825, 0, 0, 826, 827, 0, + 0, 828, 829, 159, 0, 160, 715, 162, 163, 164, + 165, 0, 0, 166, 0, 0, 0, 167, 0, 0, + 716, 0, 169, 170, 171, 172, 173, 174, 175, 717, + 177, 0, 178, 0, 0, 718, 179, 719, 720, 721, + 180, 722, 0, 181, 182, 183, 0, 184, 0, 185, + 186, 0, 0, 187, 723, 724, 188, 189, 0, 190, + 725, 726, 192, 193, 0, 194, 195, 196, 197, 727, + 199, 0, 728, 201, 729, 730, 731, 732, 733, 0, + 207, 208, 209, 210, 211, 212, 213, 214, 0, 215, + 216, 0, 217, 218, 219, 734, 221, 0, 222, 735, + 736, 223, 0, 0, 224, 737, 225, 738, 739, 226, + 0, 227, 740, 741, 0, 228, 229, 230, 742, 743, + 744, 0, 0, 0, 0, 745, 233, 746, 0, 0, + 747, 234, 0, 235, 0, 0, 0, 0, 236, 0, + 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, + 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, + 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, + 254, 255, 256, 257, 258, 259, 260, 748, 0, 261, + 262, 263, 264, 749, 750, 265, 266, 0, 267, 268, + 269, 751, 0, 270, 0, 0, 0, 752, 272, 0, + 273, 0, 274, 0, 275, 276, 753, 278, 754, 280, + 281, 0, 282, 0, 755, 283, 284, 285, 0, 286, + 756, 757, 0, 287, 288, 0, 0, 0, 758, 290, + 291, 292, 293, 759, 0, 0, 294, 295, 296, 0, + 0, 297, 0, 0, 0, 760, 298, 299, 761, 0, + 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, + 0, 305, 0, 0, 306, 307, 762, 0, 0, 309, + 0, 763, 310, 311, 0, 0, 0, 0, 0, 764, + 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, + 765, 0, 0, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 0, 334, 335, 336, 337, 766, 338, 339, 340, 341, + 767, 342, 343, 344, 0, 0, 0, 0, 345, 346, + 347, 348, 768, 350, 0, 0, 769, 352, 770, 353, + 0, 354, 771, 772, 773, 774, 775, 359, 360, 361, + 362, 363, 364, 0, 776, 365, 0, 0, 366, 367, + 368, 369, 777, 778, 779, 370, 371, 0, 780, 781, + 372, 0, 373, 374, 782, 0, 376, 377, 378, 379, + 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, + 0, 382, 383, 384, 0, 783, 385, 0, 386, 0, + 387, 388, 784, 390, 391, 392, 393, 785, 786, 396, + 787, 0, 397, 398, 399, 0, 400, 0, 401, 402, + 403, 404, 405, 0, 788, 407, 408, 0, 0, 409, + 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, + 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, + 423, 424, 789, 790, 425, 0, 426, 0, 427, 428, + 0, 429, 430, 0, 431, 0, 791, 0, 792, 433, + 434, 435, 436, 437, 438, 793, 794, 441, 442, 443, + 444, 0, 795, 446, 0, 0, 0, 447, 448, 449, + 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, + 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, + 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, + 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, + 470, 471, 0, 0, 0, 472, 796, 797, 473, 474, + 0, 475, 476, 798, 478, 479, 480, 799, 800, 481, + 482, 483, 484, 801, 485, 486, 0, 0, 487, 488, + 489, 490, 0, 802, 491, 492, 0, 803, 804, 805, + 806, 0, 0, 0, 0, 0, 497, 498, 499, 0, + 807, 808, 809, 501, 502, 503, 810, 504, 505, 811, + 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, + 511, 0, 512, 0, 2010, 514, 0, 0, 813, 814, + 815, 816, 515, 0, 0, 516, 817, 0, 818, 517, + 518, 519, 520, 521, 819, 820, 0, 0, 0, 0, + 0, 0, 524, 525, 0, 526, 527, 528, 0, 0, + 821, 0, 0, 0, 0, 0, 0, 0, 822, 823, + 0, 0, 0, 0, 824, 825, 0, 0, 826, 827, + 0, 0, 828, 829, 159, 0, 160, 715, 162, 163, + 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, + 0, 716, 0, 169, 170, 171, 172, 173, 174, 175, + 717, 177, 0, 178, 0, 0, 718, 179, 719, 720, + 721, 180, 722, 0, 181, 182, 183, 0, 184, 0, + 185, 186, 0, 0, 187, 723, 724, 188, 189, 0, + 190, 725, 726, 192, 193, 0, 194, 195, 196, 197, + 727, 199, 0, 728, 201, 729, 730, 731, 732, 733, + 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, + 215, 216, 0, 217, 218, 219, 734, 221, 0, 222, + 735, 736, 223, 0, 0, 224, 737, 225, 738, 739, + 226, 0, 227, 740, 741, 0, 228, 229, 230, 742, + 743, 744, 0, 0, 0, 0, 745, 233, 746, 0, + 0, 747, 234, 0, 235, 0, 0, 0, 0, 236, + 0, 237, 238, 239, 240, 241, 0, 0, 0, 0, + 242, 0, 0, 243, 244, 245, 0, 0, 0, 246, + 0, 247, 248, 0, 249, 250, 251, 0, 252, 253, + 0, 254, 255, 256, 257, 258, 259, 260, 748, 0, + 261, 262, 263, 264, 749, 750, 265, 266, 0, 267, + 268, 269, 751, 0, 270, 0, 0, 0, 752, 272, + 0, 273, 0, 274, 0, 275, 276, 753, 278, 754, + 280, 281, 0, 282, 0, 755, 283, 284, 285, 0, + 286, 756, 757, 0, 287, 288, 0, 0, 0, 758, + 290, 291, 292, 293, 759, 0, 0, 294, 295, 296, + 0, 0, 297, 0, 0, 0, 760, 298, 299, 2886, + 0, 0, 300, 0, 301, 302, 0, 303, 304, 0, + 0, 0, 305, 0, 0, 306, 307, 762, 0, 0, + 309, 0, 763, 310, 311, 0, 0, 0, 0, 0, + 764, 313, 0, 314, 0, 315, 0, 316, 317, 0, + 0, 765, 0, 0, 0, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 0, 334, 335, 336, 337, 766, 338, 339, 340, + 341, 767, 342, 343, 344, 0, 0, 0, 0, 345, + 346, 347, 348, 768, 350, 0, 0, 769, 352, 770, + 353, 0, 354, 771, 772, 773, 774, 775, 359, 360, + 361, 362, 363, 364, 0, 776, 365, 0, 0, 366, + 367, 368, 369, 777, 778, 779, 370, 371, 0, 780, + 781, 372, 0, 373, 374, 782, 0, 376, 377, 378, + 379, 0, 380, 381, 0, 0, 0, 0, 0, 0, + 0, 0, 382, 383, 384, 0, 783, 385, 0, 386, + 0, 387, 388, 784, 390, 391, 392, 393, 785, 786, + 396, 787, 0, 397, 398, 399, 0, 400, 0, 401, + 402, 403, 404, 405, 0, 788, 407, 408, 0, 0, + 409, 0, 0, 0, 410, 411, 412, 413, 414, 0, + 0, 415, 416, 417, 418, 419, 0, 420, 421, 0, + 422, 423, 424, 789, 790, 425, 0, 426, 0, 427, + 428, 0, 429, 430, 0, 431, 0, 791, 0, 792, + 433, 434, 435, 436, 437, 438, 793, 794, 441, 442, + 443, 444, 0, 795, 446, 0, 0, 0, 447, 448, + 449, 450, 0, 0, 0, 451, 0, 0, 0, 452, + 0, 453, 454, 455, 456, 457, 458, 0, 459, 460, + 461, 462, 463, 464, 0, 0, 0, 0, 0, 0, + 465, 466, 0, 467, 0, 0, 468, 0, 0, 0, + 469, 470, 471, 0, 0, 0, 472, 796, 797, 473, + 474, 0, 475, 476, 798, 478, 479, 480, 799, 800, + 481, 482, 483, 484, 801, 485, 486, 0, 0, 487, + 488, 489, 490, 0, 802, 491, 492, 0, 803, 804, + 805, 806, 0, 0, 0, 0, 0, 497, 498, 499, + 0, 807, 808, 809, 501, 502, 503, 810, 504, 505, + 811, 506, 507, 0, 508, 509, 0, 0, 510, 0, + 0, 511, 0, 512, 0, 812, 514, 0, 0, 813, + 814, 815, 816, 515, 0, 0, 516, 817, 0, 818, + 517, 518, 519, 520, 521, 819, 820, 0, 0, 0, + 0, 0, 0, 524, 525, 0, 526, 527, 528, 0, + 0, 821, 0, 0, 0, 0, 0, 0, 0, 822, + 823, 0, 0, 0, 0, 824, 825, 0, 0, 826, + 827, 0, 0, 828, 829, 159, 0, 160, 715, 162, + 163, 164, 165, 0, 0, 166, 0, 0, 0, 167, + 0, 0, 716, 0, 169, 170, 171, 172, 173, 174, + 175, 717, 177, 0, 178, 0, 0, 718, 179, 719, + 720, 721, 180, 722, 0, 181, 182, 183, 0, 184, + 0, 185, 186, 0, 0, 187, 723, 724, 188, 189, + 0, 190, 725, 726, 192, 193, 0, 194, 195, 196, + 197, 727, 199, 0, 728, 201, 729, 730, 731, 732, + 733, 0, 207, 208, 209, 210, 211, 212, 213, 214, + 0, 215, 216, 0, 217, 218, 219, 734, 221, 0, + 222, 735, 736, 223, 0, 0, 224, 737, 225, 738, + 739, 226, 0, 227, 740, 741, 0, 228, 229, 230, + 742, 743, 744, 0, 0, 0, 0, 745, 233, 746, + 0, 0, 747, 234, 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, @@ -5774,73 +6391,7 @@ static const yytype_int16 yytable[] = 0, 286, 756, 757, 0, 287, 288, 0, 0, 0, 758, 290, 291, 292, 293, 759, 0, 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, 760, 298, 299, - 761, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 762, 0, - 0, 309, 0, 763, 310, 311, 0, 0, 0, 0, - 0, 764, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 765, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 766, 338, 339, - 340, 341, 767, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 768, 350, 0, 0, 769, 352, - 770, 353, 0, 354, 771, 772, 773, 774, 775, 359, - 360, 361, 362, 363, 364, 0, 776, 365, 0, 0, - 366, 367, 368, 369, 777, 778, 779, 370, 371, 0, - 780, 781, 372, 0, 373, 374, 782, 2143, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 783, 385, 0, - 386, 0, 387, 388, 784, 390, 391, 392, 393, 785, - 786, 396, 787, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 788, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 789, 790, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 791, 0, - 792, 433, 434, 435, 436, 437, 438, 793, 794, 441, - 442, 443, 444, 0, 795, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 796, 797, - 473, 474, 0, 475, 476, 798, 478, 479, 480, 799, - 800, 481, 482, 483, 484, 801, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 802, 491, 492, 0, 803, - 804, 805, 806, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 807, 808, 809, 501, 502, 503, 810, 504, - 505, 811, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 812, 514, 0, 0, - 813, 814, 815, 816, 515, 0, 0, 516, 817, 0, - 818, 517, 518, 519, 520, 521, 819, 820, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 821, 0, 0, 0, 0, 0, 0, 0, - 822, 823, 0, 0, 0, 0, 824, 825, 0, 0, - 826, 827, 0, 0, 828, 829, 159, 0, 160, 715, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 716, 0, 169, 170, 171, 172, 173, - 174, 175, 717, 177, 0, 178, 0, 0, 718, 179, - 719, 720, 721, 180, 722, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 723, 724, 188, - 189, 0, 190, 725, 726, 192, 193, 0, 194, 195, - 196, 197, 727, 199, 0, 728, 201, 729, 730, 731, - 732, 733, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 734, 221, - 0, 222, 735, 736, 223, 0, 0, 224, 737, 225, - 738, 739, 226, 0, 227, 740, 741, 0, 228, 229, - 230, 742, 743, 744, 0, 0, 0, 0, 745, 233, - 746, 0, 0, 747, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 748, - 0, 261, 262, 263, 264, 749, 750, 265, 266, 0, - 267, 268, 269, 751, 0, 270, 0, 0, 0, 752, - 272, 2437, 273, 0, 274, 0, 275, 276, 753, 278, - 754, 280, 281, 0, 282, 0, 755, 283, 284, 285, - 0, 286, 756, 757, 0, 287, 288, 0, 0, 0, - 758, 290, 291, 292, 293, 759, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 760, 298, 299, - 761, 0, 0, 300, 0, 301, 302, 0, 303, 304, + 2938, 0, 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, 307, 762, 0, 0, 309, 0, 763, 310, 311, 0, 0, 0, 0, 0, 764, 313, 0, 314, 0, 315, 0, 316, 317, @@ -5894,9842 +6445,7165 @@ static const yytype_int16 yytable[] = 0, 222, 735, 736, 223, 0, 0, 224, 737, 225, 738, 739, 226, 0, 227, 740, 741, 0, 228, 229, 230, 742, 743, 744, 0, 0, 0, 0, 745, 233, - 746, 0, 0, 747, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 748, - 0, 261, 262, 263, 264, 749, 750, 265, 266, 0, - 267, 268, 269, 751, 0, 270, 0, 0, 0, 752, - 272, 2439, 273, 0, 274, 0, 275, 276, 753, 278, - 754, 280, 281, 0, 282, 0, 755, 283, 284, 285, - 0, 286, 756, 757, 0, 287, 288, 0, 0, 0, - 758, 290, 291, 292, 293, 759, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 760, 298, 299, - 761, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 762, 0, - 0, 309, 0, 763, 310, 311, 0, 0, 0, 0, - 0, 764, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 765, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 766, 338, 339, - 340, 341, 767, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 768, 350, 0, 0, 769, 352, - 770, 353, 0, 354, 771, 772, 773, 774, 775, 359, - 360, 361, 362, 363, 364, 0, 776, 365, 0, 0, - 366, 367, 368, 369, 777, 778, 779, 370, 371, 0, - 780, 781, 372, 0, 373, 374, 782, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 783, 385, 0, - 386, 0, 387, 388, 784, 390, 391, 392, 393, 785, - 786, 396, 787, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 788, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 789, 790, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 791, 0, - 792, 433, 434, 435, 436, 437, 438, 793, 794, 441, - 442, 443, 444, 0, 795, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 796, 797, - 473, 474, 0, 475, 476, 798, 478, 479, 480, 799, - 800, 481, 482, 483, 484, 801, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 802, 491, 492, 0, 803, - 804, 805, 806, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 807, 808, 809, 501, 502, 503, 810, 504, - 505, 811, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 812, 514, 0, 0, - 813, 814, 815, 816, 515, 0, 0, 516, 817, 0, - 818, 517, 518, 519, 520, 521, 819, 820, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 821, 0, 0, 0, 0, 0, 0, 0, - 822, 823, 0, 0, 0, 0, 824, 825, 0, 0, - 826, 827, 0, 0, 828, 829, 159, 0, 160, 715, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 716, 0, 169, 170, 171, 172, 173, - 174, 175, 717, 177, 0, 178, 0, 0, 718, 179, - 719, 720, 721, 180, 722, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 723, 724, 188, - 189, 0, 190, 725, 726, 192, 193, 0, 194, 195, - 196, 197, 727, 199, 0, 728, 201, 729, 730, 731, - 732, 733, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 734, 221, - 0, 222, 735, 736, 223, 0, 0, 224, 737, 225, - 738, 739, 226, 0, 227, 740, 741, 0, 228, 229, - 230, 742, 743, 744, 0, 0, 0, 0, 745, 233, - 746, 0, 0, 747, 234, 0, 235, 0, 0, 0, + 746, 0, 0, 3828, 234, 0, 235, 0, 0, 0, + 0, 236, 0, 237, 238, 239, 240, 241, 0, 0, + 0, 0, 242, 0, 0, 243, 244, 245, 0, 0, + 0, 246, 0, 247, 248, 0, 249, 250, 251, 0, + 252, 253, 0, 254, 255, 256, 257, 258, 259, 260, + 748, 0, 261, 262, 263, 264, 749, 750, 265, 266, + 0, 267, 268, 269, 751, 0, 270, 0, 0, 0, + 752, 272, 0, 273, 0, 274, 0, 275, 276, 753, + 278, 754, 280, 281, 0, 282, 0, 755, 283, 284, + 285, 0, 286, 756, 757, 0, 287, 288, 0, 0, + 0, 758, 290, 291, 292, 293, 759, 0, 0, 294, + 295, 296, 0, 0, 297, 0, 0, 0, 760, 298, + 299, 761, 0, 0, 300, 0, 301, 302, 0, 303, + 304, 0, 0, 0, 305, 0, 0, 306, 307, 762, + 0, 0, 309, 0, 763, 310, 311, 0, 0, 0, + 0, 0, 764, 313, 0, 314, 0, 315, 0, 316, + 317, 0, 0, 765, 0, 0, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 0, 334, 335, 336, 337, 766, 338, + 339, 340, 341, 767, 342, 343, 344, 0, 0, 0, + 0, 345, 346, 347, 348, 768, 350, 0, 0, 769, + 352, 770, 353, 0, 354, 771, 772, 773, 774, 775, + 359, 360, 361, 362, 363, 364, 0, 776, 365, 0, + 0, 366, 367, 368, 369, 777, 778, 779, 370, 371, + 0, 780, 781, 372, 0, 373, 374, 782, 0, 376, + 377, 378, 379, 0, 380, 381, 0, 0, 0, 0, + 0, 0, 0, 0, 382, 383, 384, 0, 783, 385, + 0, 386, 0, 387, 388, 784, 390, 391, 392, 393, + 785, 786, 396, 787, 0, 397, 398, 399, 0, 400, + 0, 401, 402, 403, 404, 405, 0, 788, 407, 408, + 0, 0, 409, 0, 0, 0, 410, 411, 412, 413, + 414, 0, 0, 415, 416, 417, 418, 419, 0, 420, + 421, 0, 422, 423, 424, 789, 790, 425, 0, 426, + 0, 427, 428, 0, 429, 430, 0, 431, 0, 791, + 0, 792, 433, 434, 435, 436, 437, 438, 793, 794, + 441, 442, 443, 444, 0, 795, 446, 0, 0, 0, + 447, 448, 449, 450, 0, 0, 0, 451, 0, 0, + 0, 452, 0, 453, 454, 455, 456, 457, 458, 0, + 459, 460, 461, 462, 463, 464, 0, 0, 0, 0, + 0, 0, 465, 466, 0, 467, 0, 0, 468, 0, + 0, 0, 469, 470, 471, 0, 0, 0, 472, 796, + 797, 473, 474, 0, 475, 476, 798, 478, 479, 480, + 799, 800, 481, 482, 483, 484, 801, 485, 486, 0, + 0, 487, 488, 489, 490, 0, 802, 491, 492, 0, + 803, 804, 805, 806, 0, 0, 0, 0, 0, 497, + 498, 499, 0, 807, 808, 809, 501, 502, 503, 810, + 504, 505, 811, 506, 507, 0, 508, 509, 0, 0, + 510, 0, 0, 511, 0, 512, 0, 812, 514, 0, + 0, 813, 814, 815, 816, 515, 0, 0, 516, 817, + 0, 818, 517, 518, 519, 520, 521, 819, 820, 0, + 0, 0, 0, 0, 0, 524, 525, 0, 526, 527, + 528, 0, 0, 821, 0, 0, 0, 0, 0, 0, + 0, 822, 823, 0, 0, 0, 0, 824, 825, 0, + 0, 826, 827, 0, 0, 828, 829, 159, 0, 160, + 715, 162, 163, 164, 165, 0, 0, 166, 0, 0, + 0, 167, 0, 0, 716, 0, 169, 170, 171, 172, + 173, 174, 175, 717, 177, 0, 178, 0, 0, 718, + 179, 719, 720, 721, 180, 722, 0, 181, 182, 183, + 0, 184, 0, 185, 186, 0, 0, 187, 723, 724, + 188, 189, 0, 190, 725, 726, 192, 193, 0, 194, + 195, 196, 197, 727, 199, 0, 728, 201, 729, 730, + 731, 732, 733, 0, 207, 208, 209, 210, 211, 212, + 213, 214, 0, 215, 216, 0, 217, 218, 219, 734, + 221, 0, 222, 735, 736, 223, 0, 0, 224, 737, + 225, 738, 739, 226, 0, 227, 740, 741, 0, 228, + 229, 230, 742, 743, 744, 0, 0, 0, 0, 745, + 233, 746, 0, 0, 747, 234, 0, 235, 0, 0, + 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, + 0, 0, 0, 242, 0, 0, 243, 244, 245, 0, + 0, 0, 246, 0, 247, 248, 0, 249, 250, 251, + 0, 252, 253, 0, 254, 255, 256, 257, 258, 259, + 260, 748, 0, 261, 262, 263, 264, 749, 750, 265, + 266, 0, 267, 268, 269, 751, 0, 270, 0, 0, + 0, 752, 272, 0, 273, 0, 274, 0, 275, 276, + 753, 278, 754, 280, 281, 0, 282, 0, 755, 283, + 284, 285, 0, 286, 756, 757, 0, 287, 288, 0, + 0, 0, 758, 290, 291, 292, 293, 759, 0, 0, + 294, 295, 296, 0, 0, 297, 0, 0, 0, 760, + 298, 299, 761, 0, 0, 300, 0, 301, 302, 0, + 303, 304, 0, 0, 0, 305, 0, 0, 306, 307, + 762, 0, 0, 309, 0, 763, 310, 311, 0, 0, + 0, 0, 0, 764, 313, 0, 314, 0, 315, 0, + 316, 317, 0, 0, 765, 0, 0, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 0, 334, 335, 336, 337, 766, + 338, 339, 340, 341, 767, 342, 343, 344, 4817, 0, + 0, 0, 345, 346, 347, 348, 768, 350, 0, 0, + 769, 352, 770, 353, 0, 354, 771, 772, 773, 774, + 775, 359, 360, 361, 362, 363, 364, 0, 776, 365, + 0, 0, 366, 367, 368, 369, 777, 0, 779, 370, + 371, 0, 780, 781, 372, 0, 373, 374, 782, 0, + 376, 377, 378, 379, 0, 380, 381, 0, 0, 0, + 0, 0, 0, 0, 0, 382, 383, 384, 0, 783, + 385, 0, 386, 0, 387, 388, 784, 390, 391, 392, + 393, 785, 786, 396, 787, 0, 397, 398, 399, 0, + 400, 0, 401, 402, 403, 404, 405, 0, 788, 407, + 408, 0, 0, 409, 0, 0, 0, 410, 411, 412, + 413, 414, 0, 0, 415, 416, 417, 418, 419, 0, + 420, 421, 0, 422, 423, 424, 789, 790, 425, 0, + 426, 0, 427, 428, 0, 429, 430, 0, 431, 0, + 791, 0, 792, 433, 434, 435, 436, 437, 438, 793, + 794, 441, 442, 443, 444, 0, 795, 446, 0, 0, + 0, 447, 448, 449, 450, 0, 0, 0, 451, 0, + 0, 0, 452, 0, 453, 454, 455, 456, 457, 458, + 0, 459, 460, 461, 462, 463, 464, 0, 0, 0, + 0, 0, 0, 465, 466, 0, 467, 0, 0, 468, + 0, 0, 0, 469, 470, 471, 0, 0, 0, 472, + 796, 797, 473, 474, 0, 475, 476, 798, 478, 479, + 480, 799, 800, 481, 482, 483, 484, 801, 485, 486, + 0, 0, 487, 488, 489, 490, 0, 802, 491, 492, + 0, 803, 804, 805, 806, 0, 0, 0, 0, 0, + 497, 498, 499, 0, 807, 808, 809, 501, 502, 503, + 810, 504, 505, 811, 506, 507, 0, 508, 509, 0, + 0, 510, 0, 0, 511, 0, 512, 0, 812, 514, + 0, 0, 813, 814, 815, 816, 515, 0, 0, 516, + 817, 0, 818, 517, 518, 519, 520, 521, 819, 820, + 0, 0, 0, 0, 0, 0, 524, 525, 0, 526, + 527, 528, 0, 0, 821, 0, 0, 0, 0, 0, + 0, 0, 822, 823, 0, 0, 0, 0, 824, 825, + 0, 0, 826, 827, 0, 0, 828, 829, 159, 0, + 160, 715, 162, 163, 164, 165, 0, 0, 166, 0, + 0, 0, 167, 0, 0, 716, 0, 169, 170, 171, + 172, 173, 174, 175, 717, 177, 0, 178, 0, 0, + 718, 179, 719, 720, 721, 180, 722, 0, 181, 182, + 183, 0, 184, 0, 185, 186, 0, 0, 187, 723, + 724, 188, 189, 0, 190, 725, 726, 192, 193, 0, + 194, 195, 196, 197, 727, 199, 0, 728, 201, 729, + 730, 731, 732, 733, 0, 207, 208, 209, 210, 211, + 212, 213, 214, 0, 215, 216, 0, 217, 218, 219, + 734, 221, 0, 222, 735, 736, 223, 0, 0, 224, + 737, 225, 738, 739, 226, 0, 227, 740, 741, 0, + 228, 229, 230, 742, 743, 744, 0, 0, 0, 0, + 745, 233, 746, 0, 0, 747, 234, 0, 235, 0, + 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, + 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, + 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, + 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, + 259, 260, 748, 0, 261, 262, 263, 264, 749, 750, + 265, 266, 0, 267, 268, 269, 751, 0, 270, 0, + 0, 0, 752, 272, 0, 273, 0, 274, 0, 275, + 276, 753, 278, 754, 280, 281, 0, 282, 0, 755, + 283, 284, 285, 0, 286, 756, 757, 0, 287, 288, + 0, 0, 0, 758, 290, 291, 292, 293, 759, 0, + 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, + 760, 298, 299, 761, 0, 0, 300, 0, 301, 302, + 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, + 307, 762, 0, 0, 309, 0, 763, 310, 311, 0, + 0, 0, 0, 0, 764, 313, 0, 314, 0, 315, + 0, 316, 317, 0, 0, 765, 0, 0, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, + 766, 338, 339, 340, 341, 767, 342, 343, 344, 0, + 0, 0, 0, 345, 346, 347, 348, 768, 350, 0, + 0, 769, 352, 770, 353, 0, 354, 771, 772, 773, + 774, 775, 359, 360, 361, 362, 363, 364, 0, 776, + 365, 0, 0, 366, 367, 368, 369, 777, 0, 779, + 370, 371, 0, 780, 781, 372, 0, 373, 374, 782, + 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, + 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, + 783, 385, 0, 386, 0, 387, 388, 784, 390, 391, + 392, 393, 785, 786, 396, 787, 0, 397, 398, 399, + 0, 400, 0, 401, 402, 403, 404, 405, 0, 788, + 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, + 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, + 0, 420, 421, 0, 422, 423, 424, 789, 790, 425, + 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, + 0, 791, 0, 792, 433, 434, 435, 436, 437, 438, + 793, 794, 441, 442, 443, 444, 0, 795, 446, 0, + 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, + 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, + 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, + 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, + 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, + 472, 796, 797, 473, 474, 0, 475, 476, 798, 478, + 479, 480, 799, 800, 481, 482, 483, 484, 801, 485, + 486, 0, 0, 487, 488, 489, 490, 0, 802, 491, + 492, 0, 803, 804, 805, 806, 0, 0, 0, 0, + 0, 497, 498, 499, 0, 807, 808, 809, 501, 502, + 503, 810, 504, 505, 811, 506, 507, 0, 508, 509, + 0, 0, 510, 0, 0, 511, 0, 512, 0, 812, + 514, 0, 0, 813, 814, 815, 816, 515, 0, 0, + 516, 817, 0, 818, 517, 518, 519, 520, 521, 819, + 820, 0, 0, 0, 0, 0, 0, 524, 525, 0, + 526, 527, 528, 0, 0, 821, 0, 0, 0, 0, + 0, 0, 0, 822, 823, 0, 0, 0, 0, 824, + 825, 0, 0, 826, 827, 0, 0, 828, 829, 159, + 0, 160, 715, 162, 163, 164, 165, 0, 0, 166, + 0, 0, 0, 167, 0, 0, 716, 0, 169, 170, + 171, 172, 173, 174, 175, 717, 177, 0, 178, 0, + 0, 718, 179, 719, 720, 721, 180, 722, 0, 181, + 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, + 723, 724, 188, 189, 0, 190, 725, 726, 192, 193, + 0, 194, 195, 196, 197, 727, 199, 0, 728, 201, + 729, 730, 731, 732, 733, 0, 207, 208, 209, 210, + 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, + 219, 734, 221, 0, 222, 735, 736, 223, 0, 0, + 224, 737, 225, 738, 739, 226, 0, 227, 740, 741, + 0, 228, 229, 230, 742, 743, 744, 0, 0, 0, + 0, 745, 233, 746, 0, 0, 747, 234, 0, 235, + 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, + 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, + 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, + 250, 251, 0, 252, 253, 0, 254, 255, 256, 257, + 258, 259, 260, 748, 0, 261, 262, 263, 264, 749, + 750, 265, 266, 0, 267, 268, 269, 751, 0, 270, + 0, 0, 0, 752, 272, 0, 273, 0, 274, 0, + 275, 276, 753, 278, 754, 280, 281, 0, 282, 0, + 755, 283, 284, 285, 0, 286, 756, 757, 0, 287, + 288, 0, 0, 0, 758, 290, 291, 292, 293, 759, + 0, 0, 294, 295, 296, 0, 0, 297, 0, 0, + 0, 760, 298, 299, 1918, 0, 0, 300, 0, 301, + 302, 0, 303, 304, 0, 0, 0, 305, 0, 0, + 306, 307, 762, 0, 0, 309, 0, 763, 310, 311, + 0, 0, 0, 0, 0, 764, 313, 0, 314, 0, + 315, 0, 316, 317, 0, 0, 765, 0, 0, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, + 337, 766, 338, 339, 340, 341, 767, 342, 343, 344, + 0, 0, 0, 0, 345, 346, 347, 348, 768, 350, + 0, 0, 769, 352, 770, 353, 0, 354, 771, 772, + 773, 774, 775, 359, 360, 361, 362, 363, 364, 0, + 776, 365, 0, 0, 366, 367, 368, 369, 777, 0, + 779, 370, 371, 0, 780, 781, 372, 0, 373, 374, + 782, 0, 376, 377, 378, 379, 0, 380, 381, 0, + 0, 0, 0, 0, 0, 0, 0, 382, 383, 384, + 0, 783, 385, 0, 386, 0, 387, 388, 784, 390, + 391, 392, 393, 785, 786, 396, 787, 0, 397, 398, + 399, 0, 400, 0, 401, 402, 403, 404, 405, 0, + 788, 407, 408, 0, 0, 409, 0, 0, 0, 410, + 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, + 419, 0, 420, 421, 0, 422, 423, 424, 789, 790, + 425, 0, 426, 0, 427, 428, 0, 429, 430, 0, + 431, 0, 791, 0, 792, 433, 434, 435, 436, 437, + 438, 793, 794, 441, 442, 443, 444, 0, 795, 446, + 0, 0, 0, 447, 448, 449, 450, 0, 0, 0, + 451, 0, 0, 0, 452, 0, 453, 454, 455, 456, + 457, 458, 0, 459, 460, 461, 462, 463, 464, 0, + 0, 0, 0, 0, 0, 465, 466, 0, 467, 0, + 0, 468, 0, 0, 0, 469, 470, 471, 0, 0, + 0, 472, 796, 797, 473, 474, 0, 475, 476, 798, + 478, 479, 480, 799, 800, 481, 482, 483, 484, 801, + 485, 486, 0, 0, 487, 488, 489, 490, 0, 802, + 491, 492, 0, 803, 804, 805, 806, 0, 0, 0, + 0, 0, 497, 498, 499, 0, 807, 808, 809, 501, + 502, 503, 810, 504, 505, 811, 506, 507, 0, 508, + 509, 0, 0, 510, 0, 0, 511, 0, 512, 0, + 812, 514, 0, 0, 813, 814, 815, 816, 515, 0, + 0, 516, 817, 0, 818, 517, 518, 519, 520, 521, + 819, 820, 0, 0, 0, 0, 0, 0, 524, 525, + 0, 526, 527, 528, 0, 0, 821, 0, 0, 0, + 0, 0, 0, 0, 822, 823, 0, 0, 0, 0, + 824, 825, 0, 0, 826, 827, 0, 0, 828, 829, + 159, 0, 160, 715, 162, 163, 164, 165, 0, 0, + 166, 0, 0, 0, 167, 0, 0, 716, 0, 169, + 170, 171, 172, 173, 174, 175, 717, 177, 0, 178, + 0, 0, 718, 179, 719, 720, 721, 180, 722, 0, + 181, 182, 183, 0, 184, 0, 185, 186, 0, 0, + 187, 723, 724, 188, 189, 0, 190, 725, 726, 192, + 193, 0, 194, 195, 196, 197, 727, 199, 0, 728, + 201, 729, 730, 731, 732, 733, 0, 207, 208, 209, + 210, 211, 212, 213, 214, 0, 215, 216, 0, 217, + 218, 219, 734, 221, 0, 222, 735, 736, 223, 0, + 0, 224, 737, 225, 738, 739, 226, 0, 227, 740, + 741, 0, 228, 229, 230, 742, 743, 744, 0, 0, + 0, 0, 745, 233, 746, 0, 0, 747, 234, 0, + 235, 0, 0, 0, 0, 236, 0, 237, 238, 239, + 240, 241, 0, 0, 0, 0, 242, 0, 0, 243, + 244, 245, 0, 0, 0, 246, 0, 247, 248, 0, + 249, 250, 251, 0, 252, 253, 0, 254, 255, 256, + 257, 258, 259, 260, 748, 0, 261, 262, 263, 264, + 749, 750, 265, 266, 0, 267, 268, 269, 751, 0, + 270, 0, 0, 0, 752, 272, 0, 273, 0, 274, + 0, 275, 276, 753, 278, 754, 280, 281, 0, 282, + 0, 755, 283, 284, 285, 0, 286, 756, 757, 0, + 287, 288, 0, 0, 0, 758, 290, 291, 292, 293, + 759, 0, 0, 294, 295, 296, 0, 0, 297, 0, + 0, 0, 760, 298, 299, 1920, 0, 0, 300, 0, + 301, 302, 0, 303, 304, 0, 0, 0, 305, 0, + 0, 306, 307, 762, 0, 0, 309, 0, 763, 310, + 311, 0, 0, 0, 0, 0, 764, 313, 0, 314, + 0, 315, 0, 316, 317, 0, 0, 765, 0, 0, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 0, 334, 335, + 336, 337, 766, 338, 339, 340, 341, 767, 342, 343, + 344, 0, 0, 0, 0, 345, 346, 347, 348, 768, + 350, 0, 0, 769, 352, 770, 353, 0, 354, 771, + 772, 773, 774, 775, 359, 360, 361, 362, 363, 364, + 0, 776, 365, 0, 0, 366, 367, 368, 369, 777, + 0, 779, 370, 371, 0, 780, 781, 372, 0, 373, + 374, 782, 0, 376, 377, 378, 379, 0, 380, 381, + 0, 0, 0, 0, 0, 0, 0, 0, 382, 383, + 384, 0, 783, 385, 0, 386, 0, 387, 388, 784, + 390, 391, 392, 393, 785, 786, 396, 787, 0, 397, + 398, 399, 0, 400, 0, 401, 402, 403, 404, 405, + 0, 788, 407, 408, 0, 0, 409, 0, 0, 0, + 410, 411, 412, 413, 414, 0, 0, 415, 416, 417, + 418, 419, 0, 420, 421, 0, 422, 423, 424, 789, + 790, 425, 0, 426, 0, 427, 428, 0, 429, 430, + 0, 431, 0, 791, 0, 792, 433, 434, 435, 436, + 437, 438, 793, 794, 441, 442, 443, 444, 0, 795, + 446, 0, 0, 0, 447, 448, 449, 450, 0, 0, + 0, 451, 0, 0, 0, 452, 0, 453, 454, 455, + 456, 457, 458, 0, 459, 460, 461, 462, 463, 464, + 0, 0, 0, 0, 0, 0, 465, 466, 0, 467, + 0, 0, 468, 0, 0, 0, 469, 470, 471, 0, + 0, 0, 472, 796, 797, 473, 474, 0, 475, 476, + 798, 478, 479, 480, 799, 800, 481, 482, 483, 484, + 801, 485, 486, 0, 0, 487, 488, 489, 490, 0, + 802, 491, 492, 0, 803, 804, 805, 806, 0, 0, + 0, 0, 0, 497, 498, 499, 0, 807, 808, 809, + 501, 502, 503, 810, 504, 505, 811, 506, 507, 0, + 508, 509, 0, 0, 510, 0, 0, 511, 0, 512, + 0, 812, 514, 0, 0, 813, 814, 815, 816, 515, + 0, 0, 516, 817, 0, 818, 517, 518, 519, 520, + 521, 819, 820, 0, 0, 0, 0, 0, 0, 524, + 525, 0, 526, 527, 528, 0, 0, 821, 0, 0, + 0, 0, 0, 0, 0, 822, 823, 0, 0, 0, + 0, 824, 825, 0, 0, 826, 827, 0, 0, 828, + 829, 159, 0, 160, 161, 162, 163, 164, 165, 0, + 0, 166, 0, 0, 0, 167, 0, 0, 168, 0, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 0, + 178, 0, 0, 0, 179, 719, 0, 0, 180, 0, + 0, 181, 182, 183, 0, 184, 0, 185, 186, 0, + 0, 187, 0, 0, 188, 189, 0, 190, 191, 0, + 192, 193, 0, 194, 195, 196, 197, 198, 199, 0, + 200, 201, 202, 203, 204, 205, 206, 0, 207, 208, + 209, 210, 211, 212, 213, 214, 0, 215, 216, 0, + 217, 218, 219, 220, 221, 0, 222, 0, 0, 223, + 0, 0, 224, 0, 225, 0, 0, 226, 0, 227, + 0, 0, 0, 228, 229, 230, 0, 0, 1963, 0, + 0, 0, 0, 232, 233, 746, 0, 0, 0, 234, + 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, + 239, 240, 241, 0, 0, 0, 0, 242, 0, 0, + 243, 244, 245, 0, 0, 0, 246, 0, 247, 248, + 0, 249, 250, 251, 0, 252, 253, 0, 254, 255, + 256, 257, 258, 259, 260, 0, 0, 261, 262, 263, + 264, 0, 750, 265, 266, 0, 267, 268, 269, 751, + 0, 270, 0, 0, 0, 271, 272, 0, 273, 0, + 274, 0, 275, 276, 277, 278, 279, 280, 281, 0, + 282, 0, 0, 283, 284, 285, 0, 286, 756, 757, + 0, 287, 288, 0, 0, 0, 289, 290, 291, 292, + 293, 0, 0, 0, 294, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 298, 299, 0, 0, 0, 300, + 0, 301, 302, 0, 303, 304, 0, 0, 0, 305, + 0, 0, 306, 307, 308, 0, 0, 309, 0, 0, + 310, 311, 0, 0, 0, 0, 0, 312, 313, 0, + 314, 0, 315, 0, 316, 317, 0, 0, 765, 0, + 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, + 335, 336, 337, 0, 338, 339, 340, 341, 0, 342, + 343, 344, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 0, 0, 351, 352, 0, 353, 0, 354, + 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 0, 776, 365, 0, 0, 366, 367, 368, 369, + 0, 0, 0, 370, 371, 0, 780, 781, 372, 0, + 373, 374, 375, 0, 376, 377, 378, 379, 0, 380, + 381, 0, 0, 0, 0, 0, 0, 0, 0, 382, + 383, 384, 0, 0, 385, 0, 386, 0, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 0, 0, + 397, 398, 399, 0, 400, 0, 401, 402, 403, 404, + 405, 0, 406, 407, 408, 0, 0, 409, 0, 0, + 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, + 417, 418, 419, 0, 420, 421, 0, 422, 423, 424, + 0, 0, 425, 0, 426, 0, 427, 428, 0, 429, + 430, 0, 431, 0, 432, 0, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 0, + 445, 446, 0, 0, 0, 447, 448, 449, 450, 0, + 0, 0, 451, 0, 0, 0, 452, 0, 453, 454, + 455, 456, 457, 458, 0, 459, 460, 461, 462, 463, + 464, 0, 0, 0, 0, 0, 0, 465, 466, 0, + 467, 0, 0, 468, 0, 0, 0, 469, 470, 471, + 0, 0, 0, 472, 0, 0, 473, 474, 0, 475, + 476, 477, 478, 479, 480, 0, 0, 481, 482, 483, + 484, 0, 485, 486, 0, 0, 487, 488, 489, 490, + 0, 802, 491, 492, 0, 1964, 494, 495, 1965, 0, + 0, 0, 0, 0, 497, 498, 499, 0, 0, 808, + 500, 501, 502, 503, 810, 504, 505, 811, 506, 507, + 0, 508, 509, 0, 0, 510, 0, 0, 511, 0, + 512, 0, 513, 514, 0, 0, 0, 0, 0, 0, + 515, 0, 0, 516, 0, 0, 0, 517, 518, 519, + 520, 521, 522, 523, 0, 0, 0, 0, 0, 0, + 524, 525, 0, 526, 527, 528, 0, 0, 529, 0, + 0, 0, 0, 0, 0, 159, 0, 160, 161, 162, + 163, 164, 165, 0, 0, 166, 0, 0, 0, 167, + 828, 829, 168, 0, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 0, 178, 0, 0, 0, 179, 0, + 0, 0, 180, 0, 0, 181, 182, 183, 0, 184, + 0, 185, 186, 0, 0, 187, 0, 0, 188, 189, + 0, 190, 191, 0, 192, 193, 0, 194, 195, 196, + 197, 198, 199, 0, 200, 201, 202, 203, 204, 205, + 206, 0, 207, 208, 209, 210, 211, 212, 213, 214, + 0, 215, 216, 3213, 217, 218, 219, 220, 221, 0, + 222, 0, 0, 223, 0, 0, 224, 0, 225, 0, + 0, 226, 0, 227, 0, 0, 0, 228, 229, 230, + 0, 0, 231, 0, 0, 0, 0, 232, 233, 0, + 0, 0, 0, 234, 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 748, - 0, 261, 262, 263, 264, 749, 750, 265, 266, 0, - 267, 268, 269, 751, 0, 270, 0, 0, 0, 752, - 272, 2441, 273, 0, 274, 0, 275, 276, 753, 278, - 754, 280, 281, 0, 282, 0, 755, 283, 284, 285, - 0, 286, 756, 757, 0, 287, 288, 0, 0, 0, - 758, 290, 291, 292, 293, 759, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 760, 298, 299, - 761, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 762, 0, - 0, 309, 0, 763, 310, 311, 0, 0, 0, 0, - 0, 764, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 765, 0, 0, 0, 318, 319, 320, 321, + 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, + 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, + 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, + 272, 0, 273, 640, 274, 0, 275, 276, 277, 278, + 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, + 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, + 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, + 296, 2280, 0, 297, 0, 0, 0, 0, 298, 299, + 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, + 0, 0, 0, 305, 2281, 0, 306, 307, 308, 0, + 0, 309, 0, 0, 310, 311, 0, 3593, 0, 0, + 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, + 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 766, 338, 339, - 340, 341, 767, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 768, 350, 0, 0, 769, 352, - 770, 353, 0, 354, 771, 772, 773, 774, 775, 359, - 360, 361, 362, 363, 364, 0, 776, 365, 0, 0, - 366, 367, 368, 369, 777, 778, 779, 370, 371, 0, - 780, 781, 372, 0, 373, 374, 782, 0, 376, 377, + 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, + 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, + 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, + 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, + 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, + 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 783, 385, 0, - 386, 0, 387, 388, 784, 390, 391, 392, 393, 785, - 786, 396, 787, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 788, 407, 408, 0, + 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, + 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, + 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 789, 790, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 791, 0, - 792, 433, 434, 435, 436, 437, 438, 793, 794, 441, - 442, 443, 444, 0, 795, 446, 0, 0, 0, 447, + 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, + 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 0, 445, 446, 2585, 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, + 460, 461, 462, 463, 464, 642, 0, 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 796, 797, - 473, 474, 0, 475, 476, 798, 478, 479, 480, 799, - 800, 481, 482, 483, 484, 801, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 802, 491, 492, 0, 803, - 804, 805, 806, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 807, 808, 809, 501, 502, 503, 810, 504, - 505, 811, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 812, 514, 0, 0, - 813, 814, 815, 816, 515, 0, 0, 516, 817, 0, - 818, 517, 518, 519, 520, 521, 819, 820, 0, 0, + 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, + 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, + 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, + 487, 488, 489, 490, 0, 0, 491, 492, 0, 493, + 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, + 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, + 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, + 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, + 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, + 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 821, 0, 0, 0, 0, 0, 0, 0, - 822, 823, 0, 0, 0, 0, 824, 825, 0, 0, - 826, 827, 0, 0, 828, 829, 159, 0, 160, 715, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 716, 0, 169, 170, 171, 172, 173, - 174, 175, 717, 177, 0, 178, 0, 0, 718, 179, - 719, 720, 721, 180, 722, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 723, 724, 188, - 189, 0, 190, 725, 726, 192, 193, 0, 194, 195, - 196, 197, 727, 199, 0, 728, 201, 729, 730, 731, - 732, 733, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 734, 221, - 0, 222, 735, 736, 223, 0, 0, 224, 737, 225, - 738, 739, 226, 0, 227, 740, 741, 0, 228, 229, - 230, 742, 743, 744, 0, 0, 0, 0, 745, 233, - 746, 0, 0, 747, 234, 0, 235, 0, 0, 0, + 0, 0, 529, 0, 0, 0, 0, 159, 0, 160, + 161, 162, 163, 164, 165, 0, 0, 166, 0, 0, + 0, 167, 0, 0, 168, 3285, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 0, 178, 0, 0, 0, + 179, 0, 0, 0, 180, 0, 0, 181, 182, 183, + 0, 184, 0, 185, 186, 0, 0, 187, 0, 0, + 188, 189, 0, 190, 191, 0, 192, 193, 0, 194, + 195, 196, 197, 198, 199, 0, 200, 201, 202, 203, + 204, 205, 206, 0, 207, 208, 209, 210, 211, 212, + 213, 214, 0, 215, 216, 3213, 217, 218, 219, 220, + 221, 0, 222, 0, 0, 223, 0, 0, 224, 0, + 225, 0, 0, 226, 0, 227, 0, 0, 0, 228, + 229, 230, 0, 0, 231, 0, 0, 0, 0, 232, + 233, 0, 0, 0, 0, 234, 0, 235, 0, 0, + 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, + 0, 0, 0, 242, 0, 0, 243, 244, 245, 0, + 0, 0, 246, 0, 247, 248, 0, 249, 250, 251, + 0, 252, 253, 0, 254, 255, 256, 257, 258, 259, + 260, 0, 0, 261, 262, 263, 264, 0, 0, 265, + 266, 0, 267, 268, 269, 0, 0, 270, 0, 0, + 0, 271, 272, 0, 273, 640, 274, 0, 275, 276, + 277, 278, 279, 280, 281, 0, 282, 0, 0, 283, + 284, 285, 0, 286, 0, 0, 0, 287, 288, 0, + 0, 0, 289, 290, 291, 292, 293, 0, 0, 0, + 294, 295, 296, 2280, 0, 297, 0, 0, 0, 0, + 298, 299, 0, 0, 0, 300, 0, 301, 302, 0, + 303, 304, 0, 0, 0, 305, 2281, 0, 306, 307, + 308, 0, 0, 309, 0, 0, 310, 311, 0, 0, + 0, 0, 0, 312, 313, 0, 314, 0, 315, 0, + 316, 317, 0, 0, 0, 0, 0, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 0, 334, 335, 336, 337, 0, + 338, 339, 340, 341, 0, 342, 343, 344, 0, 0, + 0, 0, 345, 346, 347, 348, 349, 350, 0, 0, + 351, 352, 0, 353, 0, 354, 0, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 0, 0, 365, + 0, 0, 366, 367, 368, 369, 0, 0, 0, 370, + 371, 0, 0, 0, 372, 0, 373, 374, 375, 0, + 376, 377, 378, 379, 0, 380, 381, 0, 0, 0, + 0, 0, 0, 0, 0, 382, 383, 384, 0, 0, + 385, 0, 386, 0, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 0, 397, 398, 399, 0, + 400, 0, 401, 402, 403, 404, 405, 0, 406, 407, + 408, 0, 0, 409, 0, 0, 0, 410, 411, 412, + 413, 414, 0, 0, 415, 416, 417, 418, 419, 0, + 420, 421, 0, 422, 423, 424, 0, 0, 425, 0, + 426, 0, 427, 428, 0, 429, 430, 0, 431, 0, + 432, 0, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 0, 445, 446, 0, 0, + 0, 447, 448, 449, 450, 0, 0, 0, 451, 0, + 0, 0, 452, 0, 453, 454, 455, 456, 457, 458, + 0, 459, 460, 461, 462, 463, 464, 642, 0, 0, + 0, 0, 0, 465, 466, 0, 467, 0, 0, 468, + 0, 0, 0, 469, 470, 471, 0, 0, 0, 472, + 0, 0, 473, 474, 0, 475, 476, 477, 478, 479, + 480, 0, 0, 481, 482, 483, 484, 0, 485, 486, + 0, 0, 487, 488, 489, 490, 0, 0, 491, 492, + 0, 493, 494, 495, 496, 0, 0, 0, 0, 0, + 497, 498, 499, 0, 0, 0, 500, 501, 502, 503, + 0, 504, 505, 0, 506, 507, 0, 508, 509, 0, + 0, 510, 0, 0, 511, 0, 512, 0, 513, 514, + 0, 0, 0, 0, 0, 0, 515, 0, 0, 516, + 0, 0, 0, 517, 518, 519, 520, 521, 522, 523, + 0, 0, 0, 0, 0, 0, 524, 525, 0, 526, + 527, 528, 0, 0, 529, 0, 0, 0, 0, 159, + 0, 160, 161, 162, 163, 164, 165, 0, 0, 166, + 0, 0, 0, 167, 0, 0, 168, 3285, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, + 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, + 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, + 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, + 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, + 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, + 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, + 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, + 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, + 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, + 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, + 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, + 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, + 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, + 250, 251, 0, 252, 253, 0, 254, 255, 256, 257, + 258, 259, 260, 0, 0, 261, 262, 263, 264, 0, + 0, 265, 266, 0, 267, 268, 269, 0, 0, 270, + 0, 0, 0, 271, 272, 0, 273, 0, 274, 0, + 275, 276, 277, 278, 279, 280, 281, 0, 282, 0, + 0, 283, 284, 285, 0, 286, 0, 0, 0, 287, + 288, 0, 0, 0, 289, 290, 291, 292, 293, 0, + 0, 0, 294, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 298, 299, 0, 0, 0, 300, 0, 301, + 302, 0, 303, 304, 0, 0, 0, 305, 0, 0, + 306, 307, 308, 0, 0, 309, 0, 0, 310, 311, + 0, 0, 0, 0, 0, 312, 313, 0, 314, 0, + 315, 0, 316, 317, 0, 0, 0, 0, 0, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, + 337, 0, 338, 339, 340, 341, 0, 342, 343, 344, + 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, + 0, 0, 351, 352, 0, 353, 0, 354, 0, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 0, + 0, 365, 0, 0, 366, 367, 368, 369, 0, 0, + 0, 370, 371, 0, 0, 0, 372, 0, 373, 374, + 375, 0, 376, 377, 378, 379, 0, 380, 381, 0, + 0, 0, 0, 0, 0, 0, 0, 382, 383, 384, + 0, 0, 385, 0, 386, 0, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 0, 0, 397, 398, + 399, 0, 400, 0, 401, 402, 403, 404, 405, 0, + 406, 407, 408, 0, 0, 409, 0, 0, 0, 410, + 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, + 419, 0, 420, 421, 0, 422, 423, 424, 0, 0, + 425, 0, 426, 0, 427, 428, 0, 429, 430, 0, + 431, 0, 432, 0, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 0, 445, 446, + 2585, 0, 0, 447, 448, 449, 450, 0, 0, 0, + 451, 0, 0, 0, 452, 0, 453, 454, 455, 456, + 457, 458, 0, 459, 460, 461, 462, 463, 464, 0, + 0, 0, 0, 0, 0, 465, 466, 0, 467, 0, + 0, 468, 0, 0, 0, 469, 470, 471, 0, 0, + 0, 472, 0, 0, 473, 474, 0, 475, 476, 477, + 478, 479, 480, 0, 0, 481, 482, 483, 484, 0, + 485, 486, 0, 0, 487, 488, 489, 490, 0, 0, + 491, 492, 0, 493, 494, 495, 496, 0, 0, 0, + 0, 0, 497, 498, 499, 0, 0, 0, 500, 501, + 502, 503, 0, 504, 505, 0, 506, 507, 0, 508, + 509, 0, 0, 510, 0, 0, 511, 0, 512, 0, + 513, 514, 0, 0, 0, 0, 0, 0, 515, 0, + 0, 516, 0, 0, 0, 517, 518, 519, 520, 521, + 522, 523, 0, 0, 0, 0, 0, 0, 524, 525, + 0, 526, 527, 528, 0, 0, 529, 0, 0, 0, + 0, 159, 0, 160, 161, 162, 163, 164, 165, 0, + 0, 166, 3063, 0, 0, 167, 0, 0, 168, 829, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 0, + 178, 0, 0, 0, 179, 0, 0, 0, 180, 0, + 0, 181, 182, 183, 0, 184, 0, 185, 186, 0, + 0, 187, 0, 0, 188, 189, 0, 190, 191, 0, + 192, 193, 0, 194, 195, 196, 197, 198, 199, 0, + 200, 201, 202, 203, 204, 205, 206, 0, 207, 208, + 209, 210, 211, 212, 213, 214, 0, 215, 216, 0, + 217, 218, 219, 220, 221, 0, 222, 0, 0, 223, + 0, 0, 224, 0, 225, 0, 0, 226, 0, 227, + 0, 0, 0, 228, 229, 230, 0, 0, 231, 0, + 0, 0, 0, 232, 233, 0, 0, 0, 0, 234, + 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, + 239, 240, 241, 0, 0, 0, 0, 242, 0, 0, + 243, 244, 245, 0, 0, 0, 246, 0, 247, 248, + 0, 249, 250, 251, 0, 252, 253, 0, 254, 255, + 256, 257, 258, 259, 260, 0, 0, 261, 262, 263, + 264, 0, 0, 265, 266, 0, 267, 268, 269, 0, + 0, 270, 0, 0, 0, 271, 272, 0, 273, 0, + 274, 0, 275, 276, 277, 278, 279, 280, 281, 0, + 282, 0, 0, 283, 284, 285, 0, 286, 0, 0, + 0, 287, 288, 0, 0, 0, 289, 290, 291, 292, + 293, 0, 0, 0, 294, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 298, 299, 0, 0, 0, 300, + 0, 301, 302, 0, 303, 304, 0, 0, 0, 305, + 0, 0, 306, 307, 308, 0, 0, 309, 0, 0, + 310, 311, 0, 0, 0, 0, 0, 312, 313, 0, + 314, 0, 315, 0, 316, 317, 0, 0, 0, 0, + 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, + 335, 336, 337, 0, 338, 339, 340, 341, 0, 342, + 343, 344, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 0, 0, 351, 352, 0, 353, 0, 354, + 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 0, 0, 365, 0, 0, 366, 367, 368, 369, + 0, 0, 0, 370, 371, 0, 0, 0, 372, 0, + 373, 374, 375, 0, 376, 377, 378, 379, 0, 380, + 381, 0, 0, 0, 0, 0, 0, 0, 0, 382, + 383, 384, 0, 0, 385, 0, 386, 0, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 0, 0, + 397, 398, 399, 0, 400, 0, 401, 402, 403, 404, + 405, 0, 406, 407, 408, 0, 0, 409, 0, 0, + 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, + 417, 418, 419, 0, 420, 421, 0, 422, 423, 424, + 0, 0, 425, 0, 426, 0, 427, 428, 0, 429, + 430, 0, 431, 0, 432, 0, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 0, + 445, 446, 0, 0, 0, 447, 448, 449, 450, 0, + 0, 0, 451, 0, 0, 0, 452, 0, 453, 454, + 455, 456, 457, 458, 0, 459, 460, 461, 462, 463, + 464, 0, 0, 0, 0, 0, 0, 465, 466, 0, + 467, 0, 0, 468, 0, 0, 0, 469, 470, 471, + 0, 0, 0, 472, 0, 0, 473, 474, 0, 475, + 476, 477, 478, 479, 480, 0, 0, 481, 482, 483, + 484, 0, 485, 486, 0, 0, 487, 488, 489, 490, + 0, 0, 491, 492, 0, 493, 494, 495, 496, 0, + 0, 0, 0, 0, 497, 498, 499, 0, 0, 0, + 500, 501, 502, 503, 0, 504, 505, 0, 506, 507, + 0, 508, 509, 0, 0, 510, 0, 0, 511, 0, + 512, 0, 513, 514, 0, 0, 0, 0, 0, 0, + 515, 0, 0, 516, 0, 0, 0, 517, 518, 519, + 520, 521, 522, 523, 0, 0, 0, 0, 0, 0, + 524, 525, 0, 526, 527, 528, 0, 0, 529, 0, + 0, 0, 0, 0, 0, 159, 0, 160, 161, 162, + 163, 164, 165, 0, 4881, 166, 0, 0, 0, 167, + 4882, 829, 168, 0, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 0, 178, 0, 0, 0, 179, 0, + 0, 0, 180, 0, 0, 181, 182, 183, 0, 184, + 0, 185, 186, 0, 0, 187, 0, 0, 188, 189, + 0, 190, 191, 0, 192, 193, 0, 194, 195, 196, + 197, 198, 199, 0, 200, 201, 202, 203, 204, 205, + 206, 0, 207, 208, 209, 210, 211, 212, 213, 214, + 0, 215, 216, 0, 217, 218, 219, 220, 221, 0, + 222, 0, 0, 223, 0, 0, 224, 0, 225, 0, + 0, 226, 0, 227, 0, 0, 0, 228, 229, 230, + 0, 0, 231, 0, 0, 0, 0, 232, 233, 0, + 0, 0, 0, 234, 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 748, - 0, 261, 262, 263, 264, 749, 750, 265, 266, 0, - 267, 268, 269, 751, 0, 270, 0, 0, 0, 752, - 272, 0, 273, 0, 274, 0, 275, 276, 753, 278, - 754, 280, 281, 0, 282, 0, 755, 283, 284, 285, - 0, 286, 756, 757, 0, 287, 288, 0, 0, 0, - 758, 290, 291, 292, 293, 759, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 760, 298, 299, - 761, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 762, 0, - 0, 309, 0, 763, 310, 311, 0, 0, 0, 0, - 0, 764, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 765, 0, 0, 0, 318, 319, 320, 321, + 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, + 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, + 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, + 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, + 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, + 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, + 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, + 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, + 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, + 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, + 0, 309, 0, 0, 310, 311, 0, 0, 0, 0, + 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, + 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 766, 338, 339, - 340, 341, 767, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 768, 350, 0, 0, 769, 352, - 770, 353, 0, 354, 771, 772, 773, 774, 775, 359, - 360, 361, 362, 363, 364, 0, 776, 365, 0, 0, - 366, 367, 368, 369, 777, 778, 779, 370, 371, 0, - 780, 781, 372, 0, 373, 374, 782, 0, 376, 377, + 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, + 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, + 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, + 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, + 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, + 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 783, 385, 0, - 386, 0, 387, 388, 784, 390, 391, 392, 393, 785, - 786, 396, 787, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 788, 407, 408, 0, + 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, + 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, + 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 789, 790, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 791, 0, - 792, 433, 434, 435, 436, 437, 438, 793, 794, 441, - 442, 443, 444, 0, 795, 446, 0, 0, 0, 447, + 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, + 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 796, 797, - 473, 474, 0, 475, 476, 798, 478, 479, 480, 799, - 800, 481, 482, 483, 484, 801, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 802, 491, 492, 0, 803, - 804, 805, 806, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 807, 808, 809, 501, 502, 503, 810, 504, - 505, 811, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 812, 514, 0, 0, - 813, 814, 815, 816, 515, 0, 0, 516, 817, 0, - 818, 517, 518, 519, 520, 521, 819, 820, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 821, 0, 0, 0, 0, 0, 0, 0, - 822, 823, 0, 0, 0, 0, 824, 825, 0, 0, - 826, 827, 0, 0, 828, 829, 159, 0, 160, 715, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 716, 0, 169, 170, 171, 172, 173, - 174, 175, 717, 177, 0, 178, 0, 0, 718, 179, - 719, 720, 721, 180, 722, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 723, 724, 188, - 189, 0, 190, 725, 726, 192, 193, 0, 194, 195, - 196, 197, 727, 199, 0, 728, 201, 729, 730, 731, - 732, 733, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 734, 221, - 0, 222, 735, 736, 223, 0, 0, 224, 737, 225, - 738, 739, 226, 0, 227, 740, 741, 0, 228, 229, - 230, 742, 743, 744, 0, 0, 0, 0, 745, 233, - 746, 0, 0, 747, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 748, - 0, 261, 262, 263, 264, 749, 750, 265, 266, 0, - 267, 268, 269, 751, 0, 270, 0, 0, 0, 752, - 272, 0, 273, 0, 274, 0, 275, 276, 753, 278, - 754, 280, 281, 0, 282, 0, 755, 283, 284, 285, - 0, 286, 756, 757, 0, 287, 288, 0, 0, 0, - 758, 290, 291, 292, 293, 759, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 760, 298, 299, - 761, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 762, 0, - 0, 309, 0, 763, 310, 311, 0, 0, 0, 0, - 0, 764, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 765, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 766, 338, 339, - 340, 341, 767, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 768, 350, 0, 0, 769, 352, - 770, 353, 0, 354, 771, 772, 773, 774, 775, 359, - 360, 361, 362, 363, 364, 0, 776, 365, 0, 0, - 366, 367, 368, 369, 777, 778, 779, 370, 371, 0, - 780, 781, 372, 0, 373, 374, 782, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 783, 385, 0, - 386, 0, 387, 388, 784, 390, 391, 392, 393, 785, - 786, 396, 787, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 788, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 789, 790, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 791, 0, - 792, 433, 434, 435, 436, 437, 438, 793, 794, 441, - 442, 443, 444, 0, 795, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 796, 797, - 473, 474, 0, 475, 476, 798, 478, 479, 480, 799, - 800, 481, 482, 483, 484, 801, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 802, 491, 492, 0, 803, - 804, 805, 806, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 807, 808, 809, 501, 502, 503, 810, 504, - 505, 811, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 812, 514, 0, 0, - 813, 814, 815, 816, 515, 0, 0, 516, 817, 0, - 818, 517, 518, 519, 520, 521, 819, 820, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 821, 0, 0, 0, 0, 0, 0, 0, - 822, 823, 0, 0, 0, 0, 824, 1231, 0, 0, - 826, 827, 0, 0, 828, 829, 159, 0, 160, 715, - 162, 163, 164, 165, 1903, 0, 166, 0, 0, 0, - 1904, 0, 0, 716, 0, 169, 170, 171, 172, 173, - 174, 175, 717, 177, 0, 178, 0, 0, 718, 179, - 719, 720, 721, 180, 722, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 723, 724, 188, - 189, 0, 190, 725, 726, 192, 193, 0, 194, 195, - 196, 197, 727, 199, 0, 728, 201, 729, 730, 731, - 732, 733, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 734, 221, - 0, 222, 735, 736, 223, 0, 0, 224, 737, 225, - 738, 739, 226, 0, 227, 740, 741, 0, 228, 229, - 230, 742, 743, 744, 0, 0, 0, 0, 745, 233, - 746, 0, 0, 747, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 748, - 0, 261, 262, 263, 264, 749, 750, 265, 266, 0, - 267, 268, 269, 751, 0, 270, 0, 0, 0, 752, - 272, 0, 273, 0, 274, 0, 275, 276, 753, 278, - 754, 280, 281, 0, 282, 0, 755, 283, 284, 285, - 0, 286, 756, 757, 0, 287, 288, 0, 0, 0, - 758, 290, 291, 292, 293, 759, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 760, 298, 299, - 761, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 762, 0, - 0, 309, 0, 763, 310, 311, 0, 0, 0, 0, - 0, 764, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 765, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 766, 338, 339, - 340, 341, 767, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 768, 350, 0, 0, 769, 352, - 770, 353, 0, 354, 771, 772, 773, 774, 775, 359, - 360, 361, 362, 363, 364, 0, 776, 365, 0, 0, - 366, 367, 368, 369, 777, 0, 779, 370, 371, 0, - 780, 781, 372, 0, 373, 374, 782, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 783, 385, 0, - 386, 0, 387, 388, 784, 390, 391, 392, 393, 785, - 786, 396, 787, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 788, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 789, 790, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 791, 0, - 792, 433, 434, 435, 436, 437, 438, 793, 794, 441, - 442, 443, 444, 0, 795, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 796, 797, - 473, 474, 0, 475, 476, 798, 478, 479, 480, 799, - 800, 481, 482, 483, 484, 801, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 802, 491, 492, 0, 803, - 804, 805, 806, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 807, 808, 809, 501, 502, 503, 810, 504, - 505, 811, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 812, 514, 0, 0, - 813, 814, 815, 816, 515, 0, 0, 516, 817, 0, - 818, 517, 518, 519, 520, 521, 819, 820, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 821, 0, 0, 0, 0, 0, 0, 0, - 822, 823, 0, 0, 0, 0, 824, 825, 0, 0, - 826, 827, 0, 0, 828, 829, 159, 0, 160, 715, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 716, 0, 169, 170, 171, 172, 173, - 174, 175, 717, 177, 0, 178, 0, 0, 718, 179, - 719, 720, 721, 180, 722, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 723, 724, 188, - 189, 0, 190, 725, 726, 192, 193, 0, 194, 195, - 196, 197, 727, 199, 0, 728, 201, 729, 730, 731, - 732, 733, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 734, 221, - 0, 222, 735, 736, 223, 0, 0, 224, 737, 225, - 738, 739, 226, 0, 227, 740, 741, 0, 228, 229, - 230, 742, 743, 744, 0, 0, 0, 0, 745, 233, - 746, 0, 0, 747, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 748, - 0, 261, 262, 263, 264, 749, 750, 265, 266, 0, - 267, 268, 269, 751, 0, 270, 0, 0, 0, 752, - 272, 0, 273, 0, 274, 0, 275, 276, 753, 278, - 754, 280, 281, 0, 282, 0, 755, 283, 284, 285, - 0, 286, 756, 757, 0, 287, 288, 0, 0, 0, - 758, 290, 291, 292, 293, 759, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 760, 298, 299, - 761, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 762, 0, - 0, 309, 0, 763, 310, 311, 0, 0, 0, 0, - 0, 764, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 765, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 766, 338, 339, - 340, 341, 767, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 768, 350, 0, 0, 769, 352, - 770, 353, 0, 354, 771, 772, 773, 774, 775, 359, - 360, 361, 362, 363, 364, 0, 776, 365, 0, 0, - 366, 367, 368, 369, 777, 778, 779, 370, 371, 0, - 780, 781, 372, 0, 373, 374, 782, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 783, 385, 0, - 386, 0, 387, 388, 784, 390, 391, 392, 393, 785, - 786, 396, 787, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 788, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 789, 790, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 791, 0, - 792, 433, 434, 435, 436, 437, 438, 793, 794, 441, - 442, 443, 444, 0, 795, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 796, 797, - 473, 474, 0, 475, 476, 798, 478, 479, 480, 799, - 800, 481, 482, 483, 484, 801, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 802, 491, 492, 0, 803, - 804, 805, 806, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 807, 808, 809, 501, 502, 503, 810, 504, - 505, 811, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 2010, 514, 0, 0, - 813, 814, 815, 816, 515, 0, 0, 516, 817, 0, - 818, 517, 518, 519, 520, 521, 819, 820, 0, 0, + 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, + 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, + 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, + 487, 488, 489, 490, 0, 0, 491, 492, 0, 493, + 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, + 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, + 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, + 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, + 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, + 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 821, 0, 0, 0, 0, 0, 0, 0, - 822, 823, 0, 0, 0, 0, 824, 825, 0, 0, - 826, 827, 0, 0, 828, 829, 159, 0, 160, 715, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 716, 0, 169, 170, 171, 172, 173, - 174, 175, 717, 177, 0, 178, 0, 0, 718, 179, - 719, 720, 721, 180, 722, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 723, 724, 188, - 189, 0, 190, 725, 726, 192, 193, 0, 194, 195, - 196, 197, 727, 199, 0, 728, 201, 729, 730, 731, - 732, 733, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 734, 221, - 0, 222, 735, 736, 223, 0, 0, 224, 737, 225, - 738, 739, 226, 0, 227, 740, 741, 0, 228, 229, - 230, 742, 743, 744, 0, 0, 0, 0, 745, 233, - 746, 0, 0, 747, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 748, - 0, 261, 262, 263, 264, 749, 750, 265, 266, 0, - 267, 268, 269, 751, 0, 270, 0, 0, 0, 752, - 272, 0, 273, 0, 274, 0, 275, 276, 753, 278, - 754, 280, 281, 0, 282, 0, 755, 283, 284, 285, - 0, 286, 756, 757, 0, 287, 288, 0, 0, 0, - 758, 290, 291, 292, 293, 759, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 760, 298, 299, - 2884, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 762, 0, - 0, 309, 0, 763, 310, 311, 0, 0, 0, 0, - 0, 764, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 765, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 766, 338, 339, - 340, 341, 767, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 768, 350, 0, 0, 769, 352, - 770, 353, 0, 354, 771, 772, 773, 774, 775, 359, - 360, 361, 362, 363, 364, 0, 776, 365, 0, 0, - 366, 367, 368, 369, 777, 778, 779, 370, 371, 0, - 780, 781, 372, 0, 373, 374, 782, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 783, 385, 0, - 386, 0, 387, 388, 784, 390, 391, 392, 393, 785, - 786, 396, 787, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 788, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 789, 790, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 791, 0, - 792, 433, 434, 435, 436, 437, 438, 793, 794, 441, - 442, 443, 444, 0, 795, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 796, 797, - 473, 474, 0, 475, 476, 798, 478, 479, 480, 799, - 800, 481, 482, 483, 484, 801, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 802, 491, 492, 0, 803, - 804, 805, 806, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 807, 808, 809, 501, 502, 503, 810, 504, - 505, 811, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 812, 514, 0, 0, - 813, 814, 815, 816, 515, 0, 0, 516, 817, 0, - 818, 517, 518, 519, 520, 521, 819, 820, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 821, 0, 0, 0, 0, 0, 0, 0, - 822, 823, 0, 0, 0, 0, 824, 825, 0, 0, - 826, 827, 0, 0, 828, 829, 159, 0, 160, 715, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 716, 0, 169, 170, 171, 172, 173, - 174, 175, 717, 177, 0, 178, 0, 0, 718, 179, - 719, 720, 721, 180, 722, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 723, 724, 188, - 189, 0, 190, 725, 726, 192, 193, 0, 194, 195, - 196, 197, 727, 199, 0, 728, 201, 729, 730, 731, - 732, 733, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 734, 221, - 0, 222, 735, 736, 223, 0, 0, 224, 737, 225, - 738, 739, 226, 0, 227, 740, 741, 0, 228, 229, - 230, 742, 743, 744, 0, 0, 0, 0, 745, 233, - 746, 0, 0, 747, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 748, - 0, 261, 262, 263, 264, 749, 750, 265, 266, 0, - 267, 268, 269, 751, 0, 270, 0, 0, 0, 752, - 272, 0, 273, 0, 274, 0, 275, 276, 753, 278, - 754, 280, 281, 0, 282, 0, 755, 283, 284, 285, - 0, 286, 756, 757, 0, 287, 288, 0, 0, 0, - 758, 290, 291, 292, 293, 759, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 760, 298, 299, - 2936, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 762, 0, - 0, 309, 0, 763, 310, 311, 0, 0, 0, 0, - 0, 764, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 765, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 766, 338, 339, - 340, 341, 767, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 768, 350, 0, 0, 769, 352, - 770, 353, 0, 354, 771, 772, 773, 774, 775, 359, - 360, 361, 362, 363, 364, 0, 776, 365, 0, 0, - 366, 367, 368, 369, 777, 778, 779, 370, 371, 0, - 780, 781, 372, 0, 373, 374, 782, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 783, 385, 0, - 386, 0, 387, 388, 784, 390, 391, 392, 393, 785, - 786, 396, 787, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 788, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 789, 790, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 791, 0, - 792, 433, 434, 435, 436, 437, 438, 793, 794, 441, - 442, 443, 444, 0, 795, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 796, 797, - 473, 474, 0, 475, 476, 798, 478, 479, 480, 799, - 800, 481, 482, 483, 484, 801, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 802, 491, 492, 0, 803, - 804, 805, 806, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 807, 808, 809, 501, 502, 503, 810, 504, - 505, 811, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 812, 514, 0, 0, - 813, 814, 815, 816, 515, 0, 0, 516, 817, 0, - 818, 517, 518, 519, 520, 521, 819, 820, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 821, 0, 0, 0, 0, 0, 0, 0, - 822, 823, 0, 0, 0, 0, 824, 825, 0, 0, - 826, 827, 0, 0, 828, 829, 159, 0, 160, 715, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 716, 0, 169, 170, 171, 172, 173, - 174, 175, 717, 177, 0, 178, 0, 0, 718, 179, - 719, 720, 721, 180, 722, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 723, 724, 188, - 189, 0, 190, 725, 726, 192, 193, 0, 194, 195, - 196, 197, 727, 199, 0, 728, 201, 729, 730, 731, - 732, 733, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 734, 221, - 0, 222, 735, 736, 223, 0, 0, 224, 737, 225, - 738, 739, 226, 0, 227, 740, 741, 0, 228, 229, - 230, 742, 743, 744, 0, 0, 0, 0, 745, 233, - 746, 0, 0, 3821, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 748, - 0, 261, 262, 263, 264, 749, 750, 265, 266, 0, - 267, 268, 269, 751, 0, 270, 0, 0, 0, 752, - 272, 0, 273, 0, 274, 0, 275, 276, 753, 278, - 754, 280, 281, 0, 282, 0, 755, 283, 284, 285, - 0, 286, 756, 757, 0, 287, 288, 0, 0, 0, - 758, 290, 291, 292, 293, 759, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 760, 298, 299, - 761, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 762, 0, - 0, 309, 0, 763, 310, 311, 0, 0, 0, 0, - 0, 764, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 765, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 766, 338, 339, - 340, 341, 767, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 768, 350, 0, 0, 769, 352, - 770, 353, 0, 354, 771, 772, 773, 774, 775, 359, - 360, 361, 362, 363, 364, 0, 776, 365, 0, 0, - 366, 367, 368, 369, 777, 778, 779, 370, 371, 0, - 780, 781, 372, 0, 373, 374, 782, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 783, 385, 0, - 386, 0, 387, 388, 784, 390, 391, 392, 393, 785, - 786, 396, 787, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 788, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 789, 790, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 791, 0, - 792, 433, 434, 435, 436, 437, 438, 793, 794, 441, - 442, 443, 444, 0, 795, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 796, 797, - 473, 474, 0, 475, 476, 798, 478, 479, 480, 799, - 800, 481, 482, 483, 484, 801, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 802, 491, 492, 0, 803, - 804, 805, 806, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 807, 808, 809, 501, 502, 503, 810, 504, - 505, 811, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 812, 514, 0, 0, - 813, 814, 815, 816, 515, 0, 0, 516, 817, 0, - 818, 517, 518, 519, 520, 521, 819, 820, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 821, 0, 0, 0, 0, 0, 0, 0, - 822, 823, 0, 0, 0, 0, 824, 825, 0, 0, - 826, 827, 0, 0, 828, 829, 159, 0, 160, 715, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 716, 0, 169, 170, 171, 172, 173, - 174, 175, 717, 177, 0, 178, 0, 0, 718, 179, - 719, 720, 721, 180, 722, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 723, 724, 188, - 189, 0, 190, 725, 726, 192, 193, 0, 194, 195, - 196, 197, 727, 199, 0, 728, 201, 729, 730, 731, - 732, 733, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 734, 221, - 0, 222, 735, 736, 223, 0, 0, 224, 737, 225, - 738, 739, 226, 0, 227, 740, 741, 0, 228, 229, - 230, 742, 743, 744, 0, 0, 0, 0, 745, 233, - 746, 0, 0, 747, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 748, - 0, 261, 262, 263, 264, 749, 750, 265, 266, 0, - 267, 268, 269, 751, 0, 270, 0, 0, 0, 752, - 272, 0, 273, 0, 274, 0, 275, 276, 753, 278, - 754, 280, 281, 0, 282, 0, 755, 283, 284, 285, - 0, 286, 756, 757, 0, 287, 288, 0, 0, 0, - 758, 290, 291, 292, 293, 759, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 760, 298, 299, - 761, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 762, 0, - 0, 309, 0, 763, 310, 311, 0, 0, 0, 0, - 0, 764, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 765, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 766, 338, 339, - 340, 341, 767, 342, 343, 344, 4807, 0, 0, 0, - 345, 346, 347, 348, 768, 350, 0, 0, 769, 352, - 770, 353, 0, 354, 771, 772, 773, 774, 775, 359, - 360, 361, 362, 363, 364, 0, 776, 365, 0, 0, - 366, 367, 368, 369, 777, 0, 779, 370, 371, 0, - 780, 781, 372, 0, 373, 374, 782, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 783, 385, 0, - 386, 0, 387, 388, 784, 390, 391, 392, 393, 785, - 786, 396, 787, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 788, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 789, 790, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 791, 0, - 792, 433, 434, 435, 436, 437, 438, 793, 794, 441, - 442, 443, 444, 0, 795, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 796, 797, - 473, 474, 0, 475, 476, 798, 478, 479, 480, 799, - 800, 481, 482, 483, 484, 801, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 802, 491, 492, 0, 803, - 804, 805, 806, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 807, 808, 809, 501, 502, 503, 810, 504, - 505, 811, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 812, 514, 0, 0, - 813, 814, 815, 816, 515, 0, 0, 516, 817, 0, - 818, 517, 518, 519, 520, 521, 819, 820, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 821, 0, 0, 0, 0, 0, 0, 0, - 822, 823, 0, 0, 0, 0, 824, 825, 0, 0, - 826, 827, 0, 0, 828, 829, 159, 0, 160, 715, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 716, 0, 169, 170, 171, 172, 173, - 174, 175, 717, 177, 0, 178, 0, 0, 718, 179, - 719, 720, 721, 180, 722, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 723, 724, 188, - 189, 0, 190, 725, 726, 192, 193, 0, 194, 195, - 196, 197, 727, 199, 0, 728, 201, 729, 730, 731, - 732, 733, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 734, 221, - 0, 222, 735, 736, 223, 0, 0, 224, 737, 225, - 738, 739, 226, 0, 227, 740, 741, 0, 228, 229, - 230, 742, 743, 744, 0, 0, 0, 0, 745, 233, - 746, 0, 0, 747, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 748, - 0, 261, 262, 263, 264, 749, 750, 265, 266, 0, - 267, 268, 269, 751, 0, 270, 0, 0, 0, 752, - 272, 0, 273, 0, 274, 0, 275, 276, 753, 278, - 754, 280, 281, 0, 282, 0, 755, 283, 284, 285, - 0, 286, 756, 757, 0, 287, 288, 0, 0, 0, - 758, 290, 291, 292, 293, 759, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 760, 298, 299, - 761, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 762, 0, - 0, 309, 0, 763, 310, 311, 0, 0, 0, 0, - 0, 764, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 765, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 766, 338, 339, - 340, 341, 767, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 768, 350, 0, 0, 769, 352, - 770, 353, 0, 354, 771, 772, 773, 774, 775, 359, - 360, 361, 362, 363, 364, 0, 776, 365, 0, 0, - 366, 367, 368, 369, 777, 0, 779, 370, 371, 0, - 780, 781, 372, 0, 373, 374, 782, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 783, 385, 0, - 386, 0, 387, 388, 784, 390, 391, 392, 393, 785, - 786, 396, 787, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 788, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 789, 790, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 791, 0, - 792, 433, 434, 435, 436, 437, 438, 793, 794, 441, - 442, 443, 444, 0, 795, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 796, 797, - 473, 474, 0, 475, 476, 798, 478, 479, 480, 799, - 800, 481, 482, 483, 484, 801, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 802, 491, 492, 0, 803, - 804, 805, 806, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 807, 808, 809, 501, 502, 503, 810, 504, - 505, 811, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 812, 514, 0, 0, - 813, 814, 815, 816, 515, 0, 0, 516, 817, 0, - 818, 517, 518, 519, 520, 521, 819, 820, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 821, 0, 0, 0, 0, 0, 0, 0, - 822, 823, 0, 0, 0, 0, 824, 825, 0, 0, - 826, 827, 0, 0, 828, 829, 159, 0, 160, 715, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 716, 0, 169, 170, 171, 172, 173, - 174, 175, 717, 177, 0, 178, 0, 0, 718, 179, - 719, 720, 721, 180, 722, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 723, 724, 188, - 189, 0, 190, 725, 726, 192, 193, 0, 194, 195, - 196, 197, 727, 199, 0, 728, 201, 729, 730, 731, - 732, 733, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 734, 221, - 0, 222, 735, 736, 223, 0, 0, 224, 737, 225, - 738, 739, 226, 0, 227, 740, 741, 0, 228, 229, - 230, 742, 743, 744, 0, 0, 0, 0, 745, 233, - 746, 0, 0, 747, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 748, - 0, 261, 262, 263, 264, 749, 750, 265, 266, 0, - 267, 268, 269, 751, 0, 270, 0, 0, 0, 752, - 272, 0, 273, 0, 274, 0, 275, 276, 753, 278, - 754, 280, 281, 0, 282, 0, 755, 283, 284, 285, - 0, 286, 756, 757, 0, 287, 288, 0, 0, 0, - 758, 290, 291, 292, 293, 759, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 760, 298, 299, - 1918, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 762, 0, - 0, 309, 0, 763, 310, 311, 0, 0, 0, 0, - 0, 764, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 765, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 766, 338, 339, - 340, 341, 767, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 768, 350, 0, 0, 769, 352, - 770, 353, 0, 354, 771, 772, 773, 774, 775, 359, - 360, 361, 362, 363, 364, 0, 776, 365, 0, 0, - 366, 367, 368, 369, 777, 0, 779, 370, 371, 0, - 780, 781, 372, 0, 373, 374, 782, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 783, 385, 0, - 386, 0, 387, 388, 784, 390, 391, 392, 393, 785, - 786, 396, 787, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 788, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 789, 790, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 791, 0, - 792, 433, 434, 435, 436, 437, 438, 793, 794, 441, - 442, 443, 444, 0, 795, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 796, 797, - 473, 474, 0, 475, 476, 798, 478, 479, 480, 799, - 800, 481, 482, 483, 484, 801, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 802, 491, 492, 0, 803, - 804, 805, 806, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 807, 808, 809, 501, 502, 503, 810, 504, - 505, 811, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 812, 514, 0, 0, - 813, 814, 815, 816, 515, 0, 0, 516, 817, 0, - 818, 517, 518, 519, 520, 521, 819, 820, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 821, 0, 0, 0, 0, 0, 0, 0, - 822, 823, 0, 0, 0, 0, 824, 825, 0, 0, - 826, 827, 0, 0, 828, 829, 159, 0, 160, 715, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 716, 0, 169, 170, 171, 172, 173, - 174, 175, 717, 177, 0, 178, 0, 0, 718, 179, - 719, 720, 721, 180, 722, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 723, 724, 188, - 189, 0, 190, 725, 726, 192, 193, 0, 194, 195, - 196, 197, 727, 199, 0, 728, 201, 729, 730, 731, - 732, 733, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 734, 221, - 0, 222, 735, 736, 223, 0, 0, 224, 737, 225, - 738, 739, 226, 0, 227, 740, 741, 0, 228, 229, - 230, 742, 743, 744, 0, 0, 0, 0, 745, 233, - 746, 0, 0, 747, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 748, - 0, 261, 262, 263, 264, 749, 750, 265, 266, 0, - 267, 268, 269, 751, 0, 270, 0, 0, 0, 752, - 272, 0, 273, 0, 274, 0, 275, 276, 753, 278, - 754, 280, 281, 0, 282, 0, 755, 283, 284, 285, - 0, 286, 756, 757, 0, 287, 288, 0, 0, 0, - 758, 290, 291, 292, 293, 759, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 760, 298, 299, - 1920, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 762, 0, - 0, 309, 0, 763, 310, 311, 0, 0, 0, 0, - 0, 764, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 765, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 766, 338, 339, - 340, 341, 767, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 768, 350, 0, 0, 769, 352, - 770, 353, 0, 354, 771, 772, 773, 774, 775, 359, - 360, 361, 362, 363, 364, 0, 776, 365, 0, 0, - 366, 367, 368, 369, 777, 0, 779, 370, 371, 0, - 780, 781, 372, 0, 373, 374, 782, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 783, 385, 0, - 386, 0, 387, 388, 784, 390, 391, 392, 393, 785, - 786, 396, 787, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 788, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 789, 790, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 791, 0, - 792, 433, 434, 435, 436, 437, 438, 793, 794, 441, - 442, 443, 444, 0, 795, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 796, 797, - 473, 474, 0, 475, 476, 798, 478, 479, 480, 799, - 800, 481, 482, 483, 484, 801, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 802, 491, 492, 0, 803, - 804, 805, 806, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 807, 808, 809, 501, 502, 503, 810, 504, - 505, 811, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 812, 514, 0, 0, - 813, 814, 815, 816, 515, 0, 0, 516, 817, 0, - 818, 517, 518, 519, 520, 521, 819, 820, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 821, 0, 0, 0, 0, 0, 0, 0, - 822, 823, 0, 0, 0, 0, 824, 825, 0, 0, - 826, 827, 0, 0, 828, 829, 159, 0, 160, 161, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 168, 0, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 0, 178, 0, 0, 0, 179, - 719, 0, 0, 180, 0, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 0, 0, 188, - 189, 0, 190, 191, 0, 192, 193, 0, 194, 195, - 196, 197, 198, 199, 0, 200, 201, 202, 203, 204, - 205, 206, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 220, 221, - 0, 222, 0, 0, 223, 0, 0, 224, 0, 225, - 0, 0, 226, 0, 227, 0, 0, 0, 228, 229, - 230, 0, 0, 1963, 0, 0, 0, 0, 232, 233, - 746, 0, 0, 0, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, - 0, 261, 262, 263, 264, 0, 750, 265, 266, 0, - 267, 268, 269, 751, 0, 270, 0, 0, 0, 271, - 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, - 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, - 0, 286, 756, 757, 0, 287, 288, 0, 0, 0, - 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, - 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, - 0, 309, 0, 0, 310, 311, 0, 0, 0, 0, - 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 765, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, - 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, - 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 0, 776, 365, 0, 0, - 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, - 780, 781, 372, 0, 373, 374, 375, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, - 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, - 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, - 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, - 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 802, 491, 492, 0, 1964, - 494, 495, 1965, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 0, 808, 500, 501, 502, 503, 810, 504, - 505, 811, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, - 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, - 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 529, 0, 0, 0, 0, 0, 0, 159, - 0, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 828, 829, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 3210, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 640, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 2280, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 2281, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 0, - 3589, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 2583, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 642, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 0, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 0, 529, 0, 0, 0, 0, - 159, 0, 160, 161, 162, 163, 164, 165, 0, 0, - 166, 0, 0, 0, 167, 0, 0, 168, 3282, 169, - 170, 171, 172, 173, 174, 175, 176, 177, 0, 178, - 0, 0, 0, 179, 0, 0, 0, 180, 0, 0, - 181, 182, 183, 0, 184, 0, 185, 186, 0, 0, - 187, 0, 0, 188, 189, 0, 190, 191, 0, 192, - 193, 0, 194, 195, 196, 197, 198, 199, 0, 200, - 201, 202, 203, 204, 205, 206, 0, 207, 208, 209, - 210, 211, 212, 213, 214, 0, 215, 216, 3210, 217, - 218, 219, 220, 221, 0, 222, 0, 0, 223, 0, - 0, 224, 0, 225, 0, 0, 226, 0, 227, 0, - 0, 0, 228, 229, 230, 0, 0, 231, 0, 0, - 0, 0, 232, 233, 0, 0, 0, 0, 234, 0, - 235, 0, 0, 0, 236, 0, 237, 238, 239, 240, - 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, - 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, - 250, 251, 0, 252, 253, 0, 254, 255, 256, 257, - 258, 259, 260, 0, 0, 261, 262, 263, 264, 0, - 0, 265, 266, 0, 267, 268, 269, 0, 0, 270, - 0, 0, 0, 271, 272, 0, 273, 640, 274, 0, - 275, 276, 277, 278, 279, 280, 281, 0, 282, 0, - 0, 283, 284, 285, 0, 286, 0, 0, 0, 287, - 288, 0, 0, 0, 289, 290, 291, 292, 293, 0, - 0, 0, 294, 295, 296, 2280, 0, 297, 0, 0, - 0, 0, 298, 299, 0, 0, 0, 300, 0, 301, - 302, 0, 303, 304, 0, 0, 0, 305, 2281, 0, - 306, 307, 308, 0, 0, 309, 0, 0, 310, 311, - 0, 0, 0, 0, 0, 312, 313, 0, 314, 0, - 315, 0, 316, 317, 0, 0, 0, 0, 0, 0, - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, - 337, 0, 338, 339, 340, 341, 0, 342, 343, 344, - 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, - 0, 0, 351, 352, 0, 353, 0, 354, 0, 355, - 356, 357, 358, 359, 360, 361, 362, 363, 364, 0, - 0, 365, 0, 0, 366, 367, 368, 369, 0, 0, - 0, 370, 371, 0, 0, 0, 372, 0, 373, 374, - 375, 0, 376, 377, 378, 379, 0, 380, 381, 0, - 0, 0, 0, 0, 0, 0, 0, 382, 383, 384, - 0, 0, 385, 0, 386, 0, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 0, 0, 397, 398, - 399, 0, 400, 0, 401, 402, 403, 404, 405, 0, - 406, 407, 408, 0, 0, 409, 0, 0, 0, 410, - 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, - 419, 0, 420, 421, 0, 422, 423, 424, 0, 0, - 425, 0, 426, 0, 427, 428, 0, 429, 430, 0, - 431, 0, 432, 0, 0, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 443, 444, 0, 445, 446, - 0, 0, 0, 447, 448, 449, 450, 0, 0, 0, - 451, 0, 0, 0, 452, 0, 453, 454, 455, 456, - 457, 458, 0, 459, 460, 461, 462, 463, 464, 642, - 0, 0, 0, 0, 0, 465, 466, 0, 467, 0, - 0, 468, 0, 0, 0, 469, 470, 471, 0, 0, - 0, 472, 0, 0, 473, 474, 0, 475, 476, 477, - 478, 479, 480, 0, 0, 481, 482, 483, 484, 0, - 485, 486, 0, 0, 487, 488, 489, 490, 0, 0, - 491, 492, 0, 493, 494, 495, 496, 0, 0, 0, - 0, 0, 497, 498, 499, 0, 0, 0, 500, 501, - 502, 503, 0, 504, 505, 0, 506, 507, 0, 508, - 509, 0, 0, 510, 0, 0, 511, 0, 512, 0, - 513, 514, 0, 0, 0, 0, 0, 0, 515, 0, - 0, 516, 0, 0, 0, 517, 518, 519, 520, 521, - 522, 523, 0, 0, 0, 0, 0, 0, 524, 525, - 0, 526, 527, 528, 0, 0, 529, 0, 0, 0, - 0, 159, 0, 160, 161, 162, 163, 164, 165, 0, - 0, 166, 0, 0, 0, 167, 0, 0, 168, 3282, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 0, - 178, 0, 0, 0, 179, 0, 0, 0, 180, 0, - 0, 181, 182, 183, 0, 184, 0, 185, 186, 0, - 0, 187, 0, 0, 188, 189, 0, 190, 191, 0, - 192, 193, 0, 194, 195, 196, 197, 198, 199, 0, - 200, 201, 202, 203, 204, 205, 206, 0, 207, 208, - 209, 210, 211, 212, 213, 214, 0, 215, 216, 0, - 217, 218, 219, 220, 221, 0, 222, 0, 0, 223, - 0, 0, 224, 0, 225, 0, 0, 226, 0, 227, - 0, 0, 0, 228, 229, 230, 0, 0, 231, 0, - 0, 0, 0, 232, 233, 0, 0, 0, 0, 234, - 0, 235, 0, 0, 0, 236, 0, 237, 238, 239, - 240, 241, 0, 0, 0, 0, 242, 0, 0, 243, - 244, 245, 0, 0, 0, 246, 0, 247, 248, 0, - 249, 250, 251, 0, 252, 253, 0, 254, 255, 256, - 257, 258, 259, 260, 0, 0, 261, 262, 263, 264, - 0, 0, 265, 266, 0, 267, 268, 269, 0, 0, - 270, 0, 0, 0, 271, 272, 0, 273, 0, 274, - 0, 275, 276, 277, 278, 279, 280, 281, 0, 282, - 0, 0, 283, 284, 285, 0, 286, 0, 0, 0, - 287, 288, 0, 0, 0, 289, 290, 291, 292, 293, - 0, 0, 0, 294, 295, 296, 0, 0, 297, 0, - 0, 0, 0, 298, 299, 0, 0, 0, 300, 0, - 301, 302, 0, 303, 304, 0, 0, 0, 305, 0, - 0, 306, 307, 308, 0, 0, 309, 0, 0, 310, - 311, 0, 0, 0, 0, 0, 312, 313, 0, 314, - 0, 315, 0, 316, 317, 0, 0, 0, 0, 0, - 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, 332, 333, 0, 334, 335, - 336, 337, 0, 338, 339, 340, 341, 0, 342, 343, - 344, 0, 0, 0, 0, 345, 346, 347, 348, 349, - 350, 0, 0, 351, 352, 0, 353, 0, 354, 0, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 0, 0, 365, 0, 0, 366, 367, 368, 369, 0, - 0, 0, 370, 371, 0, 0, 0, 372, 0, 373, - 374, 375, 0, 376, 377, 378, 379, 0, 380, 381, - 0, 0, 0, 0, 0, 0, 0, 0, 382, 383, - 384, 0, 0, 385, 0, 386, 0, 387, 388, 389, - 390, 391, 392, 393, 394, 395, 396, 0, 0, 397, - 398, 399, 0, 400, 0, 401, 402, 403, 404, 405, - 0, 406, 407, 408, 0, 0, 409, 0, 0, 0, - 410, 411, 412, 413, 414, 0, 0, 415, 416, 417, - 418, 419, 0, 420, 421, 0, 422, 423, 424, 0, - 0, 425, 0, 426, 0, 427, 428, 0, 429, 430, - 0, 431, 0, 432, 0, 0, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, 444, 0, 445, - 446, 2583, 0, 0, 447, 448, 449, 450, 0, 0, - 0, 451, 0, 0, 0, 452, 0, 453, 454, 455, - 456, 457, 458, 0, 459, 460, 461, 462, 463, 464, - 0, 0, 0, 0, 0, 0, 465, 466, 0, 467, - 0, 0, 468, 0, 0, 0, 469, 470, 471, 0, - 0, 0, 472, 0, 0, 473, 474, 0, 475, 476, - 477, 478, 479, 480, 0, 0, 481, 482, 483, 484, - 0, 485, 486, 0, 0, 487, 488, 489, 490, 0, - 0, 491, 492, 0, 493, 494, 495, 496, 0, 0, - 0, 0, 0, 497, 498, 499, 0, 0, 0, 500, - 501, 502, 503, 0, 504, 505, 0, 506, 507, 0, - 508, 509, 0, 0, 510, 0, 0, 511, 0, 512, - 0, 513, 514, 0, 0, 0, 0, 0, 0, 515, - 0, 0, 516, 0, 0, 0, 517, 518, 519, 520, - 521, 522, 523, 0, 0, 0, 0, 0, 0, 524, - 525, 0, 526, 527, 528, 0, 0, 529, 0, 0, - 0, 0, 159, 0, 160, 161, 162, 163, 164, 165, - 0, 0, 166, 3060, 0, 0, 167, 0, 0, 168, - 829, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 0, 178, 0, 0, 0, 179, 0, 0, 0, 180, - 0, 0, 181, 182, 183, 0, 184, 0, 185, 186, - 0, 0, 187, 0, 0, 188, 189, 0, 190, 191, - 0, 192, 193, 0, 194, 195, 196, 197, 198, 199, - 0, 200, 201, 202, 203, 204, 205, 206, 0, 207, - 208, 209, 210, 211, 212, 213, 214, 0, 215, 216, - 0, 217, 218, 219, 220, 221, 0, 222, 0, 0, - 223, 0, 0, 224, 0, 225, 0, 0, 226, 0, - 227, 0, 0, 0, 228, 229, 230, 0, 0, 231, - 0, 0, 0, 0, 232, 233, 0, 0, 0, 0, - 234, 0, 235, 0, 0, 0, 236, 0, 237, 238, - 239, 240, 241, 0, 0, 0, 0, 242, 0, 0, - 243, 244, 245, 0, 0, 0, 246, 0, 247, 248, - 0, 249, 250, 251, 0, 252, 253, 0, 254, 255, - 256, 257, 258, 259, 260, 0, 0, 261, 262, 263, - 264, 0, 0, 265, 266, 0, 267, 268, 269, 0, - 0, 270, 0, 0, 0, 271, 272, 0, 273, 0, - 274, 0, 275, 276, 277, 278, 279, 280, 281, 0, - 282, 0, 0, 283, 284, 285, 0, 286, 0, 0, - 0, 287, 288, 0, 0, 0, 289, 290, 291, 292, - 293, 0, 0, 0, 294, 295, 296, 0, 0, 297, - 0, 0, 0, 0, 298, 299, 0, 0, 0, 300, - 0, 301, 302, 0, 303, 304, 0, 0, 0, 305, - 0, 0, 306, 307, 308, 0, 0, 309, 0, 0, - 310, 311, 0, 0, 0, 0, 0, 312, 313, 0, - 314, 0, 315, 0, 316, 317, 0, 0, 0, 0, - 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, - 335, 336, 337, 0, 338, 339, 340, 341, 0, 342, - 343, 344, 0, 0, 0, 0, 345, 346, 347, 348, - 349, 350, 0, 0, 351, 352, 0, 353, 0, 354, - 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, - 364, 0, 0, 365, 0, 0, 366, 367, 368, 369, - 0, 0, 0, 370, 371, 0, 0, 0, 372, 0, - 373, 374, 375, 0, 376, 377, 378, 379, 0, 380, - 381, 0, 0, 0, 0, 0, 0, 0, 0, 382, - 383, 384, 0, 0, 385, 0, 386, 0, 387, 388, - 389, 390, 391, 392, 393, 394, 395, 396, 0, 0, - 397, 398, 399, 0, 400, 0, 401, 402, 403, 404, - 405, 0, 406, 407, 408, 0, 0, 409, 0, 0, - 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, - 417, 418, 419, 0, 420, 421, 0, 422, 423, 424, - 0, 0, 425, 0, 426, 0, 427, 428, 0, 429, - 430, 0, 431, 0, 432, 0, 0, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, 444, 0, - 445, 446, 0, 0, 0, 447, 448, 449, 450, 0, - 0, 0, 451, 0, 0, 0, 452, 0, 453, 454, - 455, 456, 457, 458, 0, 459, 460, 461, 462, 463, - 464, 0, 0, 0, 0, 0, 0, 465, 466, 0, - 467, 0, 0, 468, 0, 0, 0, 469, 470, 471, - 0, 0, 0, 472, 0, 0, 473, 474, 0, 475, - 476, 477, 478, 479, 480, 0, 0, 481, 482, 483, - 484, 0, 485, 486, 0, 0, 487, 488, 489, 490, - 0, 0, 491, 492, 0, 493, 494, 495, 496, 0, - 0, 0, 0, 0, 497, 498, 499, 0, 0, 0, - 500, 501, 502, 503, 0, 504, 505, 0, 506, 507, - 0, 508, 509, 0, 0, 510, 0, 0, 511, 0, - 512, 0, 513, 514, 0, 0, 0, 0, 0, 0, - 515, 0, 0, 516, 0, 0, 0, 517, 518, 519, - 520, 521, 522, 523, 0, 0, 0, 0, 0, 0, - 524, 525, 0, 526, 527, 528, 0, 0, 529, 0, - 0, 0, 0, 0, 0, 159, 0, 160, 161, 162, - 163, 164, 165, 0, 4871, 166, 0, 0, 0, 167, - 4872, 829, 168, 0, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 0, 178, 0, 0, 0, 179, 0, - 0, 0, 180, 0, 0, 181, 182, 183, 0, 184, - 0, 185, 186, 0, 0, 187, 0, 0, 188, 189, - 0, 190, 191, 0, 192, 193, 0, 194, 195, 196, - 197, 198, 199, 0, 200, 201, 202, 203, 204, 205, - 206, 0, 207, 208, 209, 210, 211, 212, 213, 214, - 0, 215, 216, 0, 217, 218, 219, 220, 221, 0, - 222, 0, 0, 223, 0, 0, 224, 0, 225, 0, - 0, 226, 0, 227, 0, 0, 0, 228, 229, 230, - 0, 0, 231, 0, 0, 0, 0, 232, 233, 0, - 0, 0, 0, 234, 0, 235, 0, 0, 0, 236, - 0, 237, 238, 239, 240, 241, 0, 0, 0, 0, - 242, 0, 0, 243, 244, 245, 0, 0, 0, 246, - 0, 247, 248, 0, 249, 250, 251, 0, 252, 253, - 0, 254, 255, 256, 257, 258, 259, 260, 0, 0, - 261, 262, 263, 264, 0, 0, 265, 266, 0, 267, - 268, 269, 0, 0, 270, 0, 0, 0, 271, 272, - 0, 273, 0, 274, 0, 275, 276, 277, 278, 279, - 280, 281, 0, 282, 0, 0, 283, 284, 285, 0, - 286, 0, 0, 0, 287, 288, 0, 0, 0, 289, - 290, 291, 292, 293, 0, 0, 0, 294, 295, 296, - 0, 0, 297, 0, 0, 0, 0, 298, 299, 0, - 0, 0, 300, 0, 301, 302, 0, 303, 304, 0, - 0, 0, 305, 0, 0, 306, 307, 308, 0, 0, - 309, 0, 0, 310, 311, 0, 0, 0, 0, 0, - 312, 313, 0, 314, 0, 315, 0, 316, 317, 0, - 0, 0, 0, 0, 0, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 0, 334, 335, 336, 337, 0, 338, 339, 340, - 341, 0, 342, 343, 344, 0, 0, 0, 0, 345, - 346, 347, 348, 349, 350, 0, 0, 351, 352, 0, - 353, 0, 354, 0, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 0, 0, 365, 0, 0, 366, - 367, 368, 369, 0, 0, 0, 370, 371, 0, 0, - 0, 372, 0, 373, 374, 375, 0, 376, 377, 378, - 379, 0, 380, 381, 0, 0, 0, 0, 0, 0, - 0, 0, 382, 383, 384, 0, 0, 385, 0, 386, - 0, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 0, 397, 398, 399, 0, 400, 0, 401, - 402, 403, 404, 405, 0, 406, 407, 408, 0, 0, - 409, 0, 0, 0, 410, 411, 412, 413, 414, 0, - 0, 415, 416, 417, 418, 419, 0, 420, 421, 0, - 422, 423, 424, 0, 0, 425, 0, 426, 0, 427, - 428, 0, 429, 430, 0, 431, 0, 432, 0, 0, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 443, 444, 0, 445, 446, 0, 0, 0, 447, 448, - 449, 450, 0, 0, 0, 451, 0, 0, 0, 452, - 0, 453, 454, 455, 456, 457, 458, 0, 459, 460, - 461, 462, 463, 464, 0, 0, 0, 0, 0, 0, - 465, 466, 0, 467, 0, 0, 468, 0, 0, 0, - 469, 470, 471, 0, 0, 0, 472, 0, 0, 473, - 474, 0, 475, 476, 477, 478, 479, 480, 0, 0, - 481, 482, 483, 484, 0, 485, 486, 0, 0, 487, - 488, 489, 490, 0, 0, 491, 492, 0, 493, 494, - 495, 496, 0, 0, 0, 0, 0, 497, 498, 499, - 0, 0, 0, 500, 501, 502, 503, 0, 504, 505, - 0, 506, 507, 0, 508, 509, 0, 0, 510, 0, - 0, 511, 0, 512, 0, 513, 514, 0, 0, 0, - 0, 0, 0, 515, 0, 0, 516, 0, 0, 0, - 517, 518, 519, 520, 521, 522, 523, 0, 0, 0, - 0, 0, 0, 524, 525, 0, 526, 527, 528, 0, - 0, 529, 0, 0, 0, 0, 0, 0, 159, 0, - 160, 161, 162, 163, 164, 165, 1236, 0, 166, 0, - 0, 0, 167, 0, 829, 168, 0, 169, 170, 171, - 172, 173, 174, 175, 176, 177, 0, 178, 0, 0, - 0, 179, 0, 0, 0, 180, 0, 0, 181, 182, - 183, 0, 184, 0, 185, 186, 0, 0, 187, 0, - 0, 188, 189, 0, 190, 191, 0, 192, 193, 0, - 194, 195, 196, 197, 198, 199, 0, 200, 201, 202, - 203, 204, 205, 206, 0, 207, 208, 209, 210, 211, - 212, 213, 214, 0, 215, 216, 0, 217, 218, 219, - 220, 221, 0, 222, 0, 0, 223, 0, 0, 224, - 0, 225, 0, 0, 226, 0, 227, 0, 0, 0, - 228, 229, 230, 0, 0, 231, 0, 0, 0, 0, - 232, 233, 0, 0, 0, 0, 234, 0, 235, 0, - 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, - 0, 0, 0, 242, 0, 0, 243, 244, 245, 0, - 0, 0, 246, 0, 247, 248, 0, 249, 250, 251, - 0, 252, 253, 0, 254, 255, 256, 257, 258, 259, - 260, 0, 0, 261, 262, 263, 264, 0, 0, 265, - 266, 0, 267, 268, 269, 0, 0, 270, 0, 0, - 0, 271, 272, 0, 273, 0, 274, 0, 275, 276, - 277, 278, 279, 280, 281, 0, 282, 0, 0, 283, - 284, 285, 0, 286, 0, 0, 0, 287, 288, 0, - 0, 0, 289, 290, 291, 292, 293, 0, 0, 0, - 294, 295, 296, 0, 0, 297, 0, 0, 0, 0, - 298, 299, 0, 1468, 0, 300, 0, 301, 302, 0, - 303, 304, 0, 0, 0, 305, 0, 0, 306, 307, - 308, 0, 0, 309, 0, 0, 310, 311, 0, 0, - 0, 0, 0, 312, 313, 0, 314, 0, 315, 0, - 316, 317, 0, 0, 0, 0, 0, 0, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, - 330, 331, 332, 333, 0, 334, 335, 336, 337, 0, - 338, 339, 340, 341, 0, 342, 343, 344, 0, 0, - 0, 0, 345, 346, 347, 348, 349, 350, 0, 0, - 351, 352, 0, 353, 0, 354, 0, 355, 356, 357, - 358, 359, 360, 361, 362, 363, 364, 0, 0, 365, - 0, 0, 366, 367, 368, 369, 0, 0, 0, 370, - 371, 0, 0, 0, 372, 0, 373, 374, 375, 0, - 376, 377, 378, 379, 0, 380, 381, 0, 0, 0, - 0, 0, 0, 0, 0, 382, 383, 384, 0, 0, - 385, 0, 386, 0, 387, 388, 389, 390, 391, 392, - 393, 394, 395, 396, 0, 0, 397, 398, 399, 0, - 400, 0, 401, 402, 403, 404, 405, 0, 406, 407, - 408, 0, 0, 409, 0, 0, 0, 410, 411, 412, - 413, 414, 0, 0, 415, 416, 417, 418, 419, 0, - 420, 421, 0, 422, 423, 424, 0, 0, 425, 0, - 426, 0, 427, 428, 0, 429, 430, 0, 431, 0, - 432, 0, 0, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 0, 445, 446, 0, 0, - 0, 447, 448, 449, 450, 0, 0, 0, 451, 0, - 0, 0, 452, 0, 453, 454, 455, 456, 457, 458, - 0, 459, 460, 461, 462, 463, 464, 0, 0, 0, - 0, 0, 0, 465, 466, 0, 467, 0, 0, 468, - 0, 0, 0, 469, 470, 471, 0, 0, 0, 472, - 0, 0, 473, 474, 0, 475, 476, 477, 478, 479, - 480, 0, 0, 481, 482, 483, 484, 0, 485, 486, - 0, 0, 487, 488, 489, 490, 0, 0, 491, 492, - 0, 493, 494, 495, 496, 0, 0, 0, 0, 0, - 497, 498, 499, 0, 0, 0, 500, 501, 502, 503, - 0, 504, 505, 0, 506, 507, 0, 508, 509, 0, - 0, 510, 0, 0, 511, 0, 512, 0, 513, 514, - 0, 0, 0, 0, 0, 0, 515, 0, 0, 516, - 0, 0, 0, 517, 518, 519, 520, 521, 522, 523, - 0, 0, 0, 0, 0, 0, 524, 525, 0, 526, - 527, 528, 0, 0, 529, 0, 0, 0, 0, 159, - 0, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 168, 567, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 0, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 0, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2524, 159, 0, 160, 161, - 162, 163, 164, 165, 0, 0, 166, 0, 567, 0, - 167, 0, 0, 168, 0, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 0, 178, 0, 0, 0, 179, - 0, 0, 0, 180, 0, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 0, 0, 188, - 189, 0, 190, 191, 0, 192, 193, 0, 194, 195, - 196, 197, 198, 199, 0, 200, 201, 202, 203, 204, - 205, 206, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 220, 221, - 0, 222, 0, 0, 223, 0, 0, 224, 0, 225, - 0, 0, 226, 0, 227, 0, 0, 0, 228, 229, - 230, 0, 0, 231, 0, 0, 0, 0, 232, 233, - 0, 0, 0, 0, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, - 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, - 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, - 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, - 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, - 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, - 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, - 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, - 0, 309, 0, 0, 310, 311, 0, 0, 0, 0, - 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, - 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, - 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, - 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, - 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, - 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, - 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, - 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, - 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 0, 491, 492, 0, 493, - 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, - 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, - 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, - 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 529, 0, 0, 0, 0, 0, 0, 159, - 0, 160, 161, 162, 163, 164, 165, 3281, 0, 166, - 0, 0, 0, 167, 0, 3282, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 0, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 0, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 0, 529, 0, 0, 0, 0, - 0, 0, 159, 0, 160, 161, 162, 163, 164, 165, - 0, 0, 166, 0, 0, 0, 167, 4872, 829, 168, - 0, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 0, 178, 0, 0, 0, 179, 0, 0, 0, 180, - 0, 0, 181, 182, 183, 0, 184, 0, 185, 186, - 0, 0, 187, 0, 0, 188, 189, 0, 190, 191, - 0, 192, 193, 0, 194, 195, 196, 197, 198, 199, - 0, 200, 201, 202, 203, 204, 205, 206, 0, 207, - 208, 209, 210, 211, 212, 213, 214, 0, 215, 216, - 0, 217, 218, 219, 220, 221, 0, 222, 0, 0, - 223, 0, 0, 224, 0, 225, 0, 0, 226, 0, - 227, 0, 0, 0, 228, 229, 230, 0, 0, 231, - 0, 0, 0, 0, 232, 233, 0, 0, 0, 0, - 234, 0, 235, 0, 0, 0, 236, 0, 237, 238, - 239, 240, 241, 0, 0, 0, 0, 242, 0, 0, - 243, 244, 245, 0, 0, 0, 246, 0, 247, 248, - 0, 249, 250, 251, 0, 252, 253, 0, 254, 255, - 256, 257, 258, 259, 260, 0, 0, 261, 262, 263, - 264, 0, 0, 265, 266, 0, 267, 268, 269, 0, - 0, 270, 0, 0, 0, 271, 272, 0, 273, 0, - 274, 0, 275, 276, 277, 278, 279, 280, 281, 0, - 282, 0, 0, 283, 284, 285, 0, 286, 0, 0, - 0, 287, 288, 0, 0, 0, 289, 290, 291, 292, - 293, 0, 0, 0, 294, 295, 296, 0, 0, 297, - 0, 0, 0, 0, 298, 299, 0, 0, 0, 300, - 0, 301, 302, 0, 303, 304, 0, 0, 0, 305, - 0, 0, 306, 307, 308, 0, 0, 309, 0, 0, - 310, 311, 0, 0, 0, 0, 0, 312, 313, 0, - 314, 0, 315, 0, 316, 317, 0, 0, 0, 0, - 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, - 335, 336, 337, 0, 338, 339, 340, 341, 0, 342, - 343, 344, 0, 0, 0, 0, 345, 346, 347, 348, - 349, 350, 0, 0, 351, 352, 0, 353, 0, 354, - 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, - 364, 0, 0, 365, 0, 0, 366, 367, 368, 369, - 0, 0, 0, 370, 371, 0, 0, 0, 372, 0, - 373, 374, 375, 0, 376, 377, 378, 379, 0, 380, - 381, 0, 0, 0, 0, 0, 0, 0, 0, 382, - 383, 384, 0, 0, 385, 0, 386, 0, 387, 388, - 389, 390, 391, 392, 393, 394, 395, 396, 0, 0, - 397, 398, 399, 0, 400, 0, 401, 402, 403, 404, - 405, 0, 406, 407, 408, 0, 0, 409, 0, 0, - 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, - 417, 418, 419, 0, 420, 421, 0, 422, 423, 424, - 0, 0, 425, 0, 426, 0, 427, 428, 0, 429, - 430, 0, 431, 0, 432, 0, 0, 433, 434, 435, - 436, 437, 438, 439, 440, 441, 442, 443, 444, 0, - 445, 446, 0, 0, 0, 447, 448, 449, 450, 0, - 0, 0, 451, 0, 0, 0, 452, 0, 453, 454, - 455, 456, 457, 458, 0, 459, 460, 461, 462, 463, - 464, 0, 0, 0, 0, 0, 0, 465, 466, 0, - 467, 0, 0, 468, 0, 0, 0, 469, 470, 471, - 0, 0, 0, 472, 0, 0, 473, 474, 0, 475, - 476, 477, 478, 479, 480, 0, 0, 481, 482, 483, - 484, 0, 485, 486, 0, 0, 487, 488, 489, 490, - 0, 0, 491, 492, 0, 493, 494, 495, 496, 0, - 0, 0, 0, 0, 497, 498, 499, 0, 0, 0, - 500, 501, 502, 503, 0, 504, 505, 0, 506, 507, - 0, 508, 509, 0, 0, 510, 0, 0, 511, 0, - 512, 0, 513, 514, 0, 0, 0, 0, 0, 0, - 515, 0, 0, 516, 0, 0, 0, 517, 518, 519, - 520, 521, 522, 523, 0, 0, 0, 0, 0, 0, - 524, 525, 0, 526, 527, 528, 0, 0, 529, 0, - 0, 0, 0, 159, 0, 160, 161, 162, 163, 164, - 165, 0, 0, 166, 0, 0, 0, 167, 0, 0, - 168, 567, 169, 170, 171, 172, 173, 174, 175, 176, - 177, 0, 178, 0, 0, 0, 179, 0, 0, 0, - 180, 0, 0, 181, 182, 183, 0, 184, 0, 185, - 186, 0, 0, 187, 0, 0, 188, 189, 0, 190, - 191, 0, 192, 193, 0, 194, 195, 196, 197, 198, - 199, 0, 200, 201, 202, 203, 204, 205, 206, 0, - 207, 208, 209, 210, 211, 212, 213, 214, 0, 215, - 216, 0, 217, 218, 219, 220, 221, 0, 222, 0, - 0, 223, 0, 0, 224, 0, 225, 0, 0, 226, - 0, 227, 0, 0, 0, 228, 229, 230, 0, 0, - 231, 0, 0, 0, 0, 232, 233, 0, 0, 0, - 0, 234, 0, 235, 0, 0, 0, 236, 0, 237, - 238, 239, 240, 241, 0, 0, 0, 0, 242, 0, - 0, 243, 244, 245, 0, 0, 0, 246, 0, 247, - 248, 0, 249, 250, 251, 0, 252, 253, 0, 254, - 255, 256, 257, 258, 259, 260, 0, 0, 261, 262, - 651, 264, 0, 0, 265, 266, 0, 267, 268, 269, - 0, 0, 270, 0, 0, 0, 652, 272, 0, 273, - 0, 274, 0, 275, 276, 277, 278, 279, 280, 281, - 0, 282, 0, 0, 283, 284, 285, 0, 286, 0, - 0, 0, 287, 288, 0, 0, 0, 289, 290, 291, - 292, 293, 0, 0, 0, 294, 295, 296, 0, 0, - 297, 0, 0, 0, 0, 298, 299, 0, 0, 0, - 300, 0, 301, 302, 0, 303, 304, 0, 0, 0, - 305, 0, 0, 306, 307, 308, 0, 0, 309, 0, - 0, 310, 311, 0, 0, 0, 0, 0, 312, 313, - 0, 314, 0, 315, 0, 316, 317, 0, 0, 0, - 0, 0, 0, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 0, - 334, 335, 336, 337, 0, 338, 339, 340, 341, 0, - 342, 343, 344, 0, 0, 0, 0, 345, 346, 347, - 348, 349, 350, 0, 0, 351, 352, 0, 353, 0, - 354, 0, 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 0, 0, 365, 0, 0, 366, 367, 368, - 369, 0, 0, 0, 370, 371, 0, 0, 0, 372, - 0, 373, 374, 375, 0, 376, 377, 378, 379, 0, - 380, 381, 0, 0, 0, 0, 0, 0, 0, 0, - 382, 383, 384, 0, 0, 385, 0, 386, 0, 653, - 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, - 0, 397, 398, 399, 0, 400, 0, 401, 402, 403, - 404, 405, 0, 406, 407, 408, 0, 0, 409, 0, - 0, 0, 410, 411, 412, 413, 414, 0, 0, 415, - 416, 417, 418, 419, 0, 420, 421, 0, 422, 423, - 424, 0, 0, 425, 0, 426, 0, 427, 428, 0, - 429, 430, 0, 431, 0, 432, 0, 0, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, - 0, 445, 446, 0, 0, 0, 447, 448, 449, 450, - 0, 0, 0, 451, 0, 0, 0, 452, 0, 453, - 454, 455, 456, 457, 458, 0, 459, 460, 461, 462, - 463, 464, 0, 0, 0, 0, 0, 0, 465, 466, - 0, 467, 0, 0, 468, 0, 0, 0, 469, 470, - 471, 0, 0, 0, 472, 0, 0, 473, 474, 0, - 475, 476, 477, 478, 479, 480, 0, 0, 481, 482, - 483, 484, 0, 485, 486, 0, 0, 487, 488, 489, - 490, 0, 0, 491, 492, 0, 493, 494, 495, 496, - 0, 0, 0, 0, 0, 497, 498, 499, 0, 0, - 0, 500, 501, 502, 503, 0, 504, 505, 0, 506, - 507, 0, 508, 509, 0, 0, 510, 0, 0, 511, - 0, 512, 0, 513, 514, 0, 0, 0, 0, 0, - 0, 515, 0, 0, 516, 0, 0, 0, 517, 518, - 519, 520, 521, 522, 523, 0, 0, 0, 0, 0, - 0, 524, 525, 0, 526, 527, 528, 0, 0, 529, - 0, 0, 0, 0, 159, 0, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 168, 567, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, - 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, - 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 220, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 233, 0, 0, - 0, 0, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, - 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, - 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, - 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, - 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, - 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, - 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, - 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, - 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, - 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 525, 0, 526, 527, 528, 0, 0, - 529, 0, 0, 0, 0, 159, 0, 160, 161, 162, - 163, 164, 165, 0, 0, 166, 0, 0, 0, 167, - 0, 0, 168, 829, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 0, 178, 0, 0, 0, 179, 0, - 0, 0, 180, 0, 0, 181, 182, 183, 0, 184, - 0, 185, 186, 0, 0, 187, 0, 0, 188, 189, - 0, 190, 191, 0, 192, 193, 0, 194, 195, 196, - 197, 198, 199, 0, 200, 201, 202, 203, 204, 205, - 206, 0, 207, 208, 209, 210, 211, 212, 213, 214, - 0, 215, 216, 0, 217, 218, 219, 220, 221, 0, - 222, 0, 0, 223, 0, 0, 224, 0, 225, 0, - 0, 226, 0, 227, 0, 0, 0, 228, 229, 230, - 0, 0, 231, 0, 0, 0, 0, 232, 233, 0, - 0, 0, 0, 234, 0, 235, 0, 0, 0, 236, - 0, 237, 238, 239, 240, 241, 0, 0, 0, 0, - 242, 0, 0, 243, 244, 245, 0, 0, 0, 246, - 0, 247, 248, 0, 249, 250, 251, 0, 252, 253, - 0, 254, 255, 256, 257, 258, 259, 260, 0, 0, - 261, 262, 263, 264, 0, 0, 265, 266, 0, 267, - 268, 269, 0, 0, 270, 0, 0, 0, 271, 272, - 0, 273, 0, 274, 0, 275, 276, 277, 278, 279, - 280, 281, 0, 282, 0, 0, 283, 284, 285, 0, - 286, 0, 0, 0, 287, 288, 0, 0, 0, 289, - 290, 291, 292, 293, 0, 0, 0, 294, 295, 296, - 0, 0, 297, 0, 0, 0, 0, 298, 299, 0, - 0, 0, 300, 0, 301, 302, 0, 303, 304, 0, - 0, 0, 305, 0, 0, 306, 307, 308, 0, 0, - 309, 0, 0, 310, 311, 0, 0, 0, 0, 0, - 312, 313, 0, 314, 0, 315, 0, 316, 317, 0, - 0, 0, 0, 0, 0, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 0, 334, 335, 336, 337, 0, 338, 339, 340, - 341, 0, 342, 343, 344, 0, 0, 0, 0, 345, - 346, 347, 348, 349, 350, 0, 0, 351, 352, 0, - 353, 0, 354, 0, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 0, 0, 365, 0, 0, 366, - 367, 368, 369, 0, 0, 0, 370, 371, 0, 0, - 0, 372, 0, 373, 374, 375, 0, 376, 377, 378, - 379, 0, 380, 381, 0, 0, 0, 0, 0, 0, - 0, 0, 382, 383, 384, 0, 0, 385, 0, 386, - 0, 387, 388, 389, 390, 391, 392, 393, 394, 395, - 396, 0, 0, 397, 398, 399, 0, 400, 0, 401, - 402, 403, 404, 405, 0, 406, 407, 408, 0, 0, - 409, 0, 0, 0, 410, 411, 412, 413, 414, 0, - 0, 415, 416, 417, 418, 419, 0, 420, 421, 0, - 422, 423, 424, 0, 0, 425, 0, 426, 0, 427, - 428, 0, 429, 430, 0, 431, 0, 432, 0, 0, - 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, - 443, 444, 0, 445, 446, 0, 0, 0, 447, 448, - 449, 450, 0, 0, 0, 451, 0, 0, 0, 452, - 0, 453, 454, 455, 456, 457, 458, 0, 459, 460, - 461, 462, 463, 464, 0, 0, 0, 0, 0, 0, - 465, 466, 0, 467, 0, 0, 468, 0, 0, 0, - 469, 470, 471, 0, 0, 0, 472, 0, 0, 473, - 474, 0, 475, 476, 477, 478, 479, 480, 0, 0, - 481, 482, 483, 484, 0, 485, 486, 0, 0, 487, - 488, 489, 490, 0, 0, 491, 492, 0, 493, 494, - 495, 496, 0, 0, 0, 0, 0, 497, 498, 499, - 0, 0, 0, 500, 501, 502, 503, 0, 504, 505, - 0, 506, 507, 0, 508, 509, 0, 0, 510, 0, - 0, 511, 0, 512, 0, 513, 514, 0, 0, 0, - 0, 0, 0, 515, 0, 0, 516, 0, 0, 0, - 517, 518, 519, 520, 521, 522, 523, 0, 0, 0, - 0, 0, 0, 524, 525, 0, 526, 527, 528, 0, - 0, 529, 0, 0, 0, 0, 159, 0, 160, 161, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 168, 3282, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 0, 178, 0, 0, 0, 179, - 0, 0, 0, 180, 0, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 0, 0, 188, - 189, 0, 190, 1008, 1009, 192, 193, 0, 194, 195, - 196, 197, 198, 199, 0, 200, 201, 202, 203, 204, - 205, 206, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 220, 221, - 0, 222, 0, 0, 223, 0, 0, 224, 0, 225, - 0, 0, 226, 0, 227, 0, 0, 0, 228, 229, - 230, 0, 0, 231, 0, 0, 0, 0, 232, 233, - 0, 0, 0, 1010, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, - 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, - 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, - 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, - 279, 280, 1011, 0, 282, 0, 0, 283, 284, 285, - 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, - 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, - 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, - 0, 309, 0, 0, 310, 311, 0, 0, 0, 0, - 0, 312, 313, 0, 1012, 0, 315, 0, 316, 317, - 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, - 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, - 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, - 360, 361, 1013, 363, 364, 0, 0, 365, 0, 0, - 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, - 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, - 386, 0, 387, 388, 1014, 390, 391, 392, 393, 394, - 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, - 0, 1015, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, - 448, 1016, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, - 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, - 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 0, 491, 492, 0, 493, - 494, 495, 496, 0, 0, 0, 0, 0, 1017, 498, - 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, - 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, - 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, - 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 529, 0, 0, 0, 159, 0, 160, 161, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 168, 1018, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 0, 178, 0, 0, 0, 179, - 0, 0, 0, 180, 0, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 0, 0, 188, - 189, 0, 190, 191, 0, 192, 193, 0, 194, 195, - 196, 197, 198, 199, 0, 200, 201, 202, 203, 204, - 205, 206, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 220, 221, - 0, 222, 0, 0, 223, 0, 0, 224, 0, 225, - 0, 0, 226, 0, 227, 0, 0, 0, 228, 229, - 230, 0, 0, 231, 0, 0, 0, 0, 232, 233, - 0, 0, 0, 0, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, - 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, - 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, - 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, - 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, - 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, - 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, - 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, - 0, 309, 0, 0, 310, 311, 665, 0, 0, 0, - 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, - 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, - 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, - 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, - 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, - 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, - 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, - 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, - 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 156, 491, 492, 0, 493, - 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, - 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, - 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, - 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 529, 0, 0, 0, 159, 0, 160, 161, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 168, 1539, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 0, 178, 0, 0, 0, 179, - 0, 0, 0, 180, 0, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 0, 0, 188, - 189, 0, 190, 191, 0, 192, 193, 0, 194, 195, - 196, 197, 198, 199, 0, 200, 201, 202, 203, 204, - 205, 206, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 220, 221, - 0, 222, 0, 0, 223, 0, 0, 224, 0, 225, - 0, 0, 226, 0, 227, 0, 0, 0, 228, 229, - 230, 0, 0, 231, 0, 0, 0, 0, 232, 233, - 0, 0, 0, 0, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, - 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, - 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, - 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, - 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, - 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, - 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, - 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, - 0, 309, 0, 0, 310, 311, 665, 0, 0, 0, - 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, - 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, - 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, - 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, - 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, - 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, - 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, - 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, - 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 156, 491, 492, 0, 493, - 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, - 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, - 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, - 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 529, 0, 0, 0, 159, 0, 160, 161, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 168, 1890, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 0, 178, 0, 0, 0, 179, - 0, 0, 0, 180, 0, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 0, 0, 188, - 189, 0, 190, 191, 0, 192, 193, 0, 194, 195, - 196, 197, 198, 199, 0, 200, 201, 202, 203, 204, - 205, 206, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 220, 221, - 0, 222, 0, 0, 223, 0, 0, 224, 0, 225, - 0, 0, 226, 0, 227, 0, 0, 0, 228, 229, - 230, 0, 0, 231, 0, 0, 0, 0, 232, 233, - 0, 0, 0, 0, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, - 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, - 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, - 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, - 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, - 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, - 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, - 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, - 0, 309, 0, 0, 310, 311, 665, 0, 0, 0, - 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, - 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, - 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, - 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, - 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, - 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, - 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, - 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, - 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 156, 491, 492, 0, 493, - 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, - 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, - 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, - 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 529, 0, 0, 0, 159, 0, 160, 161, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 168, 2614, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 0, 178, 0, 0, 0, 179, - 0, 0, 0, 180, 0, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 0, 0, 188, - 189, 0, 190, 1008, 1009, 192, 193, 0, 194, 195, - 196, 197, 198, 199, 0, 200, 201, 202, 203, 204, - 205, 206, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 220, 221, - 0, 222, 0, 0, 223, 0, 0, 224, 0, 225, - 0, 0, 226, 0, 227, 0, 0, 0, 228, 229, - 230, 0, 0, 231, 0, 0, 0, 0, 232, 233, - 0, 0, 0, 1010, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, - 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, - 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, - 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, - 279, 280, 1011, 0, 282, 0, 0, 283, 284, 285, - 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, - 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, - 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, - 0, 309, 0, 0, 310, 311, 0, 0, 0, 0, - 0, 312, 313, 0, 1012, 0, 315, 0, 316, 317, - 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, - 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, - 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, - 360, 361, 1013, 363, 364, 0, 0, 365, 0, 0, - 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, - 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, - 386, 0, 387, 388, 1014, 390, 391, 392, 393, 394, - 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, - 0, 1015, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, - 448, 1016, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, - 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, - 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 0, 491, 492, 0, 493, - 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, - 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, - 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, - 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 529, 0, 0, 0, 159, 0, 160, 161, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 168, 1018, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 0, 178, 0, 0, 0, 179, - 0, 0, 0, 180, 0, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 0, 0, 188, - 189, 0, 190, 191, 0, 192, 193, 0, 194, 195, - 196, 197, 198, 199, 0, 200, 201, 202, 203, 204, - 205, 206, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 1379, 215, 216, 0, 217, 218, 219, 220, 221, - 0, 222, 0, 0, 223, 0, 0, 224, 0, 225, - 0, 0, 226, 0, 227, 0, 0, 0, 228, 229, - 230, 0, 0, 231, 0, 0, 0, 0, 232, 233, - 0, 0, 0, 0, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, - 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, - 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, - 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, - 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, - 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, - 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, - 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, - 0, 309, 0, 0, 310, 311, 0, 0, 0, 0, - 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, - 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, - 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, - 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, - 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, - 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, - 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, - 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, - 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 0, 491, 492, 0, 493, - 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, - 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, - 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, - 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 529, 0, 0, 0, 159, 0, 160, 161, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 168, 1380, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 0, 178, 0, 0, 0, 179, - 0, 0, 0, 180, 0, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 0, 0, 188, - 189, 0, 190, 191, 0, 192, 193, 0, 194, 195, - 196, 197, 198, 199, 0, 200, 201, 202, 203, 204, - 205, 206, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 220, 221, - 0, 222, 0, 0, 223, 0, 0, 224, 0, 225, - 0, 0, 226, 0, 227, 0, 0, 0, 228, 229, - 230, 0, 0, 231, 0, 0, 0, 0, 232, 233, - 0, 0, 0, 0, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, - 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, - 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, - 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, - 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, - 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, - 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, - 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, - 0, 309, 0, 0, 310, 311, 0, 0, 0, 0, - 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, - 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, - 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, - 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, - 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, - 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, - 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, - 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, - 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 0, 491, 492, 0, 493, - 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, - 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, - 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, - 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 529, 0, 0, 0, 159, 0, 160, 161, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 0, 0, 1380, 169, 170, 171, 172, 173, - 174, 175, 176, 0, 0, 923, 0, 0, 0, 179, - 0, 0, 0, 180, 0, 0, 181, 182, 183, 0, - 184, 0, 0, 0, 0, 0, 187, 7, 0, 188, - 189, 0, 190, 0, 0, 0, 0, 0, 194, 195, - 196, 924, 198, 199, 0, 200, 201, 0, 0, 0, - 0, 0, 0, 207, 0, 209, 0, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 0, 221, - 0, 222, 0, 0, 223, 0, 0, 224, 0, 225, - 0, 0, 226, 0, 227, 0, 0, 0, 228, 229, - 230, 0, 0, 231, 0, 0, 0, 0, 232, 0, - 0, 0, 0, 0, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 0, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 0, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 0, 0, 0, - 0, 261, 262, 263, 264, 0, 0, 265, 266, 925, - 267, 268, 269, 0, 0, 0, 0, 0, 0, 0, - 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, - 279, 0, 281, 0, 282, 0, 0, 0, 284, 285, - 0, 0, 0, 0, 0, 0, 288, 0, 0, 0, - 289, 290, 291, 292, 293, 26, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 0, 298, 0, - 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 926, 0, 0, 305, 0, 0, 0, 307, 308, 0, - 0, 309, 927, 0, 310, 311, 0, 0, 0, 0, - 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 0, 0, 32, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, - 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, - 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, - 366, 367, 368, 369, 0, 0, 0, 0, 371, 0, - 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, - 378, 928, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 383, 384, 0, 0, 0, 0, - 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 0, 0, 0, 0, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 0, - 0, 422, 0, 424, 41, 0, 425, 0, 0, 0, - 427, 0, 0, 429, 430, 0, 431, 929, 432, 0, - 0, 433, 0, 435, 436, 437, 438, 439, 440, 441, - 0, 443, 444, 0, 445, 0, 0, 0, 0, 447, - 448, 449, 0, 0, 0, 0, 451, 0, 0, 0, - 0, 0, 0, 454, 0, 0, 457, 458, 0, 459, - 0, 461, 0, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 0, 471, 0, 0, 0, 472, 0, 0, - 0, 474, 0, 475, 476, 477, 478, 479, 480, 0, - 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 0, 491, 492, 0, 493, - 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 0, 0, 0, 501, 502, 503, 0, 504, - 505, 0, 506, 507, 0, 0, 0, 0, 0, 510, - 0, 0, 511, 0, 0, 0, 513, 514, 0, 0, - 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, - 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, - 60, 0, 0, 0, 524, 0, 0, 526, 0, 528, - 0, 159, 529, 160, 161, 162, 163, 164, 165, 0, - 0, 166, 0, 0, 0, 167, 0, 0, 168, 4568, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 0, - 178, 0, 0, 0, 179, 0, 0, 0, 180, 0, - 0, 181, 182, 183, 0, 184, 0, 185, 186, 0, - 0, 187, 0, 0, 188, 189, 0, 190, 191, 0, - 192, 193, 0, 194, 195, 196, 197, 198, 199, 0, - 200, 201, 202, 203, 204, 205, 206, 0, 207, 208, - 209, 210, 211, 212, 213, 214, 0, 215, 216, 0, - 217, 218, 219, 220, 221, 0, 222, 0, 0, 223, - 0, 0, 224, 0, 225, 1122, 0, 226, 0, 227, - 0, 0, 0, 228, 229, 230, 0, 0, 231, 0, - 0, 0, 0, 232, 233, 0, 0, 0, 0, 234, - 0, 235, 0, 0, 0, 236, 0, 237, 238, 239, - 240, 241, 0, 0, 0, 0, 242, 0, 0, 243, - 244, 245, 0, 0, 0, 246, 0, 247, 248, 0, - 249, 250, 251, 0, 252, 253, 0, 254, 255, 256, - 257, 258, 259, 260, 0, 0, 261, 262, 263, 264, - 0, 0, 265, 266, 0, 267, 268, 269, 0, 0, - 270, 0, 0, 0, 271, 272, 0, 273, 0, 274, - 0, 275, 276, 277, 278, 279, 280, 281, 0, 282, - 0, 0, 283, 284, 285, 0, 286, 0, 0, 0, - 287, 288, 0, 0, 0, 289, 290, 291, 292, 293, - 0, 0, 0, 294, 295, 296, 0, 0, 297, 0, - 0, 0, 0, 298, 299, 0, 0, 0, 300, 0, - 301, 302, 0, 303, 304, 0, 0, 0, 305, 0, - 0, 306, 307, 308, 0, 0, 309, 0, 0, 310, - 311, 665, 0, 0, 0, 0, 312, 313, 0, 314, - 0, 315, 0, 316, 317, 0, 0, 0, 0, 0, - 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, 332, 333, 0, 334, 335, - 336, 337, 0, 338, 339, 340, 341, 0, 342, 343, - 344, 0, 0, 0, 0, 345, 346, 347, 348, 349, - 350, 0, 0, 351, 352, 0, 353, 0, 354, 0, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 0, 0, 365, 0, 0, 366, 367, 368, 369, 0, - 0, 0, 370, 371, 0, 0, 0, 372, 0, 373, - 374, 375, 0, 376, 377, 378, 379, 0, 380, 381, - 0, 0, 0, 0, 0, 0, 0, 0, 382, 383, - 384, 0, 0, 385, 0, 386, 0, 387, 388, 389, - 390, 391, 392, 393, 394, 395, 396, 0, 0, 397, - 398, 399, 0, 400, 0, 401, 402, 403, 404, 405, - 0, 406, 407, 408, 0, 0, 409, 0, 0, 0, - 410, 411, 412, 413, 414, 0, 0, 415, 416, 417, - 418, 419, 0, 420, 421, 0, 422, 423, 424, 0, - 0, 425, 0, 426, 0, 427, 428, 0, 429, 430, - 0, 431, 0, 432, 0, 0, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, 444, 0, 445, - 446, 0, 0, 0, 447, 448, 449, 450, 0, 0, - 0, 451, 0, 0, 0, 452, 0, 453, 454, 455, - 456, 457, 458, 0, 459, 460, 461, 462, 463, 464, - 0, 0, 0, 0, 0, 0, 465, 466, 0, 467, - 0, 0, 468, 0, 0, 0, 469, 470, 471, 0, - 0, 0, 472, 0, 0, 473, 474, 0, 475, 476, - 477, 478, 479, 480, 0, 0, 481, 482, 483, 484, - 0, 485, 486, 0, 0, 487, 488, 489, 490, 0, - 156, 491, 492, 0, 493, 494, 495, 496, 0, 0, - 0, 0, 0, 497, 498, 499, 0, 0, 0, 500, - 501, 502, 503, 0, 504, 505, 0, 506, 507, 0, - 508, 509, 0, 0, 510, 0, 0, 511, 0, 512, - 0, 513, 514, 0, 0, 0, 0, 0, 0, 515, - 0, 0, 516, 0, 0, 0, 517, 518, 519, 520, - 521, 522, 523, 0, 0, 0, 0, 0, 0, 524, - 525, 0, 526, 527, 528, 0, 159, 529, 160, 161, - 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, - 167, 0, 1281, 168, 0, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 0, 178, 0, 0, 0, 179, - 0, 0, 0, 180, 0, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 0, 0, 188, - 189, 0, 190, 191, 0, 192, 193, 0, 194, 195, - 196, 197, 198, 199, 0, 200, 201, 202, 203, 204, - 205, 206, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 220, 221, - 0, 222, 0, 0, 223, 0, 0, 224, 0, 225, - 0, 0, 226, 0, 227, 0, 0, 0, 228, 229, - 230, 0, 0, 231, 0, 0, 0, 0, 232, 233, - 0, 0, 0, 0, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, - 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, - 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, - 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, - 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, - 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, - 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, - 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, - 0, 309, 0, 0, 310, 311, 0, 0, 0, 0, - 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, - 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, - 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, - 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, - 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, - 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, - 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, - 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, - 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 0, 491, 492, 0, 493, - 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, - 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, - 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, - 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 159, 529, 160, 161, 162, 163, 164, 165, 0, - 0, 166, 2345, 0, 0, 167, 0, 0, 168, 0, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 0, - 178, 0, 0, 0, 179, 0, 0, 0, 180, 0, - 0, 181, 182, 183, 0, 184, 0, 185, 186, 0, - 0, 187, 0, 0, 188, 189, 0, 190, 191, 0, - 192, 193, 0, 194, 195, 196, 197, 198, 199, 0, - 200, 201, 202, 203, 204, 205, 206, 0, 207, 208, - 209, 210, 211, 212, 213, 214, 0, 215, 216, 0, - 217, 218, 219, 220, 221, 0, 222, 0, 0, 223, - 0, 0, 224, 0, 225, 0, 0, 226, 0, 227, - 0, 0, 0, 228, 229, 230, 0, 0, 231, 0, - 0, 0, 0, 232, 233, 0, 0, 0, 0, 234, - 0, 235, 0, 0, 0, 236, 0, 237, 238, 239, - 240, 241, 0, 0, 0, 0, 242, 0, 0, 243, - 244, 245, 0, 0, 0, 246, 0, 247, 248, 0, - 249, 250, 251, 0, 252, 253, 0, 254, 255, 256, - 257, 258, 259, 260, 0, 0, 261, 262, 263, 264, - 0, 0, 265, 266, 0, 267, 268, 269, 0, 0, - 270, 0, 0, 0, 271, 272, 0, 273, 0, 274, - 0, 275, 276, 277, 278, 279, 280, 281, 0, 282, - 0, 0, 283, 284, 285, 0, 286, 0, 0, 0, - 287, 288, 0, 0, 0, 289, 290, 291, 292, 293, - 0, 0, 0, 294, 295, 296, 0, 0, 297, 0, - 0, 0, 0, 298, 299, 0, 0, 0, 300, 0, - 301, 302, 0, 303, 304, 0, 0, 0, 305, 0, - 0, 306, 307, 308, 0, 0, 309, 0, 0, 310, - 311, 0, 0, 0, 0, 0, 312, 313, 0, 314, - 0, 315, 0, 316, 317, 0, 0, 0, 0, 0, - 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, 332, 333, 0, 334, 335, - 336, 337, 0, 338, 339, 340, 341, 0, 342, 343, - 344, 0, 0, 0, 0, 345, 346, 347, 348, 349, - 350, 0, 0, 351, 352, 0, 353, 0, 354, 0, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 0, 0, 365, 0, 0, 366, 367, 368, 369, 0, - 0, 0, 370, 371, 0, 0, 0, 372, 0, 373, - 374, 375, 0, 376, 377, 378, 379, 0, 380, 381, - 0, 0, 0, 0, 0, 0, 0, 0, 382, 383, - 384, 0, 0, 385, 0, 386, 0, 387, 388, 389, - 390, 391, 392, 393, 394, 395, 396, 0, 0, 397, - 398, 399, 0, 400, 0, 401, 402, 403, 404, 405, - 0, 406, 407, 408, 0, 0, 409, 0, 0, 0, - 410, 411, 412, 413, 414, 0, 0, 415, 416, 417, - 418, 419, 0, 420, 421, 0, 422, 423, 424, 0, - 0, 425, 0, 426, 0, 427, 428, 0, 429, 430, - 0, 431, 0, 432, 0, 0, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, 444, 0, 445, - 446, 0, 0, 0, 447, 448, 449, 450, 0, 0, - 0, 451, 0, 0, 0, 452, 0, 453, 454, 455, - 456, 457, 458, 0, 459, 460, 461, 462, 463, 464, - 0, 0, 0, 0, 0, 0, 465, 466, 0, 467, - 0, 0, 468, 0, 0, 0, 469, 470, 471, 0, - 0, 0, 472, 0, 0, 473, 474, 0, 475, 476, - 477, 478, 479, 480, 0, 0, 481, 482, 483, 484, - 0, 485, 486, 0, 0, 487, 488, 489, 490, 0, - 0, 491, 492, 0, 493, 494, 495, 496, 0, 0, - 0, 0, 0, 497, 498, 499, 0, 0, 0, 500, - 501, 502, 503, 0, 504, 505, 0, 506, 507, 0, - 508, 509, 0, 0, 510, 0, 0, 511, 0, 512, - 0, 513, 514, 0, 0, 0, 0, 0, 0, 515, - 0, 0, 516, 0, 0, 0, 517, 518, 519, 520, - 521, 522, 523, 0, 0, 0, 0, 0, 0, 524, - 525, 0, 526, 527, 528, 0, 159, 529, 160, 161, - 162, 163, 164, 165, 0, 0, 166, 3116, 0, 0, - 167, 0, 0, 168, 0, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 0, 178, 0, 0, 0, 179, - 0, 0, 0, 180, 0, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 0, 0, 188, - 189, 0, 190, 191, 0, 192, 193, 0, 194, 195, - 196, 197, 198, 199, 0, 200, 201, 202, 203, 204, - 205, 206, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 220, 221, - 0, 222, 0, 0, 223, 0, 0, 224, 0, 225, - 0, 0, 226, 0, 227, 0, 0, 0, 228, 229, - 230, 0, 0, 231, 0, 0, 0, 0, 232, 233, - 0, 0, 0, 0, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, - 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, - 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, - 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, - 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, - 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, - 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, - 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, - 0, 309, 0, 0, 310, 311, 0, 0, 0, 0, - 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, - 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, - 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, - 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, - 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, - 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, - 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, - 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, - 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 0, 491, 492, 0, 493, - 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, - 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, - 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, - 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 159, 529, 160, 161, 162, 163, 164, 165, 0, - 0, 166, 3477, 0, 0, 167, 0, 0, 168, 0, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 0, - 178, 0, 0, 0, 179, 0, 0, 0, 180, 0, - 0, 181, 182, 183, 0, 184, 0, 185, 186, 0, - 0, 187, 0, 0, 188, 189, 0, 190, 191, 0, - 192, 193, 0, 194, 195, 196, 197, 198, 199, 0, - 200, 201, 202, 203, 204, 205, 206, 0, 207, 208, - 209, 210, 211, 212, 213, 214, 0, 215, 216, 0, - 217, 218, 219, 220, 221, 0, 222, 0, 0, 223, - 0, 0, 224, 0, 225, 0, 0, 226, 0, 227, - 0, 0, 0, 228, 229, 230, 0, 0, 231, 0, - 0, 0, 0, 232, 233, 0, 0, 0, 0, 234, - 0, 235, 0, 0, 0, 236, 0, 237, 238, 239, - 240, 241, 0, 0, 0, 0, 242, 0, 0, 243, - 244, 245, 0, 0, 0, 246, 0, 247, 248, 0, - 249, 250, 251, 0, 252, 253, 0, 254, 255, 256, - 257, 258, 259, 260, 0, 0, 261, 262, 263, 264, - 0, 0, 265, 266, 0, 267, 268, 269, 0, 0, - 270, 0, 0, 0, 271, 272, 0, 273, 0, 274, - 0, 275, 276, 277, 278, 279, 280, 281, 0, 282, - 0, 0, 283, 284, 285, 0, 286, 0, 0, 0, - 287, 288, 0, 0, 0, 289, 290, 291, 292, 293, - 0, 0, 0, 294, 295, 296, 0, 0, 297, 0, - 0, 0, 0, 298, 299, 0, 0, 0, 300, 0, - 301, 302, 0, 303, 304, 0, 0, 0, 305, 0, - 0, 306, 307, 308, 0, 0, 309, 0, 0, 310, - 311, 0, 0, 0, 0, 0, 312, 313, 0, 314, - 0, 315, 0, 316, 317, 0, 0, 0, 0, 0, - 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, 332, 333, 0, 334, 335, - 336, 337, 0, 338, 339, 340, 341, 0, 342, 343, - 344, 0, 0, 0, 0, 345, 346, 347, 348, 349, - 350, 0, 0, 351, 352, 0, 353, 0, 354, 0, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 0, 0, 365, 0, 0, 366, 367, 368, 369, 0, - 0, 0, 370, 371, 0, 0, 0, 372, 0, 373, - 374, 375, 0, 376, 377, 378, 379, 0, 380, 381, - 0, 0, 0, 0, 0, 0, 0, 0, 382, 383, - 384, 0, 0, 385, 0, 386, 0, 387, 388, 389, - 390, 391, 392, 393, 394, 395, 396, 0, 0, 397, - 398, 399, 0, 400, 0, 401, 402, 403, 404, 405, - 0, 406, 407, 408, 0, 0, 409, 0, 0, 0, - 410, 411, 412, 413, 414, 0, 0, 415, 416, 417, - 418, 419, 0, 420, 421, 0, 422, 423, 424, 0, - 0, 425, 0, 426, 0, 427, 428, 0, 429, 430, - 0, 431, 0, 432, 0, 0, 433, 434, 435, 436, - 437, 438, 439, 440, 441, 442, 443, 444, 0, 445, - 446, 0, 0, 0, 447, 448, 449, 450, 0, 0, - 0, 451, 0, 0, 0, 452, 0, 453, 454, 455, - 456, 457, 458, 0, 459, 460, 461, 462, 463, 464, - 0, 0, 0, 0, 0, 0, 465, 466, 0, 467, - 0, 0, 468, 0, 0, 0, 469, 470, 471, 0, - 0, 0, 472, 0, 0, 473, 474, 0, 475, 476, - 477, 478, 479, 480, 0, 0, 481, 482, 483, 484, - 0, 485, 486, 0, 0, 487, 488, 489, 490, 0, - 0, 491, 492, 0, 493, 494, 495, 496, 0, 0, - 0, 0, 0, 497, 498, 499, 0, 0, 0, 500, - 501, 502, 503, 0, 504, 505, 0, 506, 507, 0, - 508, 509, 0, 0, 510, 0, 0, 511, 0, 512, - 0, 513, 514, 0, 0, 0, 0, 0, 0, 515, - 0, 0, 516, 0, 0, 0, 517, 518, 519, 520, - 521, 522, 523, 0, 0, 0, 0, 0, 0, 524, - 525, 0, 526, 527, 528, 0, 159, 529, 160, 161, - 162, 163, 164, 165, 0, 0, 166, 3880, 0, 0, - 167, 0, 0, 168, 0, 169, 170, 171, 172, 173, - 174, 175, 176, 177, 0, 178, 0, 0, 1526, 179, - 0, 0, 0, 180, 0, 0, 181, 182, 183, 0, - 184, 0, 185, 186, 0, 0, 187, 0, 0, 188, - 189, 0, 190, 191, 0, 192, 193, 0, 194, 195, - 196, 197, 198, 199, 0, 200, 201, 202, 203, 204, - 205, 206, 0, 207, 208, 209, 210, 211, 212, 213, - 214, 0, 215, 216, 0, 217, 218, 219, 220, 221, - 0, 222, 0, 0, 223, 0, 0, 224, 0, 225, - 0, 0, 226, 0, 227, 0, 0, 0, 228, 229, - 230, 0, 0, 231, 0, 0, 0, 0, 232, 233, - 0, 0, 0, 1527, 234, 0, 235, 0, 0, 0, - 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, - 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, - 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, - 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, - 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, - 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, - 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, - 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, - 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, - 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, - 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, - 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, - 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, - 0, 309, 0, 0, 310, 311, 665, 0, 0, 0, - 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, - 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, - 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, - 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, - 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, - 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, - 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, - 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, - 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, - 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, - 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, - 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, - 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, - 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, - 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, - 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, - 448, 449, 450, 0, 0, 1528, 451, 0, 0, 0, - 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, - 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, - 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, - 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, - 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, - 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, - 487, 488, 489, 490, 0, 156, 491, 492, 0, 493, - 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, - 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, - 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, - 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, - 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, - 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, - 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, - 0, 0, 529, 0, 159, 1529, 160, 161, 162, 163, - 164, 165, 871, 872, 166, 0, 0, 0, 167, 0, - 0, 168, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, - 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, - 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 220, 221, 0, 222, - 0, 0, 223, 873, 0, 224, 0, 225, 0, 874, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 233, 0, 0, - 0, 0, 234, 0, 235, 875, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, - 876, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 877, 257, 258, 259, 878, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 879, 268, - 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, - 281, 880, 282, 0, 0, 283, 284, 285, 0, 286, - 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 881, - 0, 297, 0, 0, 0, 882, 298, 299, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 665, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 883, 316, 317, 0, 0, - 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, - 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 0, 397, 398, 399, 0, 400, 0, 884, 402, - 403, 404, 885, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 886, 0, - 415, 416, 417, 418, 419, 0, 887, 421, 0, 422, - 423, 424, 0, 0, 888, 0, 426, 0, 427, 428, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 0, 445, 446, 889, 0, 0, 447, 448, 449, - 450, 0, 0, 0, 451, 0, 0, 890, 891, 0, - 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, - 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 892, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 156, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 893, - 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, - 511, 894, 512, 895, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, - 529, 977, 161, 162, 163, 164, 165, 978, 872, 166, - 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 873, 0, - 224, 0, 225, 0, 874, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, - 875, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 876, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 877, 257, 258, - 259, 878, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 879, 268, 269, 0, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 880, 282, 0, 0, - 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 881, 0, 297, 0, 0, 0, - 882, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 665, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 883, 316, 317, 0, 0, 0, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 884, 402, 403, 404, 979, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 886, 0, 415, 416, 417, 418, 419, - 0, 887, 421, 0, 422, 423, 424, 0, 0, 888, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 889, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 890, 891, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 892, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 156, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 893, 0, 0, 500, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 894, 512, 895, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 168, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, - 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, - 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 220, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 233, 2592, 0, - 0, 0, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, - 269, 2593, 0, 270, 0, 0, 0, 271, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, - 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, - 2594, 0, 0, 287, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 2595, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 152, 153, 0, 370, 371, 0, 0, 2596, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, - 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, - 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, - 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, - 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, - 462, 463, 464, 0, 0, 4420, 595, 4421, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 500, 501, 502, 503, 2597, 504, 505, 0, - 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, - 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 1774, 0, 0, 3701, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 268, 269, 1775, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 3186, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 0, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 3187, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 3188, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 156, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 3189, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 168, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, - 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, - 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 220, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 233, 1774, 0, - 0, 4659, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, - 269, 1775, 0, 270, 0, 0, 0, 271, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, - 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, - 3186, 0, 0, 287, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 3187, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 370, 371, 0, 0, 3188, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, - 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, - 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, - 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, - 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, - 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 156, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 500, 501, 502, 503, 3189, 504, 505, 0, - 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, - 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 1774, 0, 0, 4728, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 268, 269, 1775, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 3186, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 0, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 3187, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 3188, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 156, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 3189, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 168, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, - 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, - 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 220, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 1122, 874, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 233, 0, 0, - 0, 0, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, - 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, - 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, - 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 665, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, - 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, - 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, - 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, - 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, - 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 156, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, - 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 1541, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 0, 0, 0, 1542, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 665, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 156, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 168, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 0, 0, 179, 1084, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, - 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, - 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 220, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 233, 0, 0, - 0, 0, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, - 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, - 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, - 1085, 1086, 0, 287, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, - 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, - 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, - 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, - 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, - 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 1087, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, - 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 0, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 2081, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 2082, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 783, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 2083, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 0, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 2084, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 168, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, - 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, - 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 220, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 233, 0, 0, - 0, 0, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, - 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, - 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, - 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 2081, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 370, 371, 0, 0, 2082, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, - 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 382, 383, 384, 0, 783, 385, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, - 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, - 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, - 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, - 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 500, 501, 502, 503, 2084, 504, 505, 0, - 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, - 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 1526, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 0, 0, 0, 1527, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 665, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 156, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 168, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, - 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, - 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 220, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 233, 0, 0, - 0, 0, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, - 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, - 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, - 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 2081, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 370, 371, 0, 0, 2082, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, - 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 382, 383, 384, 0, 783, 385, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, - 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 434, 435, 436, 4254, 438, 439, 440, 441, 442, 443, - 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, - 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, - 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, - 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 500, 501, 502, 503, 2084, 504, 505, 0, - 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, - 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 1122, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 665, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 156, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 1564, 0, 166, 0, 0, 0, 167, 0, - 0, 168, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, - 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, - 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 220, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 233, 0, 0, - 0, 0, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, - 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, - 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, - 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 665, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, - 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, - 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, - 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, - 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, - 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 156, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, - 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 874, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 665, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 156, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 168, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, - 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, - 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 220, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 233, 0, 0, - 0, 2652, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, - 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, - 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, - 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 665, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, - 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, - 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, - 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, - 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, - 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 156, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, - 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 1526, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 665, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 156, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 168, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, - 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, - 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 220, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 233, 0, 0, - 0, 0, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, - 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, - 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, - 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 665, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, - 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, - 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, - 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, - 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, - 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 156, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, - 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 3112, 0, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 0, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 156, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 168, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, - 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, - 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 220, 221, 3296, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 233, 0, 0, - 0, 0, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 259, 260, 0, 3297, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, - 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, - 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, - 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, - 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, - 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, - 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, - 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, - 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, - 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 0, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 595, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 0, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 168, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, - 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, - 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 220, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 233, 0, 0, - 0, 0, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, - 269, 0, 0, 270, 0, 0, 0, 271, 272, 1181, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, - 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, - 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, - 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, - 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, - 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, - 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, - 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, - 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 0, 0, 0, 1519, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 0, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 0, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 168, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, - 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, - 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 220, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 233, 0, 0, - 0, 1519, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, - 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, - 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, - 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, - 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, - 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, - 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, - 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, - 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 2135, 498, 499, 0, - 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, - 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 0, 0, 0, 2273, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 0, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 0, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 168, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, - 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, - 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 220, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 233, 0, 0, - 0, 0, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, - 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, - 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, - 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, - 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 0, 397, 398, 399, 3305, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, - 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, - 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, - 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, - 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, - 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 0, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 156, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 168, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, - 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, - 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 220, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 233, 0, 0, - 0, 3617, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, - 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, - 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, - 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, - 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, - 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, - 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, - 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, - 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, - 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 3625, 0, 166, - 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 0, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 0, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 168, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, - 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, - 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 220, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 233, 0, 0, - 0, 3649, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, - 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, - 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, - 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, - 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, - 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, - 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, - 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, - 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, - 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 0, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 4564, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 0, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 168, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 0, 178, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, - 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, - 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 220, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 233, 0, 0, - 0, 0, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, - 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, - 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, - 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, - 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, - 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, - 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, - 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, - 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, - 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, - 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, - 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, - 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, - 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, - 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 0, 267, 2000, 269, 0, 0, 270, 0, - 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, - 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, - 307, 308, 0, 0, 309, 0, 0, 310, 311, 0, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 2001, 368, 369, 0, 0, 0, - 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, - 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, - 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, - 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, - 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, - 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, - 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, - 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, - 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 0, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, - 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, - 526, 527, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 0, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 0, 0, 923, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 0, 0, 0, 0, 187, 7, 0, 188, 189, 0, - 190, 0, 0, 0, 0, 0, 194, 195, 196, 924, - 198, 199, 0, 200, 201, 0, 0, 0, 0, 0, - 0, 207, 0, 209, 0, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 0, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 0, 0, 0, - 0, 0, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 0, - 0, 0, 243, 244, 245, 0, -338, -338, 246, 0, - -338, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 0, 0, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 925, 267, 268, - 269, 0, 0, 0, 0, 0, 0, 0, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 0, - 281, 0, 282, 0, 0, 0, 284, 285, 0, 0, - 0, 0, 0, 0, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 26, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 0, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 926, 0, - 0, 305, 0, 0, 0, 307, 308, 0, 0, 309, - 927, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 32, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 0, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 928, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 383, 384, 0, 0, 0, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 0, - 0, 0, 0, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 0, 0, 422, - 0, 424, 41, 0, 425, 0, 0, 0, 427, 0, - 0, 429, 430, 0, 431, 929, 432, 0, 0, 433, - 0, 435, 436, 437, 438, 439, 440, 441, 0, 443, - 444, 0, 445, 0, 0, 0, 0, 447, 448, 449, - 0, 0, 0, 0, 451, 0, 0, 0, 0, 0, - 0, 454, 0, 0, 457, 458, 0, 459, 0, 461, - 0, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 0, 471, 0, 0, 0, 472, 0, 0, 0, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 0, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 0, 0, 0, 0, 510, 0, 0, - 511, 0, 0, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 60, 0, - 0, 0, 524, 0, 0, 526, 0, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 0, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 0, 0, 923, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 0, 0, 0, 0, 187, - 7, 0, 188, 189, 0, 190, 0, 0, 0, 0, - 0, 194, 195, 196, 924, 198, 199, 0, 200, 201, - 0, 0, 0, 0, 0, 0, 207, 0, 209, 0, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 0, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 0, 0, 0, 0, 0, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 0, 0, 0, 243, 244, 245, - 0, -358, 0, 246, 0, -358, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 0, 0, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 925, 267, 268, 269, 0, 0, 0, 0, - 0, 0, 0, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 0, 281, 0, 282, 0, 0, - 0, 284, 285, 0, 0, 0, 0, 0, 0, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 26, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 0, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 926, 0, 0, 305, 0, 0, 0, - 307, 308, 0, 0, 309, 927, 0, 310, 311, 0, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 32, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 0, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 928, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 383, 384, 0, - 0, 0, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 0, 0, 0, 0, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 0, 0, 422, 0, 424, 41, 0, 425, - 0, 0, 0, 427, 0, 0, 429, 430, 0, 431, - 929, 432, 0, 0, 433, 0, 435, 436, 437, 438, - 439, 440, 441, 0, 443, 444, 0, 445, 0, 0, - 0, 0, 447, 448, 449, 0, 0, 0, 0, 451, - 0, 0, 0, 0, 0, 0, 454, 0, 0, 457, - 458, 0, 459, 0, 461, 0, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 0, 471, 0, 0, 0, - 472, 0, 0, 0, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 0, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 0, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 0, 0, - 0, 0, 510, 0, 0, 511, 0, 0, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, -358, 0, 60, 0, 0, 0, 524, 0, 0, - 526, 0, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 0, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 0, 0, 923, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 0, 0, 0, 0, 187, 7, 0, 188, 189, 0, - 190, 0, 0, 0, 0, 0, 194, 195, 196, 924, - 198, 199, 0, 200, 201, 0, 0, 0, 0, 0, - 0, 207, 0, 209, 0, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 0, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 0, 0, 0, - 0, 0, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 0, - 0, 0, 243, 244, 245, 0, -355, 0, 246, 0, - -355, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 0, 0, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 925, 267, 268, - 269, 0, 0, 0, 0, 0, 0, 0, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 0, - 281, 0, 282, 0, 0, 0, 284, 285, 0, 0, - 0, 0, 0, 0, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 26, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 0, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 926, 0, - 0, 305, 0, 0, 0, 307, 308, 0, 0, 309, - 927, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 32, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 0, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 928, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 383, 384, 0, 0, 0, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 0, - 0, 0, 0, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 0, 0, 422, - 0, 424, 41, 0, 425, 0, 0, 0, 427, 0, - 0, 429, 430, 0, 431, 929, 432, 0, 0, 433, - 0, 435, 436, 437, 438, 439, 440, 441, 0, 443, - 444, 0, 445, 0, 0, 0, 0, 447, 448, 449, - 0, 0, 0, 0, 451, 0, 0, 0, 0, 0, - 0, 454, 0, 0, 457, 458, 0, 459, 0, 461, - 0, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 0, 471, 0, 0, 0, 472, 0, 0, 0, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 0, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 0, 0, 0, 0, 510, 0, 0, - 511, 0, 0, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, -355, 0, 60, 0, - 0, 0, 524, 0, 0, 526, 0, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 0, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 0, 0, 923, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 0, 0, 0, 0, 187, - 7, 0, 188, 189, 0, 190, 0, 0, 0, 0, - 0, 194, 195, 196, 924, 198, 199, 0, 200, 201, - 0, 0, 0, 0, 0, 0, 207, 0, 209, 0, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 0, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 0, 0, 0, 0, 0, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 0, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 1439, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 0, 0, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 925, 267, 268, 269, 0, 0, 0, 0, - 0, 0, 0, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 0, 281, 0, 282, 0, 0, - 0, 284, 285, 0, 0, 0, 0, 0, 0, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 26, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 0, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 926, 0, 0, 305, 0, 0, 0, - 307, 308, 0, 0, 309, 927, 0, 310, 311, 0, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 32, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 0, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 928, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 383, 384, 0, - 0, 0, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 0, 0, 0, 0, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 0, 0, 422, 0, 424, 41, 0, 425, - 0, 0, 0, 427, 0, 0, 429, 430, 0, 431, - 929, 432, 0, 0, 433, 0, 435, 436, 437, 438, - 439, 440, 441, 0, 443, 444, 0, 445, 0, 0, - 0, 0, 447, 448, 449, 0, 0, 0, 0, 451, - 0, 0, 0, 0, 0, 0, 454, 0, 0, 457, - 458, 0, 459, 0, 461, 0, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 0, 471, 0, 0, 0, - 472, 0, 0, 0, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 0, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 0, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 0, 0, - 0, 0, 510, 0, 0, 511, 0, 0, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 60, 0, 0, 0, 524, 0, 0, - 526, 0, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 0, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 0, 0, 923, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 0, 0, 0, 0, 187, 7, 0, 188, 189, 0, - 190, 0, 0, 0, 0, 0, 194, 195, 196, 924, - 198, 199, 0, 200, 201, 0, 0, 0, 0, 0, - 0, 207, 0, 209, 0, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 0, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 0, 0, 0, - 0, 0, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 0, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - -360, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 0, 0, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 925, 267, 268, - 269, 0, 0, 0, 0, 0, 0, 0, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 0, - 281, 0, 282, 0, 0, 0, 284, 285, 0, 0, - 0, 0, 0, 0, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 26, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 0, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 926, 0, - 0, 305, 0, 0, 0, 307, 308, 0, 0, 309, - 927, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 32, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 0, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 928, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 383, 384, 0, 0, 0, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 0, - 0, 0, 0, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 0, 0, 422, - 0, 424, 41, 0, 425, 0, 0, 0, 427, 0, - 0, 429, 430, 0, 431, 929, 432, 0, 0, 433, - 0, 435, 436, 437, 438, 439, 440, 441, 0, 443, - 444, 0, 445, 0, 0, 0, 0, 447, 448, 449, - 0, 0, 0, 0, 451, 0, 0, 0, 0, 0, - 0, 454, 0, 0, 457, 458, 0, 459, 0, 461, - 0, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 0, 471, 0, 0, 0, 472, 0, 0, 0, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 0, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 0, 0, 0, 0, 510, 0, 0, - 511, 0, 0, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 60, 0, - 0, 0, 524, 0, 0, 526, 0, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 0, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 0, 0, 923, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 0, 0, 0, 0, 187, - 7, 0, 188, 189, 0, 190, 0, 0, 0, 0, - 0, 194, 195, 196, 924, 198, 199, 0, 200, 201, - 0, 0, 0, 0, 0, 0, 207, 0, 209, 0, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 0, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 0, 0, 0, 0, 0, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 0, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 3154, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 0, 0, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 925, 267, 268, 269, 0, 0, 0, 0, - 0, 0, 0, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 0, 281, 0, 282, 0, 0, - 0, 284, 285, 0, 0, 0, 0, 0, 0, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 26, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 0, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 926, 0, 0, 305, 0, 0, 0, - 307, 308, 0, 0, 309, 927, 0, 310, 311, 0, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 32, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 0, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 928, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 383, 384, 0, - 0, 0, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 0, 0, 0, 0, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 0, 0, 422, 0, 424, 41, 0, 425, - 0, 0, 0, 427, 0, 0, 429, 430, 0, 431, - 929, 432, 0, 0, 433, 0, 435, 436, 437, 438, - 439, 440, 441, 0, 443, 444, 0, 445, 0, 0, - 0, 0, 447, 448, 449, 0, 0, 0, 0, 451, - 0, 0, 0, 0, 0, 0, 454, 0, 0, 457, - 458, 0, 459, 0, 461, 0, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 0, 471, 0, 0, 0, - 472, 0, 0, 0, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 0, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 0, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 0, 0, - 0, 0, 510, 0, 0, 511, 0, 0, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 60, 0, 0, 0, 524, 0, 0, - 526, 0, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 0, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 0, 0, 923, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 0, 0, 0, 0, 187, 7, 0, 188, 189, 0, - 190, 0, 0, 0, 0, 0, 194, 195, 196, 924, - 198, 199, 0, 200, 201, 0, 0, 0, 0, 0, - 0, 207, 0, 209, 0, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 0, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 0, 0, 0, - 0, 0, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 0, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 3301, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 0, 0, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 925, 267, 268, - 269, 0, 0, 0, 0, 0, 0, 0, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 0, - 281, 0, 282, 0, 0, 0, 284, 285, 0, 0, - 0, 0, 0, 0, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 26, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 0, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 926, 0, - 0, 305, 0, 0, 0, 307, 308, 0, 0, 309, - 927, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 32, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 0, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 928, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 383, 384, 0, 0, 0, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 0, - 0, 0, 0, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 0, 0, 422, - 0, 424, 41, 0, 425, 0, 0, 0, 427, 0, - 0, 429, 430, 0, 431, 929, 432, 0, 0, 433, - 0, 435, 436, 437, 438, 439, 440, 441, 0, 443, - 444, 0, 445, 0, 0, 0, 0, 447, 448, 449, - 0, 0, 0, 0, 451, 0, 0, 0, 0, 0, - 0, 454, 0, 0, 457, 458, 0, 459, 0, 461, - 0, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 0, 471, 0, 0, 0, 472, 0, 0, 0, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 0, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 0, 0, 0, 0, 510, 0, 0, - 511, 0, 0, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 60, 0, - 0, 0, 524, 0, 0, 526, 0, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 0, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 0, 0, 923, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 0, 0, 0, 0, 187, - 7, 0, 188, 189, 0, 190, 0, 0, 0, 0, - 0, 194, 195, 196, 924, 198, 199, 0, 200, 201, - 0, 0, 0, 0, 0, 0, 207, 0, 209, 0, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 0, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 0, 0, 0, 0, 0, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 0, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, -342, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 0, 0, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 925, 267, 268, 269, 0, 0, 0, 0, - 0, 0, 0, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 0, 281, 0, 282, 0, 0, - 0, 284, 285, 0, 0, 0, 0, 0, 0, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 26, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 0, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 926, 0, 0, 305, 0, 0, 0, - 307, 308, 0, 0, 309, 927, 0, 310, 311, 0, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 32, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 0, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 928, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 383, 384, 0, - 0, 0, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 0, 0, 0, 0, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 0, 0, 422, 0, 424, 41, 0, 425, - 0, 0, 0, 427, 0, 0, 429, 430, 0, 431, - 929, 432, 0, 0, 433, 0, 435, 436, 437, 438, - 439, 440, 441, 0, 443, 444, 0, 445, 0, 0, - 0, 0, 447, 448, 449, 0, 0, 0, 0, 451, - 0, 0, 0, 0, 0, 0, 454, 0, 0, 457, - 458, 0, 459, 0, 461, 0, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 0, 471, 0, 0, 0, - 472, 0, 0, 0, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 0, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 0, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 0, 0, - 0, 0, 510, 0, 0, 511, 0, 0, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 60, 0, 0, 0, 524, 0, 0, - 526, 0, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 0, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 0, 0, 923, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 0, 0, 0, 0, 187, 7, 0, 188, 189, 0, - 190, 0, 0, 0, 0, 0, 194, 195, 196, 924, - 198, 199, 0, 200, 201, 0, 0, 0, 0, 0, - 0, 207, 0, 209, 0, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 0, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 0, 0, 0, - 0, 0, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 0, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 0, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 0, 0, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 925, 267, 268, - 269, 0, 0, 0, 0, 0, 0, 0, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 0, - 281, 0, 282, 0, 0, 0, 284, 285, 0, 0, - 0, 0, 0, 0, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 26, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 0, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 926, 0, - 0, 305, 0, 0, 0, 307, 308, 0, 0, 309, - 927, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 32, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 0, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 928, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 383, 384, 0, 0, 0, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 0, - 0, 0, 0, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 0, 0, 422, - 0, 424, 41, 0, 425, 0, 0, 0, 427, 0, - 0, 429, 430, 0, 431, 929, 432, 0, 0, 433, - 0, 435, 436, 437, 438, 439, 440, 441, 0, 443, - 444, 0, 445, 0, 0, 0, 0, 447, 448, 449, - 0, 0, 0, 0, 451, 0, 0, 0, 0, 0, - 0, 454, 0, 0, 457, 458, 0, 459, 0, 461, - 0, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 0, 471, 0, 0, 0, 472, 0, 0, 0, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 0, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 0, 0, 0, 0, 510, 0, 0, - 511, 0, 0, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 60, 0, - 0, 0, 524, 0, 0, 526, 0, 528, 0, 159, - 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, - 0, 0, 0, 167, 0, 0, 0, 0, 169, 170, - 171, 172, 173, 174, 175, 176, 0, 0, 923, 0, - 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, - 182, 183, 0, 184, 0, 0, 0, 0, 0, 187, - 7, 0, 188, 189, 0, 190, 0, 0, 0, 0, - 0, 194, 195, 196, 924, 198, 199, 0, 200, 201, - 0, 0, 0, 0, 0, 0, 207, 0, 209, 0, - 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, - 219, 0, 221, 0, 222, 0, 0, 223, 0, 0, - 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, - 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, - 0, 232, 0, 0, 0, 0, 0, 234, 0, 235, - 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, - 0, 0, 0, 0, 0, 0, 0, 243, 244, 245, - 0, 0, 0, 246, 0, 0, 248, 0, 249, 250, - 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, - 0, 0, 0, 0, 261, 262, 263, 264, 0, 0, - 265, 266, 925, 267, 268, 269, 0, 0, 0, 0, - 0, 0, 0, 272, 0, 273, 0, 274, 0, 275, - 276, 277, 278, 279, 0, 281, 0, 282, 0, 0, - 0, 284, 285, 0, 0, 0, 0, 0, 0, 288, - 0, 0, 0, 289, 290, 291, 292, 293, 26, 0, - 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, - 0, 298, 0, 0, 0, 0, 300, 0, 301, 302, - 0, 303, 304, 926, 0, 0, 305, 0, 0, 0, - 307, 308, 0, 0, 309, 927, 0, 310, 311, 0, - 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, - 0, 316, 317, 0, 0, 0, 0, 32, 0, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, - 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, - 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, - 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, - 0, 371, 0, 0, 0, 372, 0, 373, 374, 375, - 0, 376, 377, 378, 928, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 383, 384, 0, - 0, 0, 0, 386, 0, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 0, 0, 0, 0, 398, 399, - 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, - 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, - 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, - 0, 420, 0, 0, 422, 0, 424, 41, 0, 425, - 0, 0, 0, 427, 0, 0, 429, 430, 0, 431, - 929, 432, 0, 0, 433, 0, 435, 436, 437, 438, - 439, 440, 441, 0, 443, 444, 0, 445, 0, 0, - 0, 0, 447, 448, 449, 0, 0, 0, 0, 451, - 0, 0, 0, 0, 0, 0, 454, 0, 0, 457, - 458, 0, 459, 0, 461, 0, 463, 464, 0, 0, - 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, - 468, 0, 0, 0, 469, 0, 471, 0, 0, 0, - 472, 0, 0, 0, 474, 0, 475, 476, 477, 478, - 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 0, 491, - 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, - 0, 497, 498, 499, 0, 0, 0, 0, 501, 502, - 503, 0, 504, 505, 0, 506, 507, 0, 0, 0, - 0, 0, 510, 0, 0, 1466, 0, 0, 0, 513, - 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, - 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, - 523, 0, 0, 60, 0, 0, 0, 524, 0, 0, - 526, 0, 528, 0, 159, 529, 160, 161, 162, 163, - 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, - 0, 0, 0, 169, 170, 171, 172, 173, 174, 175, - 176, 0, 0, 0, 0, 0, 0, 179, 0, 0, - 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, - 0, 0, 0, 0, 187, 0, 0, 188, 189, 0, - 190, 0, 0, 0, 0, 0, 194, 195, 196, 0, - 198, 199, 0, 200, 201, 0, 0, 0, 0, 0, - 0, 207, 0, 209, 0, 211, 212, 213, 214, 0, - 215, 216, 0, 217, 218, 219, 0, 221, 0, 222, - 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, - 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, - 0, 231, 0, 0, 0, 0, 232, 0, 0, 0, - 0, 0, 234, 0, 235, 0, 0, 0, 236, 0, - 237, 238, 239, 240, 241, 0, 0, 0, 0, 0, - 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, - 0, 248, 0, 249, 250, 251, 0, 252, 253, 0, - 254, 255, 256, 257, 258, 0, 0, 0, 0, 261, - 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, - 269, 0, 0, 0, 0, 0, 0, 0, 272, 0, - 273, 0, 274, 0, 275, 276, 277, 278, 279, 0, - 281, 0, 282, 0, 0, 0, 284, 285, 0, 0, - 0, 0, 0, 0, 288, 0, 0, 0, 289, 290, - 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, - 0, 297, 0, 0, 0, 0, 298, 0, 0, 0, - 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, - 0, 305, 0, 0, 0, 307, 308, 0, 0, 309, - 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, - 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, - 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, - 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, - 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, - 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, - 368, 369, 0, 0, 0, 0, 371, 0, 0, 0, - 372, 0, 373, 374, 375, 0, 376, 377, 378, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 383, 384, 0, 0, 0, 0, 386, 0, - 387, 388, 389, 390, 391, 392, 393, 394, 395, 0, - 0, 0, 0, 398, 399, 0, 400, 0, 401, 402, - 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, - 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, - 415, 416, 417, 418, 419, 0, 420, 0, 0, 422, - 0, 424, 0, 0, 425, 0, 0, 0, 427, 0, - 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, - 0, 435, 436, 437, 438, 439, 440, 441, 0, 443, - 444, 0, 445, 0, 0, 0, 0, 447, 448, 449, - 0, 0, 0, 0, 451, 0, 0, 0, 0, 0, - 0, 454, 0, 0, 457, 458, 0, 459, 0, 461, - 0, 463, 464, 0, 0, 0, 0, 0, 0, 465, - 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, - 0, 471, 0, 0, 0, 472, 0, 0, 0, 474, - 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, - 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, - 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, - 0, 0, 0, 501, 502, 503, 0, 504, 505, 0, - 506, 507, 0, 0, 0, 0, 0, 510, 0, 0, - 511, 0, 0, 0, 513, 514, 0, 0, 0, 0, - 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, - 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, - 0, 0, 524, 0, 0, 526, 0, 528, 0, 0, - 529 -}; - -static const yytype_int16 yycheck[] = -{ - 6, 3, 143, 609, 151, 608, 609, 632, 1116, 24, - 1013, 1014, 21, 930, 20, 986, 1256, 1506, 24, 1738, - 1213, 1024, 1379, 1232, 33, 6, 1035, 0, 1285, 582, - 36, 40, 1507, 140, 4, 608, 592, 661, 44, 592, - 1507, 47, 1709, 661, 1427, 962, 52, 1185, 1057, 2264, - 2107, 2108, 641, 59, 2264, 644, 1547, 766, 549, 550, - 1707, 1285, 553, 554, 555, 566, 959, 558, 559, 560, - 547, 45, 2712, 2587, 1120, 718, 1316, 1317, 2784, 2967, - 1320, 1321, 1322, 1323, 2361, 1325, 1326, 1327, 1328, 1329, - 1330, 1331, 1332, 1351, 109, 2729, 2373, 1379, 2003, 600, - 2502, 1120, 1307, 109, 3241, 926, 927, 2741, 2742, 1643, - 1315, 3081, 1620, 3067, 566, 2852, 612, 3572, 1077, 615, - 700, 1222, 3287, 703, 1430, 1450, 2463, 1675, 2262, 135, - 2262, 137, 1576, 139, 140, 141, 2061, 1967, 3108, 2112, - 3534, 2264, 2374, 3110, 1033, 2718, 2750, 1685, 600, 863, - 2692, 146, 1596, 3439, 151, 151, 137, 3551, 139, 3100, - 1604, 1605, 2337, 2337, 151, 3849, 3440, 151, 2752, 1058, - 13, 3902, 2756, 3242, 13, 2627, 17, 18, 18, 822, - 823, 824, 20, 2767, 2636, 17, 18, 20, 3711, 3373, - 3365, 834, 54, 1152, 50, 2779, 1734, 27, 20, 75, - 37, 2896, 21, 2337, 83, 2337, 18, 17, 18, 1106, - 1107, 83, 2101, 17, 18, 17, 18, 33, 39, 1191, - 1192, 1193, 17, 18, 2459, 2859, 2860, 118, 39, 63, - 163, 163, 2327, 4131, 1059, 116, 1208, 13, 17, 18, - 203, 182, 22, 31, 3611, 34, 17, 18, 2893, 2894, - 67, 39, 197, 1150, 2899, 185, 2901, 37, 182, 17, - 18, 2254, 20, 3657, 54, 66, 276, 2741, 2742, 1241, - 370, 51, 1244, 73, 66, 111, 17, 18, 197, 87, - 151, 225, 62, 63, 277, 325, 3210, 22, 163, 70, - 59, 211, 217, 1265, 1266, 294, 3220, 1269, 84, 203, - 3653, 331, 386, 12, 380, 374, 18, 378, 91, 400, - 55, 3936, 378, 46, 1286, 1287, 81, 132, 137, 456, - 9, 66, 279, 163, 367, 163, 73, 62, 63, 89, - 17, 18, 470, 260, 431, 236, 4613, 17, 18, 404, - 375, 17, 18, 465, 277, 277, 150, 134, 163, 240, - 132, 145, 231, 3637, 233, 4339, 436, 448, 200, 200, - 61, 236, 150, 283, 312, 844, 132, 21, 403, 13, - 17, 18, 257, 926, 927, 2244, 867, 930, 17, 18, - 13, 163, 3349, 262, 407, 2859, 2860, 200, 407, 3928, - 3845, 197, 37, 386, 17, 18, 445, 163, 13, 564, - 221, 222, 366, 200, 196, 200, 157, 564, 585, 962, - 221, 222, 242, 596, 2075, 4146, 529, 3054, 197, 630, - 2866, 630, 2745, 555, 171, 22, 558, 1685, 9, 630, - 585, 196, 431, 17, 18, 147, 129, 240, 2633, 369, - 37, 258, 3428, 584, 17, 18, 3432, 658, 136, 658, - 563, 72, 33, 608, 51, 418, 253, 658, 37, 566, - 263, 1354, 72, 136, 571, 62, 63, 555, 4152, 3106, - 558, 20, 3060, 169, 657, 240, 1734, 526, 426, 4018, - 286, 182, 446, 137, 63, 186, 427, 664, 511, 621, - 320, 656, 511, 600, 119, 974, 197, 122, 263, 192, - 69, 190, 146, 427, 293, 1398, 663, 294, 3074, 3075, - 3076, 591, 1221, 146, 418, 1623, 274, 474, 360, 1522, - 1109, 658, 1111, 1112, 1113, 1114, 664, 1236, 221, 564, - 366, 244, 562, 630, 294, 462, 330, 1540, 283, 545, - 253, 4818, 664, 21, 385, 4170, 431, 388, 3915, 649, - 556, 3918, 3919, 454, 3179, 503, 1052, 622, 2056, 589, - 566, 567, 17, 18, 635, 571, 536, 658, 574, 635, - 490, 3924, 679, 246, 658, 385, 366, 286, 388, 454, - 623, 385, 588, 385, 388, 510, 388, 387, 664, 658, - 385, 1171, 536, 388, 600, 558, 195, 366, 291, 461, - 3541, 1494, 608, 596, 3545, 575, 385, 1163, 54, 388, - 1163, 2745, 618, 2745, 385, 589, 656, 388, 628, 2110, - 564, 354, 493, 3511, 416, 17, 18, 385, 329, 1675, - 388, 343, 638, 1347, 17, 18, 635, 236, 439, 4094, - 387, 1534, 612, 426, 385, 615, 3217, 388, 467, 619, - 431, 416, 582, 3287, 558, 661, 1675, 663, 3942, 137, - 3174, 3549, 4121, 4647, 453, 17, 18, 312, 598, 505, - 1379, 461, 480, 679, 689, 1915, 1319, 370, 391, 1937, - 2803, 1570, 606, 689, 1573, 691, 1926, 3611, 1577, 1929, - 1579, 2866, 2866, 1336, 700, 628, 628, 703, 385, 3623, - 706, 388, 75, 493, 2061, 385, 2244, 713, 388, 385, - 3344, 630, 388, 658, 4612, 3639, 3640, 658, 1607, 1608, - 1609, 1198, 1199, 165, 2262, 597, 427, 503, 545, 662, - 662, 4125, 2866, 2968, 2866, 17, 18, 2626, 385, 2183, - 621, 388, 575, 564, 152, 294, 385, 638, 1225, 388, - 2743, 630, 540, 564, 4148, 862, 1233, 27, 1235, 575, - 766, 1720, 385, 575, 620, 388, 2861, 1664, 17, 18, - 1247, 1248, 1249, 561, 630, 1355, 1748, 1602, 1255, 2061, - 656, 615, 2687, 3967, 496, 497, 608, 662, 1406, 2327, - 630, 4522, 4159, 4524, 4525, 583, 658, 1714, 639, 2337, - 242, 385, 588, 4326, 388, 597, 644, 639, 1909, 17, - 18, 644, 385, 656, 594, 388, 657, 656, 3524, 656, - 4106, 827, 662, 829, 662, 4000, 17, 18, 658, 639, - 649, 833, 620, 17, 18, 639, 2344, 639, 4124, 4113, - 629, 17, 18, 2036, 639, 658, 11, 662, 854, 855, - 856, 661, 858, 859, 860, 657, 862, 3926, 864, 594, - 639, 2730, 1834, 658, 870, 1445, 1838, 608, 639, 4263, - 3344, 1495, 17, 18, 855, 1371, 627, 1495, 657, 860, - 662, 639, 431, 864, 3207, 1465, 657, 861, 503, 2550, - 1862, 865, 17, 18, 587, 165, 662, 1349, 639, 3345, - 658, 907, 2549, 3098, 3099, 3875, 1013, 922, 1015, 4640, - 4641, 1018, 1019, 4644, 602, 536, 922, 658, 924, 2638, - 3887, 923, 928, 3864, 3865, 367, 536, 1034, 624, 602, - 385, 2988, 3520, 388, 503, 647, 648, 649, 650, 651, - 652, 653, 654, 568, 657, 960, 571, 17, 18, 197, - 1574, 966, 639, 959, 960, 2453, 1574, 658, 3531, 639, - 966, 3527, 577, 639, 657, 1106, 1107, 1556, 1115, 236, - 657, 1685, 242, 3598, 2879, 564, 2881, 657, 658, 1475, - 4664, 657, 658, 953, 3041, 2519, 2244, 17, 18, 467, - 201, 3915, 639, 385, 3918, 3919, 388, 594, 17, 18, - 639, 1007, 385, 3517, 4735, 388, 3930, 1013, 607, 1015, - 657, 658, 1018, 1019, 200, 461, 639, 49, 657, 658, - 1734, 618, 401, 1524, 4483, 1643, 4485, 3569, 1034, 195, - 240, 17, 18, 385, 657, 658, 388, 3608, 203, 276, - 312, 2838, 130, 257, 2971, 17, 18, 420, 4732, 182, - 320, 17, 18, 17, 18, 639, 1645, 1646, 236, 656, - 3633, 2966, 3277, 3758, 250, 485, 639, 3277, 1657, 2327, - 236, 1077, 1524, 3207, 658, 3207, 1679, 485, 403, 2337, - 160, 869, 1052, 3687, 1054, 658, 635, 4057, 633, 3541, - 170, 485, 706, 3545, 13, 644, 1102, 367, 540, 1101, - 2767, 376, 27, 385, 3688, 27, 388, 1696, 4075, 83, - 1116, 3756, 379, 1108, 4508, 2118, 294, 2010, 1115, 1115, - 3765, 129, 376, 1832, 129, 1140, 354, 153, 1115, 1103, - 1104, 1115, 17, 18, 1140, 656, 385, 485, 190, 388, - 132, 17, 18, 1149, 3376, 3070, 1152, 2622, 376, 2624, - 2625, 2044, 2045, 2701, 3277, 3128, 376, 2624, 2625, 2399, - 376, 1714, 2208, 251, 3091, 1171, 1181, 485, 1149, 2178, - 3345, 3345, 371, 961, 494, 1181, 3006, 385, 650, 4573, - 388, 623, 555, 13, 639, 657, 218, 192, 399, 2208, - 1642, 1298, 2730, 35, 385, 2204, 376, 388, 2696, 3536, - 386, 385, 657, 658, 388, 376, 579, 2745, 2346, 385, - 287, 3345, 388, 3345, 266, 1221, 658, 431, 17, 18, - 376, 136, 4677, 129, 17, 18, 485, 146, 1335, 656, - 1236, 17, 18, 17, 18, 4159, 656, 664, 2736, 564, - 385, 2566, 1349, 388, 2688, 859, 494, 639, 656, 427, - 12, 2557, 660, 418, 3949, 3950, 639, 231, 129, 233, - 385, 3956, 656, 388, 3959, 3960, 658, 17, 18, 2474, - 540, 2480, 2481, 1380, 657, 658, 90, 656, 477, 1285, - 2169, 3976, 283, 291, 108, 1928, 291, 639, 262, 242, - 494, 502, 1298, 2182, 427, 3990, 2185, 2186, 112, 3994, - 3995, 3996, 3997, 3998, 384, 657, 3951, 1309, 656, 3954, - 2269, 388, 17, 18, 366, 385, 146, 242, 388, 67, - 242, 192, 2562, 2861, 644, 17, 18, 564, 2866, 1335, - 2587, 246, 17, 18, 1340, 738, 739, 2835, 656, 3984, - 3985, 3986, 2840, 1349, 664, 433, 1453, 3992, 1354, 1355, - 2848, 2849, 2061, 623, 3999, 385, 2854, 639, 388, 479, - 525, 4650, 370, 485, 390, 370, 385, 368, 1948, 388, - 2878, 133, 2473, 1379, 1380, 657, 658, 369, 6, 3026, - 608, 532, 2483, 658, 277, 291, 253, 4043, 658, 4554, - 639, 628, 1398, 17, 18, 320, 644, 656, 320, 385, - 1406, 1371, 388, 1418, 658, 1411, 273, 1413, 657, 658, - 813, 253, 1418, 385, 367, 580, 388, 1524, 545, 385, - 291, 385, 388, 24, 388, 3222, 4591, 4592, 1434, 556, - 3274, 639, 60, 4888, 276, 17, 18, 2694, 658, 1445, - 644, 607, 658, 3348, 558, 367, 478, 1453, 639, 1419, - 658, 3248, 3249, 1468, 542, 639, 621, 17, 18, 1465, - 3304, 1957, 1468, 639, 370, 4435, 4631, 658, 2048, 288, - 2694, 874, 2730, 606, 658, 1377, 17, 18, 658, 556, - 17, 18, 658, 563, 3018, 3019, 3020, 658, 1494, 1495, - 17, 18, 1498, 386, 639, 17, 18, 13, 2141, 370, - 385, 1507, 658, 388, 61, 1475, 1647, 656, 13, 385, - 258, 1517, 388, 658, 639, 17, 18, 214, 1524, 1525, - 536, 494, 4162, 151, 4164, 658, 17, 18, 1534, 348, - 2244, 3933, 2541, 658, 656, 1642, 4825, 4826, 660, 454, - 1546, 1547, 0, 4280, 4432, 1560, 136, 1562, 244, 3216, - 3217, 1557, 1558, 1559, 1560, 1561, 1562, 253, 1665, 2132, - 4697, 2062, 4516, 260, 4220, 1571, 1572, 4223, 1574, 639, - 485, 163, 1578, 174, 650, 1682, 1557, 1558, 1559, 587, - 1561, 657, 587, 133, 1599, 134, 385, 540, 658, 388, - 494, 1572, 385, 1599, 644, 388, 963, 1578, 440, 385, - 616, 385, 388, 2861, 388, 2498, 413, 1577, 2866, 639, - 2062, 585, 3087, 2327, 362, 564, 4353, 4354, 540, 485, - 639, 494, 2211, 2337, 644, 182, 2215, 2216, 658, 186, - 146, 2225, 2226, 185, 608, 385, 1642, 1643, 388, 658, - 197, 146, 4156, 278, 2200, 214, 281, 2200, 2242, 133, - 1552, 1553, 4358, 639, 1669, 2701, 246, 2251, 2252, 1665, - 1666, 1667, 1668, 1669, 2667, 2858, 3571, 639, 501, 3207, - 623, 644, 658, 639, 223, 639, 1682, 17, 18, 173, - 385, 587, 2701, 388, 644, 564, 658, 602, 83, 386, - 1705, 664, 658, 385, 658, 391, 388, 13, 1704, 1705, - 385, 623, 252, 388, 4344, 585, 291, 656, 4682, 17, - 18, 4685, 2605, 3070, 1720, 1082, 587, 536, 1688, 1122, - 25, 3104, 17, 18, 3224, 3223, 133, 3225, 2322, 2323, - 2324, 2325, 17, 18, 3232, 1741, 364, 1743, 3238, 3239, - 644, 656, 2880, 17, 18, 294, 612, 613, 3246, 656, - 3250, 17, 18, 277, 639, 3253, 3254, 664, 2651, 75, - 664, 385, 4510, 639, 388, 4042, 431, 600, 3266, 3267, - 3268, 644, 329, 658, 3272, 3273, 3620, 656, 2695, 2984, - 528, 664, 658, 46, 664, 370, 615, 452, 3070, 618, - 656, 664, 1933, 428, 17, 18, 197, 545, 3055, 200, - 17, 18, 430, 385, 432, 83, 388, 3345, 18, 642, - 3654, 363, 364, 2816, 3312, 3313, 3314, 369, 627, 17, - 18, 3665, 4336, 488, 3668, 385, 1832, 1833, 388, 105, - 214, 3055, 4806, 147, 2477, 1987, 231, 1989, 233, 3486, - 639, 231, 1949, 233, 385, 252, 639, 388, 385, 17, - 18, 388, 20, 639, 3047, 639, 17, 18, 385, 658, - 454, 388, 386, 385, 454, 658, 388, 262, 17, 18, - 427, 4619, 658, 485, 658, 17, 18, 17, 18, 17, - 18, 493, 218, 385, 234, 286, 388, 1893, 636, 639, - 2031, 18, 155, 2370, 385, 485, 555, 388, 2375, 558, - 555, 2519, 608, 558, 2522, 147, 203, 2824, 658, 17, - 18, 234, 2389, 17, 18, 2067, 2068, 2069, 17, 18, - 4554, 1936, 214, 17, 18, 17, 18, 263, 44, 1935, - 1936, 218, 17, 18, 639, 3433, 52, 17, 18, 17, - 18, 3608, 1948, 1949, 17, 18, 2423, 639, 17, 18, - 605, 657, 658, 658, 639, 2062, 1962, 4591, 4592, 143, - 141, 1967, 621, 380, 242, 657, 1972, 243, 250, 1975, - 2077, 1986, 1987, 658, 1989, 159, 263, 4617, 4618, 50, - 1986, 1987, 2606, 1989, 260, 200, 2542, 1957, 2606, 2542, - 631, 632, 17, 18, 2495, 3252, 272, 4631, 2013, 613, - 612, 613, 2017, 2559, 2010, 2558, 2559, 2013, 2115, 363, - 364, 2017, 602, 2490, 4130, 639, 2730, 658, 17, 18, - 147, 3688, 198, 4139, 17, 18, 17, 18, 3252, 343, - 582, 2046, 2047, 493, 658, 17, 18, 504, 2044, 2045, - 2046, 2047, 2048, 2495, 656, 385, 598, 504, 388, 17, - 18, 294, 2067, 2068, 2069, 2061, 2062, 639, 17, 18, - 657, 2067, 2068, 2069, 17, 18, 656, 485, 608, 2672, - 491, 2077, 2042, 3564, 662, 657, 567, 385, 354, 639, - 388, 1134, 1135, 361, 234, 2100, 2092, 3345, 240, 367, - 385, 657, 658, 388, 2100, 608, 3067, 657, 639, 2672, - 385, 343, 639, 388, 2110, 240, 3023, 283, 240, 2115, - 558, 385, 639, 664, 388, 603, 657, 639, 658, 385, - 657, 418, 388, 558, 664, 525, 2132, 1180, 173, 81, - 657, 3140, 17, 18, 1069, 657, 3636, 639, 17, 18, - 1075, 1076, 2695, 3352, 656, 658, 2152, 2861, 639, 157, - 3153, 664, 2866, 575, 3537, 657, 3049, 2751, 6, 437, - 2754, 2755, 385, 2757, 656, 388, 2760, 2761, 385, 2184, - 2764, 388, 3381, 3382, 656, 2769, 656, 2147, 2184, 2149, - 2774, 2775, 2776, 2777, 2778, 62, 63, 385, 2782, 2783, - 388, 2785, 368, 469, 2168, 3404, 73, 2791, 2792, 2793, - 2794, 656, 161, 2797, 2798, 656, 2800, 2213, 2214, 200, - 656, 2217, 3033, 3034, 3035, 3036, 343, 385, 17, 18, - 388, 658, 17, 18, 385, 656, 3758, 388, 525, 3422, - 17, 18, 656, 2214, 17, 18, 385, 656, 22, 388, - 656, 17, 18, 385, 196, 385, 388, 385, 388, 664, - 388, 656, 2267, 37, 2361, 626, 627, 3146, 629, 2229, - 631, 2267, 540, 2269, 3521, 541, 2373, 51, 2238, 2239, - 2864, 2824, 86, 2829, 88, 656, 2829, 385, 62, 63, - 388, 385, 656, 580, 388, 564, 385, 656, 240, 388, - 83, 385, 656, 385, 388, 656, 388, 656, 779, 639, - 385, 17, 18, 388, 97, 385, 178, 385, 388, 656, - 388, 263, 385, 3570, 592, 388, 385, 657, 132, 388, - 801, 656, 17, 18, 621, 656, 17, 18, 656, 20, - 656, 639, 2338, 814, 815, 2341, 656, 651, 652, 653, - 654, 155, 657, 658, 639, 623, 3570, 17, 18, 657, - 129, 657, 658, 656, 639, 2361, 657, 658, 656, 2466, - 385, 3070, 657, 388, 608, 639, 473, 2373, 1399, 496, - 497, 1402, 657, 639, 1405, 17, 18, 191, 20, 555, - 115, 656, 558, 657, 129, 661, 385, 147, 2495, 388, - 2497, 657, 385, 3310, 385, 388, 4453, 388, 657, 658, - 3018, 3019, 3020, 385, 243, 13, 388, 649, 650, 651, - 652, 653, 654, 192, 4629, 656, 639, 385, 4628, 656, - 388, 260, 639, 656, 3956, 656, 385, 3959, 3960, 388, - 656, 212, 385, 272, 657, 388, 656, 3630, 173, 178, - 657, 639, 221, 656, 3976, 657, 658, 192, 400, 556, - 3074, 3075, 3076, 656, 561, 656, 3074, 3075, 3076, 657, - 2466, 656, 3994, 656, 416, 136, 657, 658, 203, 656, - 3023, 639, 265, 17, 18, 3078, 221, 656, 639, 656, - 3033, 3034, 3035, 3036, 200, 2491, 231, 656, 233, 2495, - 639, 2497, 2498, 657, 658, 27, 657, 639, 605, 639, - 385, 639, 2979, 388, 540, 200, 385, 2614, 657, 388, - 656, 3514, 291, 2519, 621, 657, 2522, 657, 417, 657, - 647, 648, 649, 650, 651, 652, 653, 654, 4026, 473, - 4028, 639, 4030, 3157, 656, 639, 317, 318, 146, 3157, - 639, 322, 323, 324, 3553, 639, 291, 639, 341, 657, - 656, 83, 383, 657, 639, 2561, 4031, 3566, 657, 639, - 656, 639, 575, 657, 4031, 657, 639, 27, 657, 658, - 639, 376, 657, 366, 656, 246, 4074, 657, 34, 657, - 394, 2587, 656, 343, 657, 2591, 385, 3844, 657, 388, - 385, 370, 4736, 388, 657, 658, 657, 658, 385, 2605, - 2606, 388, 385, 3741, 656, 388, 657, 658, 2614, 385, - 2717, 2718, 388, 656, 639, 223, 2622, 656, 2624, 2625, - 3844, 656, 3211, 83, 438, 370, 3215, 3230, 656, 85, - 469, 3345, 657, 165, 656, 83, 429, 3231, 656, 2645, - 639, 2647, 4309, 4310, 4788, 2651, 639, 4791, 639, 656, - 3244, 183, 657, 658, 657, 658, 656, 639, 657, 657, - 658, 657, 658, 63, 657, 37, 2672, 656, 3776, 385, - 656, 639, 388, 657, 658, 2645, 2649, 657, 658, 4823, - 639, 3938, 83, 418, 62, 63, 639, 656, 2694, 657, - 385, 63, 656, 388, 385, 656, 97, 388, 2704, 2714, - 2715, 656, 541, 2709, 657, 161, 657, 658, 2714, 2715, - 242, 2717, 2718, 656, 3938, 385, 656, 165, 388, 119, - 656, 4778, 122, 183, 157, 158, 657, 658, 2709, 656, - 130, 35, 525, 4452, 20, 656, 496, 497, 656, 140, - 657, 658, 28, 385, 656, 3236, 388, 119, 148, 656, - 122, 656, 20, 656, 639, 657, 658, 3310, 130, 656, - 639, 28, 2732, 2733, 2734, 2735, 656, 2737, 2738, 657, - 658, 376, 657, 657, 658, 656, 148, 555, 657, 4277, - 4278, 4279, 242, 454, 567, 13, 656, 73, 320, 656, - 2796, 657, 658, 193, 242, 657, 658, 83, 4007, 3966, - 3967, 657, 658, 3970, 658, 2811, 73, 161, 587, 236, - 594, 511, 4169, 52, 485, 13, 83, 2823, 662, 657, - 658, 2827, 3989, 558, 657, 658, 288, 4316, 3995, 361, - 614, 615, 4889, 657, 658, 367, 665, 105, 657, 658, - 639, 657, 587, 147, 639, 580, 132, 45, 52, 2990, - 658, 251, 639, 39, 657, 658, 639, 383, 657, 376, - 320, 200, 657, 639, 265, 132, 2836, 2837, 376, 2839, - 657, 2841, 2842, 2843, 2844, 2845, 2846, 2847, 657, 251, - 2850, 657, 479, 2853, 596, 4052, 621, 2857, 648, 649, - 650, 651, 652, 653, 654, 163, 50, 567, 657, 658, - 98, 361, 12, 3527, 277, 103, 3013, 367, 200, 3527, - 651, 519, 520, 361, 522, 3392, 524, 493, 146, 367, - 206, 298, 299, 639, 657, 658, 664, 195, 115, 197, - 504, 602, 172, 541, 656, 147, 122, 314, 657, 658, - 341, 3035, 3036, 129, 639, 231, 214, 233, 639, 253, - 197, 219, 536, 353, 129, 555, 356, 413, 657, 658, - 3563, 511, 363, 364, 231, 366, 233, 536, 236, 639, - 3447, 288, 276, 3080, 164, 243, 197, 263, 92, 435, - 657, 658, 250, 658, 356, 656, 658, 1273, 1274, 437, - 3563, 377, 260, 657, 658, 223, 263, 639, 551, 185, - 3006, 657, 3008, 163, 272, 115, 192, 3013, 540, 277, - 3025, 3017, 3018, 3019, 3020, 471, 132, 192, 286, 3025, - 118, 3610, 663, 133, 3613, 3614, 3032, 6, 429, 4386, - 657, 658, 4199, 433, 147, 221, 222, 224, 382, 343, - 117, 4208, 3048, 3049, 657, 658, 221, 4287, 4, 3055, - 4217, 657, 658, 657, 658, 4222, 484, 255, 253, 363, - 364, 621, 129, 173, 3070, 132, 443, 444, 3074, 3075, - 3076, 657, 658, 658, 3080, 531, 400, 363, 364, 161, - 540, 3087, 59, 369, 4192, 4574, 354, 657, 658, 446, - 376, 623, 540, 203, 657, 658, 363, 364, 664, 4207, - 657, 658, 369, 658, 127, 291, 3112, 73, 376, 376, - 657, 658, 105, 13, 657, 658, 291, 296, 386, 298, - 299, 657, 658, 627, 525, 192, 658, 4625, 657, 501, - 416, 343, 330, 657, 3241, 314, 440, 657, 658, 146, - 253, 10, 3112, 658, 592, 4338, 657, 658, 664, 416, - 418, 3157, 58, 656, 221, 3170, 3162, 657, 3173, 657, - 658, 657, 68, 623, 3170, 657, 658, 3173, 3174, 355, - 657, 571, 657, 658, 664, 623, 82, 287, 4095, 365, - 276, 3162, 66, 369, 370, 3479, 3480, 664, 94, 95, - 96, 376, 496, 497, 4451, 370, 394, 81, 165, 571, - 600, 469, 663, 489, 3210, 392, 229, 113, 512, 93, - 658, 52, 3221, 3219, 3220, 288, 403, 288, 3227, 288, - 3226, 658, 489, 410, 291, 493, 288, 4451, 600, 288, - 343, 3819, 3820, 288, 658, 3241, 3242, 644, 656, 555, - 234, 3247, 3251, 129, 129, 230, 3252, 3262, 3257, 283, - 243, 147, 658, 200, 3263, 3264, 3262, 293, 3228, 3229, - 4269, 4454, 66, 167, 443, 444, 129, 260, 3274, 3825, - 662, 401, 3825, 541, 658, 3281, 3282, 81, 575, 272, - 575, 3287, 658, 665, 496, 497, 3256, 575, 400, 93, - 658, 519, 520, 521, 522, 523, 524, 644, 3304, 197, - 204, 147, 658, 370, 602, 628, 192, 192, 418, 253, - 333, 597, 196, 541, 337, 513, 658, 3287, 202, 664, - 658, 344, 509, 3912, 129, 73, 658, 132, 596, 192, - 597, 536, 253, 4250, 254, 221, 221, 3343, 651, 607, - 608, 3347, 517, 647, 648, 649, 650, 651, 652, 653, - 654, 553, 256, 187, 552, 197, 240, 253, 221, 658, - 628, 354, 630, 172, 268, 4473, 4474, 536, 4476, 20, - 508, 4538, 405, 4540, 203, 178, 644, 173, 564, 263, - 142, 491, 568, 496, 497, 571, 656, 192, 404, 657, - 658, 657, 196, 661, 662, 658, 582, 4400, 202, 658, - 4593, 587, 425, 56, 590, 291, 291, 627, 607, 603, - 658, 200, 587, 657, 657, 525, 221, 129, 605, 4676, - 132, 657, 657, 657, 3531, 651, 332, 657, 291, 200, - 657, 4539, 657, 650, 658, 3441, 240, 649, 650, 651, - 652, 653, 654, 3449, 350, 656, 556, 343, 657, 657, - 657, 657, 4676, 357, 105, 658, 657, 4193, 4194, 263, - 483, 4654, 658, 649, 650, 657, 657, 656, 4024, 657, - 4206, 4024, 596, 494, 656, 656, 469, 4213, 654, 3449, - 192, 658, 656, 564, 370, 370, 291, 657, 4224, 4225, - 658, 658, 564, 4601, 3500, 4603, 4604, 343, 129, 4416, - 564, 132, 232, 232, 4507, 4422, 241, 370, 250, 221, - 575, 621, 163, 658, 656, 3521, 3522, 547, 12, 3525, - 587, 3527, 656, 13, 4764, 3531, 3633, 212, 129, 200, - 658, 132, 416, 564, 647, 648, 649, 650, 651, 652, - 653, 654, 4095, 176, 474, 4516, 197, 658, 541, 58, - 3556, 115, 214, 495, 197, 664, 197, 3563, 3564, 68, - 274, 192, 656, 214, 3570, 370, 190, 656, 219, 3575, - 658, 658, 664, 82, 3589, 481, 4579, 105, 664, 291, - 204, 664, 200, 3589, 658, 94, 95, 96, 426, 657, - 221, 192, 243, 4833, 493, 3604, 400, 601, 3568, 250, - 496, 497, 625, 197, 113, 3611, 658, 658, 4865, 260, - 105, 376, 416, 3615, 3620, 376, 352, 3623, 641, 4876, - 221, 272, 525, 4880, 525, 484, 277, 3633, 4885, 376, - 514, 3637, 525, 3639, 3640, 286, 525, 543, 202, 197, - 131, 4865, 266, 525, 268, 656, 644, 3653, 3654, 567, - 496, 497, 4876, 644, 560, 644, 4880, 14, 370, 3665, - 291, 4885, 3668, 644, 3634, 603, 644, 287, 4329, 644, - 644, 644, 4333, 3643, 644, 644, 240, 608, 658, 644, - 3695, 644, 28, 644, 30, 4291, 3692, 644, 664, 3695, - 291, 644, 644, 644, 3700, 644, 644, 4250, 644, 3705, - 161, 587, 587, 354, 644, 644, 3712, 644, 249, 249, - 514, 485, 657, 597, 3720, 243, 62, 63, 644, 65, - 7, 3727, 657, 664, 587, 376, 658, 73, 657, 657, - 657, 3712, 260, 657, 657, 386, 360, 83, 657, 370, - 644, 645, 646, 657, 272, 91, 658, 104, 243, 4857, - 575, 647, 648, 649, 650, 651, 652, 653, 654, 664, - 575, 575, 664, 658, 635, 260, 283, 418, 89, 370, - 50, 644, 118, 656, 575, 656, 656, 272, 656, 136, - 83, 383, 587, 644, 200, 200, 132, 4412, 91, 135, - 200, 415, 3899, 597, 151, 176, 658, 260, 658, 4716, - 260, 647, 648, 649, 650, 651, 652, 653, 654, 389, - 50, 219, 564, 340, 564, 118, 173, 257, 469, 165, - 177, 431, 658, 332, 370, 7, 354, 334, 3834, 656, - 196, 376, 189, 3839, 118, 118, 81, 400, 3844, 400, - 115, 350, 493, 4504, 400, 142, 3816, 575, 376, 261, - 4511, 556, 261, 400, 556, 212, 142, 400, 50, 354, - 37, 400, 165, 4416, 4470, 402, 400, 4461, 4462, 4422, - 400, 4465, 4466, 4467, 4468, 587, 400, 449, 662, 656, - 4883, 376, 214, 240, 656, 231, 656, 233, 656, 246, - 541, 664, 651, 3899, 240, 3901, 3902, 251, 173, 656, - 3906, 247, 656, 251, 657, 656, 470, 4501, 657, 3915, - 431, 657, 3918, 3919, 657, 383, 262, 658, 3924, 658, - 3926, 4838, 656, 3893, 3930, 657, 664, 491, 203, 286, - 657, 657, 3938, 657, 651, 4042, 3942, 240, 3944, 376, - 236, 469, 657, 278, 400, 596, 4863, 658, 349, 453, - 514, 658, 200, 657, 463, 664, 587, 608, 260, 4100, - 260, 386, 139, 657, 657, 240, 431, 644, 658, 658, - 629, 118, 481, 319, 469, 656, 465, 628, 400, 630, - 234, 263, 263, 656, 664, 575, 587, 216, 165, 658, - 662, 168, 338, 644, 558, 4589, 4590, 561, 658, 657, - 656, 50, 657, 487, 4598, 657, 657, 658, 4014, 630, - 661, 662, 287, 541, 274, 657, 319, 467, 181, 286, - 644, 645, 646, 212, 154, 4031, 564, 270, 205, 658, - 657, 657, 485, 597, 543, 338, 4042, 260, 260, 658, - 511, 605, 4012, 376, 656, 634, 541, 393, 225, 395, - 656, 560, 657, 657, 231, 658, 233, 403, 361, 656, - 263, 263, 419, 658, 630, 658, 657, 20, 656, 414, - 376, 376, 83, 239, 197, 4678, 197, 4738, 4739, 197, - 657, 567, 439, 277, 657, 370, 657, 657, 657, 63, - 447, 251, 657, 340, 265, 657, 426, 657, 455, 658, - 657, 18, 4249, 657, 383, 630, 250, 656, 658, 657, - 75, 288, 664, 657, 656, 4121, 608, 418, 480, 20, - 4126, 608, 658, 656, 4130, 657, 608, 178, 485, 475, - 132, 132, 558, 4139, 656, 312, 412, 656, 413, 87, - 4146, 498, 499, 418, 656, 503, 664, 150, 132, 37, - 370, 180, 658, 4159, 340, 657, 143, 564, 564, 564, - 263, 4176, 28, 4716, 30, 558, 612, 279, 656, 4178, - 4176, 250, 608, 608, 657, 376, 382, 658, 4184, 656, - 316, 17, 18, 657, 4325, 618, 618, 533, 534, 535, - 527, 176, 464, 550, 540, 470, 62, 63, 657, 65, - 474, 658, 657, 64, 383, 4811, 602, 73, 546, 50, - 556, 50, 4214, 559, 160, 50, 491, 83, 656, 465, - 4226, 370, 4228, 580, 250, 91, 39, 656, 656, 656, - 376, 15, 578, 656, 602, 4241, 656, 540, 132, 4241, - 417, 263, 20, 263, 369, 602, 644, 604, 630, 426, - 596, 176, 118, 556, 199, 566, 142, 530, 142, 656, - 165, 50, 50, 50, 441, 197, 132, 656, 397, 135, - 657, 4286, 657, 656, 365, 370, 656, 4384, 656, 656, - 4286, 556, 459, 4289, 656, 4838, 561, 123, 124, 125, - 126, 127, 547, 613, 657, 13, 656, 162, 657, 165, - 286, 656, 658, 547, 657, 580, 12, 656, 26, 122, - 4863, 66, 658, 383, 66, 656, 129, 50, 50, 37, - 38, 657, 656, 140, 4330, 656, 503, 582, 197, 506, - 605, 658, 150, 5, 376, 376, 383, 592, 657, 657, - 383, 439, 136, 602, 62, 63, 621, 474, 658, 657, - 232, 156, 263, 657, 609, 50, 74, 476, 236, 536, - 370, 656, 493, 2504, 658, 231, 2649, 233, 623, 2855, - 4030, 4026, 185, 4498, 240, 4028, 1054, 3203, 4384, 192, - 4144, 247, 100, 934, 102, 1107, 104, 4496, 4615, 4785, - 226, 227, 228, 229, 4396, 4781, 262, 4323, 116, 4568, - 1131, 4020, 52, 610, 1972, 2060, 3006, 3826, 221, 222, - 276, 2289, 4418, 4419, 3033, 4385, 2560, 695, 1691, 137, - 138, 2558, 4514, 2559, 1179, 1937, 4335, 2810, 2264, 3663, - 3043, 3838, 3048, 3500, 4584, 1450, 4287, 4680, 4833, 694, - 3841, 4772, 4811, 4470, 2208, 4451, 164, 165, 4153, 3281, - 2803, 169, 3906, 319, 172, 2811, 3284, 4846, 4658, 3699, - 3373, 3967, 4000, 718, 4371, 4396, 4678, 4384, 723, 2717, - 4611, 4039, 338, 3429, 3432, 2954, 3424, 4483, 291, 4485, - 4787, 84, 84, 201, 4738, 203, 4739, 4594, 4160, 4620, - 4511, 4504, 4207, 211, 3277, 213, 1081, 333, 2810, 335, - 336, 337, 4330, 2691, 1144, 4182, 761, 2269, 344, 1616, - 4672, 2581, 3925, 231, 3025, 233, 4522, 4658, 4524, 4525, - 2549, 239, 240, 778, 2046, 4531, 3487, 393, 2460, 395, - 4500, 1731, 1705, 2610, 4411, 1004, 4656, 403, 3449, 991, - 2990, 2106, 355, 261, 2369, 1098, 2637, 2365, 4554, 385, - 1236, 3539, 388, 2632, 4488, 4312, 369, 370, 2972, 4776, - 3727, 4777, 4568, 1208, 3803, 283, 4568, 822, 823, 824, - 825, 2484, 3434, 3938, 4128, 1636, 1636, 3087, 4584, 834, - 3273, 4439, 4780, 3080, 4554, 4127, 4127, 2338, 4594, 425, - 4697, 84, 1418, 1468, 312, 2543, 2586, 3844, 3516, 4614, - 3570, 3515, 4676, 621, 1741, 714, 2179, 1565, 4614, 475, - 609, 609, 1115, 2180, 869, 109, 3944, 4587, 4588, 2685, - 1960, 1476, 3490, 4831, 4849, 4631, 4297, 4480, 4880, 4885, - 811, 4386, 3521, 2670, 4640, 4641, 3563, 608, 4644, 4780, - 1517, 1890, 608, 4784, 2135, 2662, 482, 483, 2663, 1496, - 2017, 600, 1642, 978, 2522, 910, 2605, 4275, 4282, 3008, - 3289, 4631, 380, 4770, 1408, 601, 4672, 533, 534, 535, - 4676, 926, 927, 985, 540, 930, 645, 645, 645, -1, - 1644, -1, -1, 1107, -1, -1, 1107, -1, 406, 1107, - 556, 4697, -1, 559, -1, 950, -1, -1, -1, 417, - 418, -1, -1, 421, 422, -1, -1, 962, -1, -1, - -1, -1, 578, -1, -1, -1, -1, -1, 4688, 4689, - -1, -1, -1, -1, 442, -1, -1, -1, -1, 4735, - 596, -1, -1, -1, -1, 149, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 4886, 123, 124, 125, 126, - 127, 564, -1, -1, -1, 568, -1, -1, 571, -1, - -1, -1, -1, -1, 4770, 4872, -1, -1, -1, 582, - 4776, 4777, 490, -1, 587, -1, -1, 590, -1, -1, - -1, -1, -1, -1, -1, 503, -1, -1, -1, 625, - 656, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 639, 640, 641, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 536, -1, - -1, 235, 540, 237, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 649, 650, -1, -1, - 558, -1, -1, -1, -1, -1, -1, -1, -1, 226, - 227, 228, 229, -1, -1, -1, -1, -1, -1, 4865, - -1, -1, -1, -1, -1, -1, 4872, -1, -1, -1, - 4876, -1, -1, 4843, 4880, -1, -1, -1, -1, 4885, - -1, 295, -1, 297, 298, 299, 300, 301, -1, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 616, 313, - 314, 315, -1, -1, 1159, -1, 624, 1162, 1163, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1187, 1188, -1, -1, -1, -1, -1, -1, - -1, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, - 1205, 1206, 1207, -1, -1, -1, 333, -1, 335, 336, - 337, 1216, 1217, -1, 1219, 1220, -1, 344, -1, 1224, - 1225, -1, -1, 1228, 1229, 1230, 1231, -1, 1233, 1234, - 1235, -1, -1, -1, -1, -1, -1, 1242, 1243, -1, - 1245, 1246, 1247, 1248, 1249, -1, -1, 1252, 1253, 1254, - 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, -1, 1264, - -1, -1, 1267, 1268, -1, -1, -1, 1272, -1, -1, - -1, 1276, 1277, 1278, -1, -1, -1, -1, -1, 443, - 444, -1, -1, 1288, 1289, 1290, -1, -1, -1, -1, - -1, -1, 1297, -1, -1, -1, -1, -1, 425, 1304, - 1305, 1306, 1307, -1, -1, -1, 37, -1, -1, -1, - 1315, 1316, 1317, -1, 1319, 1320, 1321, 1322, 1323, -1, - 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, -1, -1, - -1, 1336, 1337, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 28, -1, 30, -1, - -1, -1, -1, -1, -1, 482, 483, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 6, -1, -1, -1, - -1, -1, 12, -1, 14, -1, 16, -1, -1, -1, - 62, 63, -1, 65, -1, -1, -1, -1, 28, -1, - 30, 73, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 83, -1, -1, -1, -1, -1, -1, 139, 91, - -1, -1, -1, -1, -1, -1, -1, 1422, 623, -1, - 60, -1, -1, -1, -1, 65, 66, -1, -1, -1, - -1, 71, -1, 1438, 165, -1, 118, 168, -1, -1, - -1, -1, -1, 83, -1, -1, -1, -1, -1, -1, - 132, 91, -1, 135, -1, -1, -1, -1, -1, -1, - -1, 101, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 205, -1, -1, -1, 118, -1, - -1, -1, -1, 165, -1, -1, -1, -1, -1, 694, - -1, -1, 132, -1, 225, 135, -1, -1, 625, -1, - 231, -1, 233, 143, 144, -1, -1, -1, -1, -1, - -1, 151, 1517, 640, 641, -1, -1, -1, 723, 159, - -1, -1, -1, 163, -1, 165, -1, 1532, -1, -1, - -1, -1, -1, -1, -1, 175, -1, -1, -1, -1, - -1, -1, -1, -1, 1549, -1, -1, -1, -1, 231, - -1, 233, -1, -1, -1, 195, 761, 288, 240, -1, - -1, -1, -1, -1, -1, 247, -1, -1, -1, -1, - -1, -1, -1, 778, -1, -1, -1, -1, -1, -1, - 262, 312, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 231, -1, 233, -1, -1, -1, -1, 238, -1, - 240, 1606, -1, -1, -1, -1, -1, 247, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 825, -1, 262, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 319, -1, -1, - -1, -1, -1, -1, -1, -1, 286, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 338, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 319, - -1, -1, -1, -1, -1, -1, 417, -1, -1, -1, - -1, -1, -1, -1, -1, 426, -1, -1, 338, -1, - -1, -1, 342, -1, -1, 910, -1, -1, -1, 1714, - 441, 393, -1, 395, -1, -1, -1, -1, -1, -1, - -1, 403, -1, -1, -1, -1, -1, -1, 459, 28, - -1, 30, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 381, -1, -1, -1, 950, 386, -1, -1, 1754, - -1, -1, -1, 393, -1, 395, -1, -1, -1, -1, - 400, -1, -1, 403, -1, -1, 65, -1, -1, -1, - -1, -1, 503, -1, -1, 506, -1, -1, -1, -1, - -1, -1, -1, -1, 83, -1, -1, -1, -1, -1, - -1, -1, 91, 475, 434, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 536, -1, -1, 448, 449, - 450, 451, -1, -1, -1, -1, -1, -1, -1, 118, - -1, -1, -1, -1, 555, -1, -1, 558, -1, -1, - -1, -1, -1, 132, -1, 475, 135, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 533, 534, 535, -1, -1, -1, -1, 540, -1, - -1, -1, -1, 1868, 1869, 1870, 165, -1, -1, -1, - -1, -1, -1, -1, 556, -1, -1, 559, 1883, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 533, 534, 535, 578, -1, -1, -1, - 540, -1, -1, -1, 1909, -1, -1, -1, -1, -1, - 1915, -1, -1, 1918, 596, 1920, 556, -1, -1, 559, - -1, 1926, -1, 1928, 1929, -1, -1, -1, -1, -1, - -1, -1, 231, -1, 233, -1, -1, -1, 578, -1, - -1, 240, -1, 583, -1, -1, -1, -1, 247, -1, - -1, -1, -1, -1, 1159, 1960, 596, 1162, -1, -1, - -1, -1, -1, 262, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1187, 1188, -1, -1, -1, -1, -1, -1, - -1, 1196, 1197, -1, -1, 1200, 1201, 1202, 1203, 1204, - 1205, 1206, 1207, -1, -1, -1, -1, -1, -1, -1, - -1, 1216, 1217, -1, 1219, 1220, -1, -1, -1, 1224, - 319, -1, 662, 1228, 1229, 1230, 1231, -1, -1, 1234, - -1, -1, -1, -1, -1, -1, 2041, 1242, 1243, 338, - 1245, 1246, -1, -1, -1, 2050, -1, 1252, 1253, 1254, - -1, -1, 1257, 1258, 1259, 1260, 1261, 1262, -1, 1264, - -1, -1, 1267, 1268, -1, -1, -1, 1272, -1, -1, - -1, 1276, 1277, 1278, 2079, -1, -1, -1, -1, -1, - -1, -1, -1, 1288, 1289, 1290, -1, 14, -1, 16, - -1, -1, 1297, -1, 393, -1, 395, -1, -1, 1304, - 1305, 1306, -1, -1, 403, -1, -1, 2112, -1, -1, - -1, 38, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 52, 53, -1, 2133, -1, - -1, -1, 1337, 60, -1, -1, 2141, -1, 65, 66, - -1, -1, -1, -1, -1, 2150, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 85, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 475, 104, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 2200, -1, -1, -1, -1, - -1, 128, -1, -1, -1, -1, -1, -1, -1, 136, - 137, 138, -1, -1, -1, -1, -1, 1422, -1, -1, - -1, -1, -1, 150, 151, -1, -1, -1, -1, -1, - -1, -1, -1, 1438, 533, 534, 535, -1, -1, -1, - -1, 540, -1, -1, -1, -1, -1, -1, -1, -1, - 177, -1, -1, -1, -1, -1, -1, 556, -1, 2264, - 559, -1, -1, -1, -1, -1, -1, 194, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 578, - 2285, -1, -1, 210, -1, 212, -1, -1, -1, 216, - -1, -1, -1, 220, -1, -1, -1, 596, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1517, -1, -1, -1, -1, -1, -1, 246, - -1, 248, -1, -1, -1, -1, -1, 1532, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 264, -1, -1, - -1, -1, 2347, -1, 1549, -1, 2351, -1, -1, -1, - -1, 2356, 2357, -1, -1, 282, -1, -1, -1, 286, - 2365, -1, 2367, -1, 2369, 2370, 2371, 2372, -1, -1, - 2375, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 2385, 2386, -1, 2388, 2389, -1, 2391, 2392, 2393, 2394, - -1, 2396, -1, -1, 2399, -1, -1, -1, -1, -1, - -1, 1606, -1, 2408, -1, -1, -1, -1, -1, -1, - 2415, -1, 2417, -1, 2419, 2420, -1, 2422, 2423, -1, - -1, -1, 2427, 2428, 2429, -1, -1, -1, 2433, 2434, - 2435, -1, 2437, -1, 2439, -1, 2441, -1, 2443, -1, - 2445, -1, -1, -1, -1, 2450, -1, -1, -1, -1, - -1, -1, -1, -1, 381, -1, -1, -1, -1, -1, - -1, -1, 2467, -1, -1, -1, -1, -1, -1, 2474, - -1, 398, 2477, 400, -1, -1, -1, -1, 2483, -1, - -1, 2486, -1, -1, -1, 2490, 413, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 424, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 446, - -1, -1, 449, -1, 451, -1, -1, 454, -1, -1, - 457, 458, -1, -1, -1, -1, -1, 2542, -1, -1, - -1, 468, -1, -1, 471, -1, -1, -1, -1, 1754, - -1, -1, 479, 2558, 2559, 2560, -1, 2562, 485, -1, - -1, -1, -1, -1, -1, -1, 493, -1, -1, -1, - -1, 498, 499, 500, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 531, -1, -1, -1, -1, -1, - -1, -1, 539, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 2640, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 583, -1, -1, -1, - -1, -1, -1, 1868, 1869, 1870, -1, -1, 595, -1, - -1, -1, 599, -1, -1, 602, -1, -1, -1, -1, - 607, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 2695, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 1909, -1, -1, -1, -1, -1, - 637, 2716, -1, 1918, -1, 1920, 643, -1, -1, -1, - -1, -1, -1, -1, 2729, -1, -1, -1, -1, 656, - -1, -1, -1, -1, -1, -1, 2741, 2742, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 2803, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 2824, - -1, -1, -1, -1, 2829, 2830, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 2041, -1, -1, -1, - -1, -1, -1, -1, -1, 2050, -1, -1, -1, -1, - -1, -1, -1, -1, 2859, 2860, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 2079, 14, -1, 16, -1, 2884, - -1, -1, -1, 2888, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 34, -1, -1, -1, 38, - -1, -1, -1, -1, -1, -1, -1, 2112, -1, -1, - 2915, 2916, -1, 52, 53, -1, -1, 56, -1, -1, - -1, 60, -1, -1, -1, -1, 65, 66, 2133, -1, - -1, 2936, -1, -1, -1, -1, -1, -1, -1, -1, - 2945, -1, 2947, -1, 2949, 2150, 85, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 104, -1, -1, -1, -1, - -1, -1, -1, -1, 2979, -1, -1, -1, -1, 2984, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 128, - -1, -1, -1, -1, -1, -1, -1, 136, 137, 138, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 150, 151, -1, -1, -1, -1, -1, 3023, -1, - -1, -1, -1, -1, 163, -1, -1, -1, 3033, 3034, - 3035, 3036, -1, -1, -1, -1, -1, -1, 177, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 194, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 210, -1, 212, -1, -1, 3081, 216, -1, -1, - 2285, 220, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 234, -1, -1, -1, -1, - -1, -1, -1, 3108, -1, -1, -1, 246, -1, 248, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 3128, -1, 264, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 2347, 282, -1, -1, 2351, 286, -1, -1, - -1, 2356, 2357, -1, 293, -1, -1, -1, -1, -1, - 2365, -1, 2367, -1, 2369, -1, 2371, 2372, -1, -1, - -1, -1, -1, -1, 3179, -1, -1, -1, -1, -1, - 2385, 2386, -1, 2388, -1, -1, 2391, 2392, 2393, 2394, - -1, 2396, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 2408, -1, -1, -1, -1, -1, -1, - 2415, -1, 2417, -1, 2419, 2420, -1, 2422, -1, -1, - -1, -1, 2427, 2428, 2429, -1, -1, -1, 2433, 2434, - 2435, -1, 2437, -1, 2439, -1, 2441, -1, 2443, -1, - 2445, -1, 381, -1, -1, 2450, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 398, - -1, 400, 2467, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 3277, -1, 413, -1, -1, -1, 2483, -1, - -1, 2486, -1, -1, -1, 424, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 3310, -1, 446, -1, -1, - 449, -1, 451, -1, 453, 454, -1, -1, 457, 458, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 468, - -1, -1, 471, -1, -1, -1, -1, -1, -1, 3344, - 479, -1, -1, -1, -1, -1, 485, -1, -1, -1, - 3355, -1, -1, -1, 493, 2560, -1, -1, -1, 498, - 499, 500, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 3385, -1, -1, -1, 3389, 3390, -1, 3392, -1, -1, - -1, -1, 531, -1, -1, -1, 3401, -1, -1, -1, - 539, 3406, -1, -1, 3409, -1, 3411, 3412, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 2640, -1, -1, -1, -1, - -1, -1, 3447, -1, 583, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 595, -1, -1, -1, - 599, -1, -1, 602, -1, -1, -1, -1, 607, -1, - -1, -1, -1, -1, -1, -1, 3481, -1, -1, -1, - -1, -1, 14, -1, 16, -1, -1, -1, -1, -1, - 629, -1, -1, -1, -1, -1, -1, -1, 637, -1, - -1, -1, 34, -1, 643, -1, 38, -1, -1, -1, - 3515, -1, -1, -1, -1, -1, -1, 656, -1, -1, - 52, 53, -1, -1, 56, -1, -1, -1, 60, -1, - -1, -1, -1, 65, 66, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 3552, -1, -1, - -1, -1, -1, 85, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 3572, -1, -1, - -1, -1, 104, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 3598, -1, -1, 128, -1, -1, -1, - -1, -1, -1, -1, 136, 137, 138, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 150, 151, - -1, -1, -1, -1, -1, 2830, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 177, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 194, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 210, 2884, - 212, -1, -1, 2888, 216, -1, -1, -1, 220, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 234, -1, 3709, 3710, -1, -1, -1, -1, - 2915, 2916, -1, -1, 246, -1, 248, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 2936, 264, -1, -1, -1, -1, -1, -1, -1, - 2945, -1, 2947, -1, 2949, -1, -1, -1, -1, -1, - 282, -1, -1, -1, 286, -1, -1, -1, -1, -1, - -1, 293, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 6, -1, -1, -1, -1, -1, 12, - -1, 14, -1, -1, -1, -1, -1, -1, -1, -1, - 3825, -1, -1, -1, -1, 28, -1, 30, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 3845, -1, -1, -1, -1, -1, -1, -1, -1, 381, - -1, -1, -1, -1, -1, -1, -1, 60, -1, -1, - -1, -1, 65, 3868, -1, -1, 398, -1, 400, -1, - 3875, -1, -1, -1, -1, -1, 3081, -1, -1, -1, - 83, 413, -1, -1, -1, -1, -1, -1, 91, -1, - -1, -1, 424, -1, -1, -1, -1, -1, 101, -1, - -1, -1, -1, 3108, -1, -1, 3911, -1, -1, -1, - -1, -1, -1, -1, 446, 118, -1, 449, -1, 451, - -1, 453, 454, 3128, -1, 457, 458, -1, -1, 132, - -1, -1, 135, -1, -1, -1, 468, -1, -1, 471, - 143, -1, -1, -1, -1, -1, -1, 479, 151, 36, - 37, -1, -1, 485, -1, 42, 159, 44, -1, 46, - 47, 493, 165, -1, -1, -1, 498, 499, 500, -1, - -1, -1, -1, -1, -1, -1, 63, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 195, -1, -1, -1, -1, -1, -1, 531, - -1, -1, -1, -1, -1, -1, -1, 539, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 4024, - -1, -1, -1, -1, -1, -1, -1, -1, 231, -1, - 233, -1, 119, -1, -1, 122, -1, 240, -1, -1, - -1, -1, -1, 130, 247, -1, -1, -1, -1, -1, - -1, 583, 4057, -1, -1, -1, 4061, -1, -1, 262, - -1, 148, -1, 595, -1, -1, -1, 599, -1, -1, - 602, -1, -1, -1, -1, 607, -1, -1, -1, 166, - -1, -1, -1, 286, -1, -1, -1, -1, -1, 4094, - 4095, -1, -1, -1, -1, -1, -1, 629, -1, -1, - -1, -1, -1, -1, 191, 637, 193, -1, -1, -1, - -1, 643, -1, -1, -1, -1, 319, -1, -1, -1, - 207, 208, -1, -1, 656, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 338, -1, -1, -1, 342, - -1, -1, -1, -1, -1, -1, -1, -1, 4153, -1, - 3355, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 251, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 3385, -1, -1, 386, 3389, 3390, -1, -1, -1, -1, - 393, -1, 395, 280, -1, -1, 3401, -1, -1, -1, - 403, 3406, 289, 290, 3409, 292, 3411, 3412, -1, 4214, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 4243, 326, - 327, 328, -1, -1, -1, 4250, 449, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 345, 346, - 347, -1, -1, -1, -1, -1, 353, -1, -1, 356, - -1, -1, 475, -1, -1, -1, 3481, -1, -1, -1, - -1, -1, 4287, -1, -1, 372, 373, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 4302, -1, 4304, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 3515, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 408, 409, -1, 4329, -1, -1, -1, 4333, -1, - 533, 534, 535, -1, -1, -1, -1, 540, -1, -1, - -1, -1, -1, -1, -1, -1, 433, 3552, -1, -1, - -1, -1, -1, 556, -1, -1, 559, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 3572, -1, -1, - -1, -1, -1, -1, -1, 578, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 4396, -1, 596, -1, -1, -1, -1, -1, -1, - -1, -1, 489, -1, -1, -1, 493, -1, -1, -1, - -1, 4416, -1, -1, -1, -1, -1, 4422, -1, -1, - 507, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 4435, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 565, -1, - -1, 568, -1, -1, 571, 572, 573, 574, -1, -1, - -1, -1, -1, -1, 4499, -1, -1, -1, -1, 4504, - -1, -1, -1, -1, 3709, 3710, 4511, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 614, 615, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 641, 4560, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 4620, -1, -1, -1, -1, - -1, 4626, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 3845, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 3868, 4669, -1, -1, -1, -1, -1, - 3875, -1, 4677, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 4708, -1, -1, 3911, -1, -1, -1, - -1, 4716, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 4736, -1, 4738, 4739, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 4764, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 4788, -1, -1, 4791, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 4823, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 4833, -1, - -1, -1, -1, 4838, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 4057, -1, -1, -1, 4061, -1, 4863, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 4888, -1, -1, -1, -1, -1, 4094, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 4243, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 4302, -1, 4304, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 4435, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 4560, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, 37, 38, - 39, 40, 41, 42, 43, -1, 45, 46, 47, 48, - 49, -1, 51, 52, -1, -1, 55, 56, 57, 58, - 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, - 69, 70, 71, 72, 4669, 74, 75, 76, 77, 78, - 79, 80, 4677, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, 101, 102, 103, -1, -1, 106, 107, 108, - 109, 110, 111, 4708, 113, 114, 115, -1, 117, 118, - 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, - 129, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, 178, - -1, 180, 181, 182, 183, 184, 185, 186, 187, -1, - 189, 190, 191, 192, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, 215, 216, 217, 218, - -1, 220, 221, 222, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, 246, 247, 248, - 249, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - 269, 270, -1, 272, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, 291, 4888, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, 355, 356, -1, -1, - 359, 360, 361, 362, 363, 364, 365, 366, 367, -1, - 369, 370, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, 396, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, 453, 454, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, 537, 538, - 539, 540, -1, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, 576, 577, 578, - 579, -1, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - 609, 610, 611, 612, 613, -1, -1, 616, 617, -1, - 619, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, -1, -1, -1, -1, - 649, 650, -1, -1, -1, -1, 655, 656, -1, -1, - 659, 660, -1, -1, 663, 664, 5, -1, 7, 8, - 9, 10, 11, 12, 13, -1, 15, -1, -1, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, 37, 38, - 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, 56, 57, 58, - 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, 101, 102, 103, -1, -1, 106, 107, 108, - 109, 110, 111, -1, 113, 114, 115, -1, 117, 118, - 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, - 129, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, 178, - -1, 180, 181, 182, 183, 184, 185, 186, 187, -1, - 189, 190, 191, 192, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, 215, 216, 217, 218, - -1, 220, 221, 222, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, 246, 247, 248, - 249, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, 272, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, 291, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, 355, 356, -1, -1, - 359, 360, 361, 362, 363, 364, 365, 366, 367, -1, - 369, 370, 371, -1, 373, 374, 375, 376, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, 396, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, 453, 454, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, 537, 538, - 539, 540, -1, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - 609, 610, 611, 612, 613, -1, -1, 616, 617, -1, - 619, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, -1, -1, -1, -1, - 649, 650, -1, -1, -1, -1, 655, 656, -1, -1, - 659, 660, -1, -1, 663, 664, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, 37, 38, - 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, 56, 57, 58, - 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, 101, 102, 103, -1, -1, 106, 107, 108, - 109, 110, 111, -1, 113, 114, 115, -1, 117, 118, - 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, - 129, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, 178, - -1, 180, 181, 182, 183, 184, 185, 186, 187, -1, - 189, 190, 191, 192, -1, 194, -1, -1, -1, 198, - 199, 200, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, 215, 216, 217, 218, - -1, 220, 221, 222, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, 246, 247, 248, - 249, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, 272, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, 291, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, 355, 356, -1, -1, - 359, 360, 361, 362, 363, 364, 365, 366, 367, -1, - 369, 370, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, 396, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, 453, 454, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, 537, 538, - 539, 540, -1, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - 609, 610, 611, 612, 613, -1, -1, 616, 617, -1, - 619, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, -1, -1, -1, -1, - 649, 650, -1, -1, -1, -1, 655, 656, -1, -1, - 659, 660, -1, -1, 663, 664, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, 37, 38, - 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, 56, 57, 58, - 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, 101, 102, 103, -1, -1, 106, 107, 108, - 109, 110, 111, -1, 113, 114, 115, -1, 117, 118, - 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, - 129, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, 178, - -1, 180, 181, 182, 183, 184, 185, 186, 187, -1, - 189, 190, 191, 192, -1, 194, -1, -1, -1, 198, - 199, 200, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, 215, 216, 217, 218, - -1, 220, 221, 222, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, 246, 247, 248, - 249, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, 272, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, 291, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, 355, 356, -1, -1, - 359, 360, 361, 362, 363, 364, 365, 366, 367, -1, - 369, 370, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, 396, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, 453, 454, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, 537, 538, - 539, 540, -1, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - 609, 610, 611, 612, 613, -1, -1, 616, 617, -1, - 619, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, -1, -1, -1, -1, - 649, 650, -1, -1, -1, -1, 655, 656, -1, -1, - 659, 660, -1, -1, 663, 664, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, 37, 38, - 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, 56, 57, 58, - 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, 101, 102, 103, -1, -1, 106, 107, 108, - 109, 110, 111, -1, 113, 114, 115, -1, 117, 118, - 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, - 129, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, 178, - -1, 180, 181, 182, 183, 184, 185, 186, 187, -1, - 189, 190, 191, 192, -1, 194, -1, -1, -1, 198, - 199, 200, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, 215, 216, 217, 218, - -1, 220, 221, 222, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, 246, 247, 248, - 249, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, 272, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, 291, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, 355, 356, -1, -1, - 359, 360, 361, 362, 363, 364, 365, 366, 367, -1, - 369, 370, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, 396, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, 453, 454, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, 537, 538, - 539, 540, -1, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - 609, 610, 611, 612, 613, -1, -1, 616, 617, -1, - 619, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, -1, -1, -1, -1, - 649, 650, -1, -1, -1, -1, 655, 656, -1, -1, - 659, 660, -1, -1, 663, 664, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, 37, 38, - 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, 56, 57, 58, - 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, 101, 102, 103, -1, -1, 106, 107, 108, - 109, 110, 111, -1, 113, 114, 115, -1, 117, 118, - 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, - 129, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, 178, - -1, 180, 181, 182, 183, 184, 185, 186, 187, -1, - 189, 190, 191, 192, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, 215, 216, 217, 218, - -1, 220, 221, 222, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, 246, 247, 248, - 249, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, 272, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, 291, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, 355, 356, -1, -1, - 359, 360, 361, 362, 363, 364, 365, 366, 367, -1, - 369, 370, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, 396, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, 453, 454, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, 537, 538, - 539, 540, -1, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - 609, 610, 611, 612, 613, -1, -1, 616, 617, -1, - 619, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, -1, -1, -1, -1, - 649, 650, -1, -1, -1, -1, 655, 656, -1, -1, - 659, 660, -1, -1, 663, 664, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, 37, 38, - 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, 56, 57, 58, - 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, 101, 102, 103, -1, -1, 106, 107, 108, - 109, 110, 111, -1, 113, 114, 115, -1, 117, 118, - 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, - 129, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, 178, - -1, 180, 181, 182, 183, 184, 185, 186, 187, -1, - 189, 190, 191, 192, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, 215, 216, 217, 218, - -1, 220, 221, 222, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, 246, 247, 248, - 249, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, 272, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, 291, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, 355, 356, -1, -1, - 359, 360, 361, 362, 363, 364, 365, 366, 367, -1, - 369, 370, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, 396, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, 453, 454, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, 537, 538, - 539, 540, -1, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - 609, 610, 611, 612, 613, -1, -1, 616, 617, -1, - 619, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, -1, -1, -1, -1, - 649, 650, -1, -1, -1, -1, 655, 656, -1, -1, - 659, 660, -1, -1, 663, 664, 5, -1, 7, 8, - 9, 10, 11, 12, 13, -1, 15, -1, -1, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, 37, 38, - 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, 56, 57, 58, - 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, 101, 102, 103, -1, -1, 106, 107, 108, - 109, 110, 111, -1, 113, 114, 115, -1, 117, 118, - 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, - 129, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, 178, - -1, 180, 181, 182, 183, 184, 185, 186, 187, -1, - 189, 190, 191, 192, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, 215, 216, 217, 218, - -1, 220, 221, 222, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, 246, 247, 248, - 249, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, 272, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, 291, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, 355, 356, -1, -1, - 359, 360, 361, 362, 363, -1, 365, 366, 367, -1, - 369, 370, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, 396, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, 453, 454, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, 537, 538, - 539, 540, -1, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - 609, 610, 611, 612, 613, -1, -1, 616, 617, -1, - 619, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, -1, -1, -1, -1, - 649, 650, -1, -1, -1, -1, 655, 656, -1, -1, - 659, 660, -1, -1, 663, 664, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, 37, 38, - 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, 56, 57, 58, - 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, 101, 102, 103, -1, -1, 106, 107, 108, - 109, 110, 111, -1, 113, 114, 115, -1, 117, 118, - 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, - 129, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, 178, - -1, 180, 181, 182, 183, 184, 185, 186, 187, -1, - 189, 190, 191, 192, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, 215, 216, 217, 218, - -1, 220, 221, 222, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, 246, 247, 248, - 249, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, 272, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, 291, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, 355, 356, -1, -1, - 359, 360, 361, 362, 363, 364, 365, 366, 367, -1, - 369, 370, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, 396, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, 453, 454, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, 537, 538, - 539, 540, -1, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - 609, 610, 611, 612, 613, -1, -1, 616, 617, -1, - 619, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, -1, -1, -1, -1, - 649, 650, -1, -1, -1, -1, 655, 656, -1, -1, - 659, 660, -1, -1, 663, 664, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, 37, 38, - 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, 56, 57, 58, - 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, 101, 102, 103, -1, -1, 106, 107, 108, - 109, 110, 111, -1, 113, 114, 115, -1, 117, 118, - 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, - 129, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, 178, - -1, 180, 181, 182, 183, 184, 185, 186, 187, -1, - 189, 190, 191, 192, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, 215, 216, 217, 218, - -1, 220, 221, 222, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, 246, 247, 248, - 249, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, 272, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, 291, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, 355, 356, -1, -1, - 359, 360, 361, 362, 363, 364, 365, 366, 367, -1, - 369, 370, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, 396, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, 453, 454, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, 537, 538, - 539, 540, -1, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - 609, 610, 611, 612, 613, -1, -1, 616, 617, -1, - 619, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, -1, -1, -1, -1, - 649, 650, -1, -1, -1, -1, 655, 656, -1, -1, - 659, 660, -1, -1, 663, 664, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, 37, 38, - 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, 56, 57, 58, - 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, 101, 102, 103, -1, -1, 106, 107, 108, - 109, 110, 111, -1, 113, 114, 115, -1, 117, 118, - 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, - 129, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, 178, - -1, 180, 181, 182, 183, 184, 185, 186, 187, -1, - 189, 190, 191, 192, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, 215, 216, 217, 218, - -1, 220, 221, 222, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, 246, 247, 248, - 249, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, 272, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, 291, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, 355, 356, -1, -1, - 359, 360, 361, 362, 363, 364, 365, 366, 367, -1, - 369, 370, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, 396, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, 453, 454, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, 537, 538, - 539, 540, -1, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - 609, 610, 611, 612, 613, -1, -1, 616, 617, -1, - 619, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, -1, -1, -1, -1, - 649, 650, -1, -1, -1, -1, 655, 656, -1, -1, - 659, 660, -1, -1, 663, 664, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, 37, 38, - 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, 56, 57, 58, - 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, 101, 102, 103, -1, -1, 106, 107, 108, - 109, 110, 111, -1, 113, 114, 115, -1, 117, 118, - 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, - 129, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, 178, - -1, 180, 181, 182, 183, 184, 185, 186, 187, -1, - 189, 190, 191, 192, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, 215, 216, 217, 218, - -1, 220, 221, 222, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, 246, 247, 248, - 249, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, 272, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, 291, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, 355, 356, -1, -1, - 359, 360, 361, 362, 363, 364, 365, 366, 367, -1, - 369, 370, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, 396, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, 453, 454, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, 537, 538, - 539, 540, -1, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - 609, 610, 611, 612, 613, -1, -1, 616, 617, -1, - 619, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, -1, -1, -1, -1, - 649, 650, -1, -1, -1, -1, 655, 656, -1, -1, - 659, 660, -1, -1, 663, 664, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, 37, 38, - 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, 56, 57, 58, - 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, 101, 102, 103, -1, -1, 106, 107, 108, - 109, 110, 111, -1, 113, 114, 115, -1, 117, 118, - 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, - 129, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, 178, - -1, 180, 181, 182, 183, 184, 185, 186, 187, -1, - 189, 190, 191, 192, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, 215, 216, 217, 218, - -1, 220, 221, 222, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, 246, 247, 248, - 249, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, 272, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, 291, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, 355, 356, -1, -1, - 359, 360, 361, 362, 363, -1, 365, 366, 367, -1, - 369, 370, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, 396, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, 453, 454, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, 537, 538, - 539, 540, -1, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - 609, 610, 611, 612, 613, -1, -1, 616, 617, -1, - 619, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, -1, -1, -1, -1, - 649, 650, -1, -1, -1, -1, 655, 656, -1, -1, - 659, 660, -1, -1, 663, 664, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, 37, 38, - 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, 56, 57, 58, - 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, 101, 102, 103, -1, -1, 106, 107, 108, - 109, 110, 111, -1, 113, 114, 115, -1, 117, 118, - 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, - 129, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, 178, - -1, 180, 181, 182, 183, 184, 185, 186, 187, -1, - 189, 190, 191, 192, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, 215, 216, 217, 218, - -1, 220, 221, 222, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, 246, 247, 248, - 249, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, 272, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, 291, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, 355, 356, -1, -1, - 359, 360, 361, 362, 363, -1, 365, 366, 367, -1, - 369, 370, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, 396, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, 453, 454, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, 537, 538, - 539, 540, -1, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - 609, 610, 611, 612, 613, -1, -1, 616, 617, -1, - 619, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, -1, -1, -1, -1, - 649, 650, -1, -1, -1, -1, 655, 656, -1, -1, - 659, 660, -1, -1, 663, 664, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, 37, 38, - 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, 56, 57, 58, - 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, 101, 102, 103, -1, -1, 106, 107, 108, - 109, 110, 111, -1, 113, 114, 115, -1, 117, 118, - 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, - 129, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, 178, - -1, 180, 181, 182, 183, 184, 185, 186, 187, -1, - 189, 190, 191, 192, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, 215, 216, 217, 218, - -1, 220, 221, 222, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, 246, 247, 248, - 249, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, 272, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, 291, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, 355, 356, -1, -1, - 359, 360, 361, 362, 363, -1, 365, 366, 367, -1, - 369, 370, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, 396, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, 453, 454, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, 537, 538, - 539, 540, -1, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - 609, 610, 611, 612, 613, -1, -1, 616, 617, -1, - 619, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, -1, -1, -1, -1, - 649, 650, -1, -1, -1, -1, 655, 656, -1, -1, - 659, 660, -1, -1, 663, 664, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, 37, 38, - 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, 56, 57, 58, - 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, 101, 102, 103, -1, -1, 106, 107, 108, - 109, 110, 111, -1, 113, 114, 115, -1, 117, 118, - 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, - 129, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, 178, - -1, 180, 181, 182, 183, 184, 185, 186, 187, -1, - 189, 190, 191, 192, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, 215, 216, 217, 218, - -1, 220, 221, 222, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, 246, 247, 248, - 249, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, 272, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, 291, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - 339, 340, -1, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, 355, 356, -1, -1, - 359, 360, 361, 362, 363, -1, 365, 366, 367, -1, - 369, 370, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, 396, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, 411, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, 453, 454, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, 537, 538, - 539, 540, -1, 542, 543, 544, 545, 546, 547, 548, - 549, 550, 551, 552, 553, 554, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, 581, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - 609, 610, 611, 612, 613, -1, -1, 616, 617, -1, - 619, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, -1, -1, -1, -1, - 649, 650, -1, -1, -1, -1, 655, 656, -1, -1, - 659, 660, -1, -1, 663, 664, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, - 39, -1, -1, 42, -1, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, -1, -1, 58, - 59, -1, 61, 62, -1, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, -1, -1, 103, -1, -1, 106, -1, 108, - -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, - 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, - 129, -1, -1, -1, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, -1, - -1, 180, 181, 182, 183, -1, 185, 186, 187, -1, - 189, 190, 191, 192, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, -1, 216, 217, 218, - -1, 220, 221, 222, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, -1, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, -1, 247, 248, - -1, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, -1, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, 291, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, -1, 317, 318, - 319, 320, -1, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - -1, 340, -1, 342, -1, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, 355, 356, -1, -1, - 359, 360, 361, 362, -1, -1, -1, 366, 367, -1, - 369, 370, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, -1, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, -1, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, -1, -1, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - -1, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, -1, -1, - 539, 540, -1, 542, 543, 544, 545, 546, 547, -1, - -1, 550, 551, 552, 553, -1, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, -1, 582, 583, 584, 585, 586, 587, 588, - 589, 590, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - -1, -1, -1, -1, 613, -1, -1, 616, -1, -1, - -1, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, -1, -1, -1, 5, - -1, 7, 8, 9, 10, 11, 12, -1, -1, 15, - -1, -1, -1, 19, 663, 664, 22, -1, 24, 25, - 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, - -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, - 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, - -1, -1, 58, 59, -1, 61, 62, -1, 64, 65, - -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, - 76, 77, 78, 79, 80, -1, 82, 83, 84, 85, - 86, 87, 88, 89, -1, 91, 92, 93, 94, 95, - 96, 97, 98, -1, 100, -1, -1, 103, -1, -1, - 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, - -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, - -1, 127, 128, -1, -1, -1, -1, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, -1, -1, 194, -1, - -1, -1, 198, 199, -1, 201, 202, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, -1, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, 240, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, 263, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, -1, - 276, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, -1, -1, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, 485, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, 514, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, -1, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, -1, 641, -1, -1, -1, -1, - 5, -1, 7, 8, 9, 10, 11, 12, -1, -1, - 15, -1, -1, -1, 19, -1, -1, 22, 664, 24, - 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, - -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, - 45, 46, 47, -1, 49, -1, 51, 52, -1, -1, - 55, -1, -1, 58, 59, -1, 61, 62, -1, 64, - 65, -1, 67, 68, 69, 70, 71, 72, -1, 74, - 75, 76, 77, 78, 79, 80, -1, 82, 83, 84, - 85, 86, 87, 88, 89, -1, 91, 92, 93, 94, - 95, 96, 97, 98, -1, 100, -1, -1, 103, -1, - -1, 106, -1, 108, -1, -1, 111, -1, 113, -1, - -1, -1, 117, 118, 119, -1, -1, 122, -1, -1, - -1, -1, 127, 128, -1, -1, -1, -1, 133, -1, - 135, -1, -1, -1, 139, -1, 141, 142, 143, 144, - 145, -1, -1, -1, -1, 150, -1, -1, 153, 154, - 155, -1, -1, -1, 159, -1, 161, 162, -1, 164, - 165, 166, -1, 168, 169, -1, 171, 172, 173, 174, - 175, 176, 177, -1, -1, 180, 181, 182, 183, -1, - -1, 186, 187, -1, 189, 190, 191, -1, -1, 194, - -1, -1, -1, 198, 199, -1, 201, 202, 203, -1, - 205, 206, 207, 208, 209, 210, 211, -1, 213, -1, - -1, 216, 217, 218, -1, 220, -1, -1, -1, 224, - 225, -1, -1, -1, 229, 230, 231, 232, 233, -1, - -1, -1, 237, 238, 239, 240, -1, 242, -1, -1, - -1, -1, 247, 248, -1, -1, -1, 252, -1, 254, - 255, -1, 257, 258, -1, -1, -1, 262, 263, -1, - 265, 266, 267, -1, -1, 270, -1, -1, 273, 274, - -1, -1, -1, -1, -1, 280, 281, -1, 283, -1, - 285, -1, 287, 288, -1, -1, -1, -1, -1, -1, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, -1, 312, 313, 314, - 315, -1, 317, 318, 319, 320, -1, 322, 323, 324, - -1, -1, -1, -1, 329, 330, 331, 332, 333, 334, - -1, -1, 337, 338, -1, 340, -1, 342, -1, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, -1, - -1, 356, -1, -1, 359, 360, 361, 362, -1, -1, - -1, 366, 367, -1, -1, -1, 371, -1, 373, 374, - 375, -1, 377, 378, 379, 380, -1, 382, 383, -1, - -1, -1, -1, -1, -1, -1, -1, 392, 393, 394, - -1, -1, 397, -1, 399, -1, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, -1, -1, 413, 414, - 415, -1, 417, -1, 419, 420, 421, 422, 423, -1, - 425, 426, 427, -1, -1, 430, -1, -1, -1, 434, - 435, 436, 437, 438, -1, -1, 441, 442, 443, 444, - 445, -1, 447, 448, -1, 450, 451, 452, -1, -1, - 455, -1, 457, -1, 459, 460, -1, 462, 463, -1, - 465, -1, 467, -1, -1, 470, 471, 472, 473, 474, - 475, 476, 477, 478, 479, 480, 481, -1, 483, 484, - -1, -1, -1, 488, 489, 490, 491, -1, -1, -1, - 495, -1, -1, -1, 499, -1, 501, 502, 503, 504, - 505, 506, -1, 508, 509, 510, 511, 512, 513, 514, - -1, -1, -1, -1, -1, 520, 521, -1, 523, -1, - -1, 526, -1, -1, -1, 530, 531, 532, -1, -1, - -1, 536, -1, -1, 539, 540, -1, 542, 543, 544, - 545, 546, 547, -1, -1, 550, 551, 552, 553, -1, - 555, 556, -1, -1, 559, 560, 561, 562, -1, -1, - 565, 566, -1, 568, 569, 570, 571, -1, -1, -1, - -1, -1, 577, 578, 579, -1, -1, -1, 583, 584, - 585, 586, -1, 588, 589, -1, 591, 592, -1, 594, - 595, -1, -1, 598, -1, -1, 601, -1, 603, -1, - 605, 606, -1, -1, -1, -1, -1, -1, 613, -1, - -1, 616, -1, -1, -1, 620, 621, 622, 623, 624, - 625, 626, -1, -1, -1, -1, -1, -1, 633, 634, - -1, 636, 637, 638, -1, -1, 641, -1, -1, -1, - -1, 5, -1, 7, 8, 9, 10, 11, 12, -1, - -1, 15, -1, -1, -1, 19, -1, -1, 22, 664, - 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, - 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, - -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, - -1, 55, -1, -1, 58, 59, -1, 61, 62, -1, - 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, - 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, - 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, - 94, 95, 96, 97, 98, -1, 100, -1, -1, 103, - -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, - -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, - -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, - -1, 135, -1, -1, -1, 139, -1, 141, 142, 143, - 144, 145, -1, -1, -1, -1, 150, -1, -1, 153, - 154, 155, -1, -1, -1, 159, -1, 161, 162, -1, - 164, 165, 166, -1, 168, 169, -1, 171, 172, 173, - 174, 175, 176, 177, -1, -1, 180, 181, 182, 183, - -1, -1, 186, 187, -1, 189, 190, 191, -1, -1, - 194, -1, -1, -1, 198, 199, -1, 201, -1, 203, - -1, 205, 206, 207, 208, 209, 210, 211, -1, 213, - -1, -1, 216, 217, 218, -1, 220, -1, -1, -1, - 224, 225, -1, -1, -1, 229, 230, 231, 232, 233, - -1, -1, -1, 237, 238, 239, -1, -1, 242, -1, - -1, -1, -1, 247, 248, -1, -1, -1, 252, -1, - 254, 255, -1, 257, 258, -1, -1, -1, 262, -1, - -1, 265, 266, 267, -1, -1, 270, -1, -1, 273, - 274, -1, -1, -1, -1, -1, 280, 281, -1, 283, - -1, 285, -1, 287, 288, -1, -1, -1, -1, -1, - -1, 295, 296, 297, 298, 299, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, -1, 312, 313, - 314, 315, -1, 317, 318, 319, 320, -1, 322, 323, - 324, -1, -1, -1, -1, 329, 330, 331, 332, 333, - 334, -1, -1, 337, 338, -1, 340, -1, 342, -1, - 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, - -1, -1, 356, -1, -1, 359, 360, 361, 362, -1, - -1, -1, 366, 367, -1, -1, -1, 371, -1, 373, - 374, 375, -1, 377, 378, 379, 380, -1, 382, 383, - -1, -1, -1, -1, -1, -1, -1, -1, 392, 393, - 394, -1, -1, 397, -1, 399, -1, 401, 402, 403, - 404, 405, 406, 407, 408, 409, 410, -1, -1, 413, - 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, - -1, 425, 426, 427, -1, -1, 430, -1, -1, -1, - 434, 435, 436, 437, 438, -1, -1, 441, 442, 443, - 444, 445, -1, 447, 448, -1, 450, 451, 452, -1, - -1, 455, -1, 457, -1, 459, 460, -1, 462, 463, - -1, 465, -1, 467, -1, -1, 470, 471, 472, 473, - 474, 475, 476, 477, 478, 479, 480, 481, -1, 483, - 484, 485, -1, -1, 488, 489, 490, 491, -1, -1, - -1, 495, -1, -1, -1, 499, -1, 501, 502, 503, - 504, 505, 506, -1, 508, 509, 510, 511, 512, 513, - -1, -1, -1, -1, -1, -1, 520, 521, -1, 523, - -1, -1, 526, -1, -1, -1, 530, 531, 532, -1, - -1, -1, 536, -1, -1, 539, 540, -1, 542, 543, - 544, 545, 546, 547, -1, -1, 550, 551, 552, 553, - -1, 555, 556, -1, -1, 559, 560, 561, 562, -1, - -1, 565, 566, -1, 568, 569, 570, 571, -1, -1, - -1, -1, -1, 577, 578, 579, -1, -1, -1, 583, - 584, 585, 586, -1, 588, 589, -1, 591, 592, -1, - 594, 595, -1, -1, 598, -1, -1, 601, -1, 603, - -1, 605, 606, -1, -1, -1, -1, -1, -1, 613, - -1, -1, 616, -1, -1, -1, 620, 621, 622, 623, - 624, 625, 626, -1, -1, -1, -1, -1, -1, 633, - 634, -1, 636, 637, 638, -1, -1, 641, -1, -1, - -1, -1, 5, -1, 7, 8, 9, 10, 11, 12, - -1, -1, 15, 657, -1, -1, 19, -1, -1, 22, - 664, 24, 25, 26, 27, 28, 29, 30, 31, 32, - -1, 34, -1, -1, -1, 38, -1, -1, -1, 42, - -1, -1, 45, 46, 47, -1, 49, -1, 51, 52, - -1, -1, 55, -1, -1, 58, 59, -1, 61, 62, - -1, 64, 65, -1, 67, 68, 69, 70, 71, 72, - -1, 74, 75, 76, 77, 78, 79, 80, -1, 82, - 83, 84, 85, 86, 87, 88, 89, -1, 91, 92, - -1, 94, 95, 96, 97, 98, -1, 100, -1, -1, - 103, -1, -1, 106, -1, 108, -1, -1, 111, -1, - 113, -1, -1, -1, 117, 118, 119, -1, -1, 122, - -1, -1, -1, -1, 127, 128, -1, -1, -1, -1, - 133, -1, 135, -1, -1, -1, 139, -1, 141, 142, - 143, 144, 145, -1, -1, -1, -1, 150, -1, -1, - 153, 154, 155, -1, -1, -1, 159, -1, 161, 162, - -1, 164, 165, 166, -1, 168, 169, -1, 171, 172, - 173, 174, 175, 176, 177, -1, -1, 180, 181, 182, - 183, -1, -1, 186, 187, -1, 189, 190, 191, -1, - -1, 194, -1, -1, -1, 198, 199, -1, 201, -1, - 203, -1, 205, 206, 207, 208, 209, 210, 211, -1, - 213, -1, -1, 216, 217, 218, -1, 220, -1, -1, - -1, 224, 225, -1, -1, -1, 229, 230, 231, 232, - 233, -1, -1, -1, 237, 238, 239, -1, -1, 242, - -1, -1, -1, -1, 247, 248, -1, -1, -1, 252, - -1, 254, 255, -1, 257, 258, -1, -1, -1, 262, - -1, -1, 265, 266, 267, -1, -1, 270, -1, -1, - 273, 274, -1, -1, -1, -1, -1, 280, 281, -1, - 283, -1, 285, -1, 287, 288, -1, -1, -1, -1, - -1, -1, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, -1, 312, - 313, 314, 315, -1, 317, 318, 319, 320, -1, 322, - 323, 324, -1, -1, -1, -1, 329, 330, 331, 332, - 333, 334, -1, -1, 337, 338, -1, 340, -1, 342, - -1, 344, 345, 346, 347, 348, 349, 350, 351, 352, - 353, -1, -1, 356, -1, -1, 359, 360, 361, 362, - -1, -1, -1, 366, 367, -1, -1, -1, 371, -1, - 373, 374, 375, -1, 377, 378, 379, 380, -1, 382, - 383, -1, -1, -1, -1, -1, -1, -1, -1, 392, - 393, 394, -1, -1, 397, -1, 399, -1, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, -1, -1, - 413, 414, 415, -1, 417, -1, 419, 420, 421, 422, - 423, -1, 425, 426, 427, -1, -1, 430, -1, -1, - -1, 434, 435, 436, 437, 438, -1, -1, 441, 442, - 443, 444, 445, -1, 447, 448, -1, 450, 451, 452, - -1, -1, 455, -1, 457, -1, 459, 460, -1, 462, - 463, -1, 465, -1, 467, -1, -1, 470, 471, 472, - 473, 474, 475, 476, 477, 478, 479, 480, 481, -1, - 483, 484, -1, -1, -1, 488, 489, 490, 491, -1, - -1, -1, 495, -1, -1, -1, 499, -1, 501, 502, - 503, 504, 505, 506, -1, 508, 509, 510, 511, 512, - 513, -1, -1, -1, -1, -1, -1, 520, 521, -1, - 523, -1, -1, 526, -1, -1, -1, 530, 531, 532, - -1, -1, -1, 536, -1, -1, 539, 540, -1, 542, - 543, 544, 545, 546, 547, -1, -1, 550, 551, 552, - 553, -1, 555, 556, -1, -1, 559, 560, 561, 562, - -1, -1, 565, 566, -1, 568, 569, 570, 571, -1, - -1, -1, -1, -1, 577, 578, 579, -1, -1, -1, - 583, 584, 585, 586, -1, 588, 589, -1, 591, 592, - -1, 594, 595, -1, -1, 598, -1, -1, 601, -1, - 603, -1, 605, 606, -1, -1, -1, -1, -1, -1, - 613, -1, -1, 616, -1, -1, -1, 620, 621, 622, - 623, 624, 625, 626, -1, -1, -1, -1, -1, -1, - 633, 634, -1, 636, 637, 638, -1, -1, 641, -1, - -1, -1, -1, -1, -1, 5, -1, 7, 8, 9, - 10, 11, 12, -1, 657, 15, -1, -1, -1, 19, - 663, 664, 22, -1, 24, 25, 26, 27, 28, 29, - 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, - -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, - -1, 51, 52, -1, -1, 55, -1, -1, 58, 59, - -1, 61, 62, -1, 64, 65, -1, 67, 68, 69, - 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, - 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, - -1, 91, 92, -1, 94, 95, 96, 97, 98, -1, - 100, -1, -1, 103, -1, -1, 106, -1, 108, -1, - -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, - -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, - -1, -1, -1, 133, -1, 135, -1, -1, -1, 139, - -1, 141, 142, 143, 144, 145, -1, -1, -1, -1, - 150, -1, -1, 153, 154, 155, -1, -1, -1, 159, - -1, 161, 162, -1, 164, 165, 166, -1, 168, 169, - -1, 171, 172, 173, 174, 175, 176, 177, -1, -1, - 180, 181, 182, 183, -1, -1, 186, 187, -1, 189, - 190, 191, -1, -1, 194, -1, -1, -1, 198, 199, - -1, 201, -1, 203, -1, 205, 206, 207, 208, 209, - 210, 211, -1, 213, -1, -1, 216, 217, 218, -1, - 220, -1, -1, -1, 224, 225, -1, -1, -1, 229, - 230, 231, 232, 233, -1, -1, -1, 237, 238, 239, - -1, -1, 242, -1, -1, -1, -1, 247, 248, -1, - -1, -1, 252, -1, 254, 255, -1, 257, 258, -1, - -1, -1, 262, -1, -1, 265, 266, 267, -1, -1, - 270, -1, -1, 273, 274, -1, -1, -1, -1, -1, - 280, 281, -1, 283, -1, 285, -1, 287, 288, -1, - -1, -1, -1, -1, -1, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, -1, 312, 313, 314, 315, -1, 317, 318, 319, - 320, -1, 322, 323, 324, -1, -1, -1, -1, 329, - 330, 331, 332, 333, 334, -1, -1, 337, 338, -1, - 340, -1, 342, -1, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, -1, -1, 356, -1, -1, 359, - 360, 361, 362, -1, -1, -1, 366, 367, -1, -1, - -1, 371, -1, 373, 374, 375, -1, 377, 378, 379, - 380, -1, 382, 383, -1, -1, -1, -1, -1, -1, - -1, -1, 392, 393, 394, -1, -1, 397, -1, 399, - -1, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, -1, -1, 413, 414, 415, -1, 417, -1, 419, - 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, - 430, -1, -1, -1, 434, 435, 436, 437, 438, -1, - -1, 441, 442, 443, 444, 445, -1, 447, 448, -1, - 450, 451, 452, -1, -1, 455, -1, 457, -1, 459, - 460, -1, 462, 463, -1, 465, -1, 467, -1, -1, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, - 480, 481, -1, 483, 484, -1, -1, -1, 488, 489, - 490, 491, -1, -1, -1, 495, -1, -1, -1, 499, - -1, 501, 502, 503, 504, 505, 506, -1, 508, 509, - 510, 511, 512, 513, -1, -1, -1, -1, -1, -1, - 520, 521, -1, 523, -1, -1, 526, -1, -1, -1, - 530, 531, 532, -1, -1, -1, 536, -1, -1, 539, - 540, -1, 542, 543, 544, 545, 546, 547, -1, -1, - 550, 551, 552, 553, -1, 555, 556, -1, -1, 559, - 560, 561, 562, -1, -1, 565, 566, -1, 568, 569, - 570, 571, -1, -1, -1, -1, -1, 577, 578, 579, - -1, -1, -1, 583, 584, 585, 586, -1, 588, 589, - -1, 591, 592, -1, 594, 595, -1, -1, 598, -1, - -1, 601, -1, 603, -1, 605, 606, -1, -1, -1, - -1, -1, -1, 613, -1, -1, 616, -1, -1, -1, - 620, 621, 622, 623, 624, 625, 626, -1, -1, -1, - -1, -1, -1, 633, 634, -1, 636, 637, 638, -1, - -1, 641, -1, -1, -1, -1, -1, -1, 5, -1, - 7, 8, 9, 10, 11, 12, 656, -1, 15, -1, - -1, -1, 19, -1, 664, 22, -1, 24, 25, 26, - 27, 28, 29, 30, 31, 32, -1, 34, -1, -1, - -1, 38, -1, -1, -1, 42, -1, -1, 45, 46, - 47, -1, 49, -1, 51, 52, -1, -1, 55, -1, - -1, 58, 59, -1, 61, 62, -1, 64, 65, -1, - 67, 68, 69, 70, 71, 72, -1, 74, 75, 76, - 77, 78, 79, 80, -1, 82, 83, 84, 85, 86, - 87, 88, 89, -1, 91, 92, -1, 94, 95, 96, - 97, 98, -1, 100, -1, -1, 103, -1, -1, 106, - -1, 108, -1, -1, 111, -1, 113, -1, -1, -1, - 117, 118, 119, -1, -1, 122, -1, -1, -1, -1, - 127, 128, -1, -1, -1, -1, 133, -1, 135, -1, - -1, -1, 139, -1, 141, 142, 143, 144, 145, -1, - -1, -1, -1, 150, -1, -1, 153, 154, 155, -1, - -1, -1, 159, -1, 161, 162, -1, 164, 165, 166, - -1, 168, 169, -1, 171, 172, 173, 174, 175, 176, - 177, -1, -1, 180, 181, 182, 183, -1, -1, 186, - 187, -1, 189, 190, 191, -1, -1, 194, -1, -1, - -1, 198, 199, -1, 201, -1, 203, -1, 205, 206, - 207, 208, 209, 210, 211, -1, 213, -1, -1, 216, - 217, 218, -1, 220, -1, -1, -1, 224, 225, -1, - -1, -1, 229, 230, 231, 232, 233, -1, -1, -1, - 237, 238, 239, -1, -1, 242, -1, -1, -1, -1, - 247, 248, -1, 250, -1, 252, -1, 254, 255, -1, - 257, 258, -1, -1, -1, 262, -1, -1, 265, 266, - 267, -1, -1, 270, -1, -1, 273, 274, -1, -1, - -1, -1, -1, 280, 281, -1, 283, -1, 285, -1, - 287, 288, -1, -1, -1, -1, -1, -1, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, -1, 312, 313, 314, 315, -1, - 317, 318, 319, 320, -1, 322, 323, 324, -1, -1, - -1, -1, 329, 330, 331, 332, 333, 334, -1, -1, - 337, 338, -1, 340, -1, 342, -1, 344, 345, 346, - 347, 348, 349, 350, 351, 352, 353, -1, -1, 356, - -1, -1, 359, 360, 361, 362, -1, -1, -1, 366, - 367, -1, -1, -1, 371, -1, 373, 374, 375, -1, - 377, 378, 379, 380, -1, 382, 383, -1, -1, -1, - -1, -1, -1, -1, -1, 392, 393, 394, -1, -1, - 397, -1, 399, -1, 401, 402, 403, 404, 405, 406, - 407, 408, 409, 410, -1, -1, 413, 414, 415, -1, - 417, -1, 419, 420, 421, 422, 423, -1, 425, 426, - 427, -1, -1, 430, -1, -1, -1, 434, 435, 436, - 437, 438, -1, -1, 441, 442, 443, 444, 445, -1, - 447, 448, -1, 450, 451, 452, -1, -1, 455, -1, - 457, -1, 459, 460, -1, 462, 463, -1, 465, -1, - 467, -1, -1, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, -1, 483, 484, -1, -1, - -1, 488, 489, 490, 491, -1, -1, -1, 495, -1, - -1, -1, 499, -1, 501, 502, 503, 504, 505, 506, - -1, 508, 509, 510, 511, 512, 513, -1, -1, -1, - -1, -1, -1, 520, 521, -1, 523, -1, -1, 526, - -1, -1, -1, 530, 531, 532, -1, -1, -1, 536, - -1, -1, 539, 540, -1, 542, 543, 544, 545, 546, - 547, -1, -1, 550, 551, 552, 553, -1, 555, 556, - -1, -1, 559, 560, 561, 562, -1, -1, 565, 566, - -1, 568, 569, 570, 571, -1, -1, -1, -1, -1, - 577, 578, 579, -1, -1, -1, 583, 584, 585, 586, - -1, 588, 589, -1, 591, 592, -1, 594, 595, -1, - -1, 598, -1, -1, 601, -1, 603, -1, 605, 606, - -1, -1, -1, -1, -1, -1, 613, -1, -1, 616, - -1, -1, -1, 620, 621, 622, 623, 624, 625, 626, - -1, -1, -1, -1, -1, -1, 633, 634, -1, 636, - 637, 638, -1, -1, 641, -1, -1, -1, -1, 5, - -1, 7, 8, 9, 10, 11, 12, -1, -1, 15, - -1, -1, -1, 19, -1, -1, 22, 664, 24, 25, - 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, - -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, - 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, - -1, -1, 58, 59, -1, 61, 62, -1, 64, 65, - -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, - 76, 77, 78, 79, 80, -1, 82, 83, 84, 85, - 86, 87, 88, 89, -1, 91, 92, -1, 94, 95, - 96, 97, 98, -1, 100, -1, -1, 103, -1, -1, - 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, - -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, - -1, 127, 128, -1, -1, -1, -1, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, -1, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, -1, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, -1, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, -1, -1, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, -1, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, -1, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, -1, 641, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 651, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, 664, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, - -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, -1, -1, 58, - 59, -1, 61, 62, -1, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, -1, -1, 103, -1, -1, 106, -1, 108, - -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, - 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, - -1, -1, -1, -1, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, -1, - -1, 180, 181, 182, 183, -1, -1, 186, 187, -1, - 189, 190, 191, -1, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, -1, 216, 217, 218, - -1, 220, -1, -1, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, -1, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, -1, 247, 248, - -1, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, -1, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, -1, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, -1, 317, 318, - 319, 320, -1, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - -1, 340, -1, 342, -1, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, -1, 356, -1, -1, - 359, 360, 361, 362, -1, -1, -1, 366, 367, -1, - -1, -1, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, -1, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, -1, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, -1, -1, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - -1, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, -1, -1, - 539, 540, -1, 542, 543, 544, 545, 546, 547, -1, - -1, 550, 551, 552, 553, -1, 555, 556, -1, -1, - 559, 560, 561, 562, -1, -1, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, -1, -1, 583, 584, 585, 586, -1, 588, - 589, -1, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - -1, -1, -1, -1, 613, -1, -1, 616, -1, -1, - -1, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, -1, -1, -1, 5, - -1, 7, 8, 9, 10, 11, 12, 656, -1, 15, - -1, -1, -1, 19, -1, 664, 22, -1, 24, 25, - 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, - -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, - 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, - -1, -1, 58, 59, -1, 61, 62, -1, 64, 65, - -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, - 76, 77, 78, 79, 80, -1, 82, 83, 84, 85, - 86, 87, 88, 89, -1, 91, 92, -1, 94, 95, - 96, 97, 98, -1, 100, -1, -1, 103, -1, -1, - 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, - -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, - -1, 127, 128, -1, -1, -1, -1, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, -1, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, -1, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, -1, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, -1, -1, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, -1, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, -1, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, -1, 641, -1, -1, -1, -1, - -1, -1, 5, -1, 7, 8, 9, 10, 11, 12, - -1, -1, 15, -1, -1, -1, 19, 663, 664, 22, - -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, - -1, 34, -1, -1, -1, 38, -1, -1, -1, 42, - -1, -1, 45, 46, 47, -1, 49, -1, 51, 52, - -1, -1, 55, -1, -1, 58, 59, -1, 61, 62, - -1, 64, 65, -1, 67, 68, 69, 70, 71, 72, - -1, 74, 75, 76, 77, 78, 79, 80, -1, 82, - 83, 84, 85, 86, 87, 88, 89, -1, 91, 92, - -1, 94, 95, 96, 97, 98, -1, 100, -1, -1, - 103, -1, -1, 106, -1, 108, -1, -1, 111, -1, - 113, -1, -1, -1, 117, 118, 119, -1, -1, 122, - -1, -1, -1, -1, 127, 128, -1, -1, -1, -1, - 133, -1, 135, -1, -1, -1, 139, -1, 141, 142, - 143, 144, 145, -1, -1, -1, -1, 150, -1, -1, - 153, 154, 155, -1, -1, -1, 159, -1, 161, 162, - -1, 164, 165, 166, -1, 168, 169, -1, 171, 172, - 173, 174, 175, 176, 177, -1, -1, 180, 181, 182, - 183, -1, -1, 186, 187, -1, 189, 190, 191, -1, - -1, 194, -1, -1, -1, 198, 199, -1, 201, -1, - 203, -1, 205, 206, 207, 208, 209, 210, 211, -1, - 213, -1, -1, 216, 217, 218, -1, 220, -1, -1, - -1, 224, 225, -1, -1, -1, 229, 230, 231, 232, - 233, -1, -1, -1, 237, 238, 239, -1, -1, 242, - -1, -1, -1, -1, 247, 248, -1, -1, -1, 252, - -1, 254, 255, -1, 257, 258, -1, -1, -1, 262, - -1, -1, 265, 266, 267, -1, -1, 270, -1, -1, - 273, 274, -1, -1, -1, -1, -1, 280, 281, -1, - 283, -1, 285, -1, 287, 288, -1, -1, -1, -1, - -1, -1, 295, 296, 297, 298, 299, 300, 301, 302, - 303, 304, 305, 306, 307, 308, 309, 310, -1, 312, - 313, 314, 315, -1, 317, 318, 319, 320, -1, 322, - 323, 324, -1, -1, -1, -1, 329, 330, 331, 332, - 333, 334, -1, -1, 337, 338, -1, 340, -1, 342, - -1, 344, 345, 346, 347, 348, 349, 350, 351, 352, - 353, -1, -1, 356, -1, -1, 359, 360, 361, 362, - -1, -1, -1, 366, 367, -1, -1, -1, 371, -1, - 373, 374, 375, -1, 377, 378, 379, 380, -1, 382, - 383, -1, -1, -1, -1, -1, -1, -1, -1, 392, - 393, 394, -1, -1, 397, -1, 399, -1, 401, 402, - 403, 404, 405, 406, 407, 408, 409, 410, -1, -1, - 413, 414, 415, -1, 417, -1, 419, 420, 421, 422, - 423, -1, 425, 426, 427, -1, -1, 430, -1, -1, - -1, 434, 435, 436, 437, 438, -1, -1, 441, 442, - 443, 444, 445, -1, 447, 448, -1, 450, 451, 452, - -1, -1, 455, -1, 457, -1, 459, 460, -1, 462, - 463, -1, 465, -1, 467, -1, -1, 470, 471, 472, - 473, 474, 475, 476, 477, 478, 479, 480, 481, -1, - 483, 484, -1, -1, -1, 488, 489, 490, 491, -1, - -1, -1, 495, -1, -1, -1, 499, -1, 501, 502, - 503, 504, 505, 506, -1, 508, 509, 510, 511, 512, - 513, -1, -1, -1, -1, -1, -1, 520, 521, -1, - 523, -1, -1, 526, -1, -1, -1, 530, 531, 532, - -1, -1, -1, 536, -1, -1, 539, 540, -1, 542, - 543, 544, 545, 546, 547, -1, -1, 550, 551, 552, - 553, -1, 555, 556, -1, -1, 559, 560, 561, 562, - -1, -1, 565, 566, -1, 568, 569, 570, 571, -1, - -1, -1, -1, -1, 577, 578, 579, -1, -1, -1, - 583, 584, 585, 586, -1, 588, 589, -1, 591, 592, - -1, 594, 595, -1, -1, 598, -1, -1, 601, -1, - 603, -1, 605, 606, -1, -1, -1, -1, -1, -1, - 613, -1, -1, 616, -1, -1, -1, 620, 621, 622, - 623, 624, 625, 626, -1, -1, -1, -1, -1, -1, - 633, 634, -1, 636, 637, 638, -1, -1, 641, -1, - -1, -1, -1, 5, -1, 7, 8, 9, 10, 11, - 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, - 22, 664, 24, 25, 26, 27, 28, 29, 30, 31, - 32, -1, 34, -1, -1, -1, 38, -1, -1, -1, - 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, - 52, -1, -1, 55, -1, -1, 58, 59, -1, 61, - 62, -1, 64, 65, -1, 67, 68, 69, 70, 71, - 72, -1, 74, 75, 76, 77, 78, 79, 80, -1, - 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, - 92, -1, 94, 95, 96, 97, 98, -1, 100, -1, - -1, 103, -1, -1, 106, -1, 108, -1, -1, 111, - -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, - 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, - -1, 133, -1, 135, -1, -1, -1, 139, -1, 141, - 142, 143, 144, 145, -1, -1, -1, -1, 150, -1, - -1, 153, 154, 155, -1, -1, -1, 159, -1, 161, - 162, -1, 164, 165, 166, -1, 168, 169, -1, 171, - 172, 173, 174, 175, 176, 177, -1, -1, 180, 181, - 182, 183, -1, -1, 186, 187, -1, 189, 190, 191, - -1, -1, 194, -1, -1, -1, 198, 199, -1, 201, - -1, 203, -1, 205, 206, 207, 208, 209, 210, 211, - -1, 213, -1, -1, 216, 217, 218, -1, 220, -1, - -1, -1, 224, 225, -1, -1, -1, 229, 230, 231, - 232, 233, -1, -1, -1, 237, 238, 239, -1, -1, - 242, -1, -1, -1, -1, 247, 248, -1, -1, -1, - 252, -1, 254, 255, -1, 257, 258, -1, -1, -1, - 262, -1, -1, 265, 266, 267, -1, -1, 270, -1, - -1, 273, 274, -1, -1, -1, -1, -1, 280, 281, - -1, 283, -1, 285, -1, 287, 288, -1, -1, -1, - -1, -1, -1, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, -1, - 312, 313, 314, 315, -1, 317, 318, 319, 320, -1, - 322, 323, 324, -1, -1, -1, -1, 329, 330, 331, - 332, 333, 334, -1, -1, 337, 338, -1, 340, -1, - 342, -1, 344, 345, 346, 347, 348, 349, 350, 351, - 352, 353, -1, -1, 356, -1, -1, 359, 360, 361, - 362, -1, -1, -1, 366, 367, -1, -1, -1, 371, - -1, 373, 374, 375, -1, 377, 378, 379, 380, -1, - 382, 383, -1, -1, -1, -1, -1, -1, -1, -1, - 392, 393, 394, -1, -1, 397, -1, 399, -1, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, -1, - -1, 413, 414, 415, -1, 417, -1, 419, 420, 421, - 422, 423, -1, 425, 426, 427, -1, -1, 430, -1, - -1, -1, 434, 435, 436, 437, 438, -1, -1, 441, - 442, 443, 444, 445, -1, 447, 448, -1, 450, 451, - 452, -1, -1, 455, -1, 457, -1, 459, 460, -1, - 462, 463, -1, 465, -1, 467, -1, -1, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - -1, 483, 484, -1, -1, -1, 488, 489, 490, 491, - -1, -1, -1, 495, -1, -1, -1, 499, -1, 501, - 502, 503, 504, 505, 506, -1, 508, 509, 510, 511, - 512, 513, -1, -1, -1, -1, -1, -1, 520, 521, - -1, 523, -1, -1, 526, -1, -1, -1, 530, 531, - 532, -1, -1, -1, 536, -1, -1, 539, 540, -1, - 542, 543, 544, 545, 546, 547, -1, -1, 550, 551, - 552, 553, -1, 555, 556, -1, -1, 559, 560, 561, - 562, -1, -1, 565, 566, -1, 568, 569, 570, 571, - -1, -1, -1, -1, -1, 577, 578, 579, -1, -1, - -1, 583, 584, 585, 586, -1, 588, 589, -1, 591, - 592, -1, 594, 595, -1, -1, 598, -1, -1, 601, - -1, 603, -1, 605, 606, -1, -1, -1, -1, -1, - -1, 613, -1, -1, 616, -1, -1, -1, 620, 621, - 622, 623, 624, 625, 626, -1, -1, -1, -1, -1, - -1, 633, 634, -1, 636, 637, 638, -1, -1, 641, - -1, -1, -1, -1, 5, -1, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, 22, 664, 24, 25, 26, 27, 28, 29, 30, - 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, - 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, - -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, 97, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, - -1, -1, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, 150, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, 176, 177, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, -1, -1, 194, -1, -1, -1, 198, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, 210, - 211, -1, 213, -1, -1, 216, 217, 218, -1, 220, - -1, -1, -1, 224, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, 248, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, 265, 266, 267, -1, -1, 270, - -1, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, -1, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, 366, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, 382, 383, -1, -1, -1, -1, -1, -1, -1, - -1, 392, 393, 394, -1, -1, 397, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - -1, -1, 413, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, 448, -1, 450, - 451, 452, -1, -1, 455, -1, 457, -1, 459, 460, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, -1, 483, 484, -1, -1, -1, 488, 489, 490, - 491, -1, -1, -1, 495, -1, -1, -1, 499, -1, - 501, 502, 503, 504, 505, 506, -1, 508, 509, 510, - 511, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - 531, 532, -1, -1, -1, 536, -1, -1, 539, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, -1, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, 583, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, 594, 595, -1, -1, 598, -1, -1, - 601, -1, 603, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, 634, -1, 636, 637, 638, -1, -1, - 641, -1, -1, -1, -1, 5, -1, 7, 8, 9, + 0, 0, 529, 0, 0, 0, 0, 0, 0, 159, + 0, 160, 161, 162, 163, 164, 165, 1236, 0, 166, + 0, 0, 0, 167, 0, 829, 168, 0, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, + 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, + 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, + 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, + 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, + 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, + 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, + 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, + 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, + 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, + 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, + 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, + 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, + 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, + 250, 251, 0, 252, 253, 0, 254, 255, 256, 257, + 258, 259, 260, 0, 0, 261, 262, 263, 264, 0, + 0, 265, 266, 0, 267, 268, 269, 0, 0, 270, + 0, 0, 0, 271, 272, 0, 273, 0, 274, 0, + 275, 276, 277, 278, 279, 280, 281, 0, 282, 0, + 0, 283, 284, 285, 0, 286, 0, 0, 0, 287, + 288, 0, 0, 0, 289, 290, 291, 292, 293, 0, + 0, 0, 294, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 298, 299, 0, 1468, 0, 300, 0, 301, + 302, 0, 303, 304, 0, 0, 0, 305, 0, 0, + 306, 307, 308, 0, 0, 309, 0, 0, 310, 311, + 0, 0, 0, 0, 0, 312, 313, 0, 314, 0, + 315, 0, 316, 317, 0, 0, 0, 0, 0, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, + 337, 0, 338, 339, 340, 341, 0, 342, 343, 344, + 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, + 0, 0, 351, 352, 0, 353, 0, 354, 0, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 0, + 0, 365, 0, 0, 366, 367, 368, 369, 0, 0, + 0, 370, 371, 0, 0, 0, 372, 0, 373, 374, + 375, 0, 376, 377, 378, 379, 0, 380, 381, 0, + 0, 0, 0, 0, 0, 0, 0, 382, 383, 384, + 0, 0, 385, 0, 386, 0, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 0, 0, 397, 398, + 399, 0, 400, 0, 401, 402, 403, 404, 405, 0, + 406, 407, 408, 0, 0, 409, 0, 0, 0, 410, + 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, + 419, 0, 420, 421, 0, 422, 423, 424, 0, 0, + 425, 0, 426, 0, 427, 428, 0, 429, 430, 0, + 431, 0, 432, 0, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 0, 445, 446, + 0, 0, 0, 447, 448, 449, 450, 0, 0, 0, + 451, 0, 0, 0, 452, 0, 453, 454, 455, 456, + 457, 458, 0, 459, 460, 461, 462, 463, 464, 0, + 0, 0, 0, 0, 0, 465, 466, 0, 467, 0, + 0, 468, 0, 0, 0, 469, 470, 471, 0, 0, + 0, 472, 0, 0, 473, 474, 0, 475, 476, 477, + 478, 479, 480, 0, 0, 481, 482, 483, 484, 0, + 485, 486, 0, 0, 487, 488, 489, 490, 0, 0, + 491, 492, 0, 493, 494, 495, 496, 0, 0, 0, + 0, 0, 497, 498, 499, 0, 0, 0, 500, 501, + 502, 503, 0, 504, 505, 0, 506, 507, 0, 508, + 509, 0, 0, 510, 0, 0, 511, 0, 512, 0, + 513, 514, 0, 0, 0, 0, 0, 0, 515, 0, + 0, 516, 0, 0, 0, 517, 518, 519, 520, 521, + 522, 523, 0, 0, 0, 0, 0, 0, 524, 525, + 0, 526, 527, 528, 0, 0, 529, 0, 0, 0, + 0, 159, 0, 160, 161, 162, 163, 164, 165, 0, + 0, 166, 0, 0, 0, 167, 0, 0, 168, 567, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 0, + 178, 0, 0, 0, 179, 0, 0, 0, 180, 0, + 0, 181, 182, 183, 0, 184, 0, 185, 186, 0, + 0, 187, 0, 0, 188, 189, 0, 190, 191, 0, + 192, 193, 0, 194, 195, 196, 197, 198, 199, 0, + 200, 201, 202, 203, 204, 205, 206, 0, 207, 208, + 209, 210, 211, 212, 213, 214, 0, 215, 216, 0, + 217, 218, 219, 220, 221, 0, 222, 0, 0, 223, + 0, 0, 224, 0, 225, 0, 0, 226, 0, 227, + 0, 0, 0, 228, 229, 230, 0, 0, 231, 0, + 0, 0, 0, 232, 233, 0, 0, 0, 0, 234, + 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, + 239, 240, 241, 0, 0, 0, 0, 242, 0, 0, + 243, 244, 245, 0, 0, 0, 246, 0, 247, 248, + 0, 249, 250, 251, 0, 252, 253, 0, 254, 255, + 256, 257, 258, 259, 260, 0, 0, 261, 262, 263, + 264, 0, 0, 265, 266, 0, 267, 268, 269, 0, + 0, 270, 0, 0, 0, 271, 272, 0, 273, 0, + 274, 0, 275, 276, 277, 278, 279, 280, 281, 0, + 282, 0, 0, 283, 284, 285, 0, 286, 0, 0, + 0, 287, 288, 0, 0, 0, 289, 290, 291, 292, + 293, 0, 0, 0, 294, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 298, 299, 0, 0, 0, 300, + 0, 301, 302, 0, 303, 304, 0, 0, 0, 305, + 0, 0, 306, 307, 308, 0, 0, 309, 0, 0, + 310, 311, 0, 0, 0, 0, 0, 312, 313, 0, + 314, 0, 315, 0, 316, 317, 0, 0, 0, 0, + 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, + 335, 336, 337, 0, 338, 339, 340, 341, 0, 342, + 343, 344, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 0, 0, 351, 352, 0, 353, 0, 354, + 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 0, 0, 365, 0, 0, 366, 367, 368, 369, + 0, 0, 0, 370, 371, 0, 0, 0, 372, 0, + 373, 374, 375, 0, 376, 377, 378, 379, 0, 380, + 381, 0, 0, 0, 0, 0, 0, 0, 0, 382, + 383, 384, 0, 0, 385, 0, 386, 0, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 0, 0, + 397, 398, 399, 0, 400, 0, 401, 402, 403, 404, + 405, 0, 406, 407, 408, 0, 0, 409, 0, 0, + 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, + 417, 418, 419, 0, 420, 421, 0, 422, 423, 424, + 0, 0, 425, 0, 426, 0, 427, 428, 0, 429, + 430, 0, 431, 0, 432, 0, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 0, + 445, 446, 0, 0, 0, 447, 448, 449, 450, 0, + 0, 0, 451, 0, 0, 0, 452, 0, 453, 454, + 455, 456, 457, 458, 0, 459, 460, 461, 462, 463, + 464, 0, 0, 0, 0, 0, 0, 465, 466, 0, + 467, 0, 0, 468, 0, 0, 0, 469, 470, 471, + 0, 0, 0, 472, 0, 0, 473, 474, 0, 475, + 476, 477, 478, 479, 480, 0, 0, 481, 482, 483, + 484, 0, 485, 486, 0, 0, 487, 488, 489, 490, + 0, 0, 491, 492, 0, 493, 494, 495, 496, 0, + 0, 0, 0, 0, 497, 498, 499, 0, 0, 0, + 500, 501, 502, 503, 0, 504, 505, 0, 506, 507, + 0, 508, 509, 0, 0, 510, 0, 0, 511, 0, + 512, 0, 513, 514, 0, 0, 0, 0, 0, 0, + 515, 0, 0, 516, 0, 0, 0, 517, 518, 519, + 520, 521, 522, 523, 0, 0, 0, 0, 0, 0, + 524, 525, 0, 526, 527, 528, 0, 0, 529, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2526, 159, + 0, 160, 161, 162, 163, 164, 165, 0, 0, 166, + 0, 567, 0, 167, 0, 0, 168, 0, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, + 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, + 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, + 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, + 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, + 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, + 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, + 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, + 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, + 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, + 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, + 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, + 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, + 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, + 250, 251, 0, 252, 253, 0, 254, 255, 256, 257, + 258, 259, 260, 0, 0, 261, 262, 263, 264, 0, + 0, 265, 266, 0, 267, 268, 269, 0, 0, 270, + 0, 0, 0, 271, 272, 0, 273, 0, 274, 0, + 275, 276, 277, 278, 279, 280, 281, 0, 282, 0, + 0, 283, 284, 285, 0, 286, 0, 0, 0, 287, + 288, 0, 0, 0, 289, 290, 291, 292, 293, 0, + 0, 0, 294, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 298, 299, 0, 0, 0, 300, 0, 301, + 302, 0, 303, 304, 0, 0, 0, 305, 0, 0, + 306, 307, 308, 0, 0, 309, 0, 0, 310, 311, + 0, 0, 0, 0, 0, 312, 313, 0, 314, 0, + 315, 0, 316, 317, 0, 0, 0, 0, 0, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, + 337, 0, 338, 339, 340, 341, 0, 342, 343, 344, + 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, + 0, 0, 351, 352, 0, 353, 0, 354, 0, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 0, + 0, 365, 0, 0, 366, 367, 368, 369, 0, 0, + 0, 370, 371, 0, 0, 0, 372, 0, 373, 374, + 375, 0, 376, 377, 378, 379, 0, 380, 381, 0, + 0, 0, 0, 0, 0, 0, 0, 382, 383, 384, + 0, 0, 385, 0, 386, 0, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 0, 0, 397, 398, + 399, 0, 400, 0, 401, 402, 403, 404, 405, 0, + 406, 407, 408, 0, 0, 409, 0, 0, 0, 410, + 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, + 419, 0, 420, 421, 0, 422, 423, 424, 0, 0, + 425, 0, 426, 0, 427, 428, 0, 429, 430, 0, + 431, 0, 432, 0, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 0, 445, 446, + 0, 0, 0, 447, 448, 449, 450, 0, 0, 0, + 451, 0, 0, 0, 452, 0, 453, 454, 455, 456, + 457, 458, 0, 459, 460, 461, 462, 463, 464, 0, + 0, 0, 0, 0, 0, 465, 466, 0, 467, 0, + 0, 468, 0, 0, 0, 469, 470, 471, 0, 0, + 0, 472, 0, 0, 473, 474, 0, 475, 476, 477, + 478, 479, 480, 0, 0, 481, 482, 483, 484, 0, + 485, 486, 0, 0, 487, 488, 489, 490, 0, 0, + 491, 492, 0, 493, 494, 495, 496, 0, 0, 0, + 0, 0, 497, 498, 499, 0, 0, 0, 500, 501, + 502, 503, 0, 504, 505, 0, 506, 507, 0, 508, + 509, 0, 0, 510, 0, 0, 511, 0, 512, 0, + 513, 514, 0, 0, 0, 0, 0, 0, 515, 0, + 0, 516, 0, 0, 0, 517, 518, 519, 520, 521, + 522, 523, 0, 0, 0, 0, 0, 0, 524, 525, + 0, 526, 527, 528, 0, 0, 529, 0, 0, 0, + 0, 0, 0, 159, 0, 160, 161, 162, 163, 164, + 165, 3284, 0, 166, 0, 0, 0, 167, 0, 3285, + 168, 0, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 0, 178, 0, 0, 0, 179, 0, 0, 0, + 180, 0, 0, 181, 182, 183, 0, 184, 0, 185, + 186, 0, 0, 187, 0, 0, 188, 189, 0, 190, + 191, 0, 192, 193, 0, 194, 195, 196, 197, 198, + 199, 0, 200, 201, 202, 203, 204, 205, 206, 0, + 207, 208, 209, 210, 211, 212, 213, 214, 0, 215, + 216, 0, 217, 218, 219, 220, 221, 0, 222, 0, + 0, 223, 0, 0, 224, 0, 225, 0, 0, 226, + 0, 227, 0, 0, 0, 228, 229, 230, 0, 0, + 231, 0, 0, 0, 0, 232, 233, 0, 0, 0, + 0, 234, 0, 235, 0, 0, 0, 0, 236, 0, + 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, + 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, + 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, + 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, + 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, + 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, + 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, + 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, + 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, + 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, + 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, + 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, + 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, + 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, + 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, + 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, + 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, + 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, + 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, + 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, + 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, + 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, + 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, + 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, + 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, + 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, + 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, + 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, + 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, + 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, + 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, + 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, + 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, + 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, + 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, + 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, + 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, + 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, + 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, + 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, + 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, + 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, + 0, 0, 524, 525, 0, 526, 527, 528, 0, 0, + 529, 0, 0, 0, 0, 0, 0, 159, 0, 160, + 161, 162, 163, 164, 165, 0, 0, 166, 0, 0, + 0, 167, 4882, 829, 168, 0, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 0, 178, 0, 0, 0, + 179, 0, 0, 0, 180, 0, 0, 181, 182, 183, + 0, 184, 0, 185, 186, 0, 0, 187, 0, 0, + 188, 189, 0, 190, 191, 0, 192, 193, 0, 194, + 195, 196, 197, 198, 199, 0, 200, 201, 202, 203, + 204, 205, 206, 0, 207, 208, 209, 210, 211, 212, + 213, 214, 0, 215, 216, 0, 217, 218, 219, 220, + 221, 0, 222, 0, 0, 223, 0, 0, 224, 0, + 225, 0, 0, 226, 0, 227, 0, 0, 0, 228, + 229, 230, 0, 0, 231, 0, 0, 0, 0, 232, + 233, 0, 0, 0, 0, 234, 0, 235, 0, 0, + 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, + 0, 0, 0, 242, 0, 0, 243, 244, 245, 0, + 0, 0, 246, 0, 247, 248, 0, 249, 250, 251, + 0, 252, 253, 0, 254, 255, 256, 257, 258, 259, + 260, 0, 0, 261, 262, 263, 264, 0, 0, 265, + 266, 0, 267, 268, 269, 0, 0, 270, 0, 0, + 0, 271, 272, 0, 273, 0, 274, 0, 275, 276, + 277, 278, 279, 280, 281, 0, 282, 0, 0, 283, + 284, 285, 0, 286, 0, 0, 0, 287, 288, 0, + 0, 0, 289, 290, 291, 292, 293, 0, 0, 0, + 294, 295, 296, 0, 0, 297, 0, 0, 0, 0, + 298, 299, 0, 0, 0, 300, 0, 301, 302, 0, + 303, 304, 0, 0, 0, 305, 0, 0, 306, 307, + 308, 0, 0, 309, 0, 0, 310, 311, 0, 0, + 0, 0, 0, 312, 313, 0, 314, 0, 315, 0, + 316, 317, 0, 0, 0, 0, 0, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 0, 334, 335, 336, 337, 0, + 338, 339, 340, 341, 0, 342, 343, 344, 0, 0, + 0, 0, 345, 346, 347, 348, 349, 350, 0, 0, + 351, 352, 0, 353, 0, 354, 0, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 0, 0, 365, + 0, 0, 366, 367, 368, 369, 0, 0, 0, 370, + 371, 0, 0, 0, 372, 0, 373, 374, 375, 0, + 376, 377, 378, 379, 0, 380, 381, 0, 0, 0, + 0, 0, 0, 0, 0, 382, 383, 384, 0, 0, + 385, 0, 386, 0, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 0, 397, 398, 399, 0, + 400, 0, 401, 402, 403, 404, 405, 0, 406, 407, + 408, 0, 0, 409, 0, 0, 0, 410, 411, 412, + 413, 414, 0, 0, 415, 416, 417, 418, 419, 0, + 420, 421, 0, 422, 423, 424, 0, 0, 425, 0, + 426, 0, 427, 428, 0, 429, 430, 0, 431, 0, + 432, 0, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 0, 445, 446, 0, 0, + 0, 447, 448, 449, 450, 0, 0, 0, 451, 0, + 0, 0, 452, 0, 453, 454, 455, 456, 457, 458, + 0, 459, 460, 461, 462, 463, 464, 0, 0, 0, + 0, 0, 0, 465, 466, 0, 467, 0, 0, 468, + 0, 0, 0, 469, 470, 471, 0, 0, 0, 472, + 0, 0, 473, 474, 0, 475, 476, 477, 478, 479, + 480, 0, 0, 481, 482, 483, 484, 0, 485, 486, + 0, 0, 487, 488, 489, 490, 0, 0, 491, 492, + 0, 493, 494, 495, 496, 0, 0, 0, 0, 0, + 497, 498, 499, 0, 0, 0, 500, 501, 502, 503, + 0, 504, 505, 0, 506, 507, 0, 508, 509, 0, + 0, 510, 0, 0, 511, 0, 512, 0, 513, 514, + 0, 0, 0, 0, 0, 0, 515, 0, 0, 516, + 0, 0, 0, 517, 518, 519, 520, 521, 522, 523, + 0, 0, 0, 0, 0, 0, 524, 525, 0, 526, + 527, 528, 0, 0, 529, 0, 0, 0, 0, 159, + 0, 160, 161, 162, 163, 164, 165, 0, 0, 166, + 0, 0, 0, 167, 0, 0, 168, 567, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, + 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, + 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, + 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, + 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, + 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, + 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, + 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, + 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, + 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, + 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, + 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, + 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, + 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, + 250, 251, 0, 252, 253, 0, 254, 255, 256, 257, + 258, 259, 260, 0, 0, 261, 262, 651, 264, 0, + 0, 265, 266, 0, 267, 268, 269, 0, 0, 270, + 0, 0, 0, 652, 272, 0, 273, 0, 274, 0, + 275, 276, 277, 278, 279, 280, 281, 0, 282, 0, + 0, 283, 284, 285, 0, 286, 0, 0, 0, 287, + 288, 0, 0, 0, 289, 290, 291, 292, 293, 0, + 0, 0, 294, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 298, 299, 0, 0, 0, 300, 0, 301, + 302, 0, 303, 304, 0, 0, 0, 305, 0, 0, + 306, 307, 308, 0, 0, 309, 0, 0, 310, 311, + 0, 0, 0, 0, 0, 312, 313, 0, 314, 0, + 315, 0, 316, 317, 0, 0, 0, 0, 0, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, + 337, 0, 338, 339, 340, 341, 0, 342, 343, 344, + 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, + 0, 0, 351, 352, 0, 353, 0, 354, 0, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 0, + 0, 365, 0, 0, 366, 367, 368, 369, 0, 0, + 0, 370, 371, 0, 0, 0, 372, 0, 373, 374, + 375, 0, 376, 377, 378, 379, 0, 380, 381, 0, + 0, 0, 0, 0, 0, 0, 0, 382, 383, 384, + 0, 0, 385, 0, 386, 0, 653, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 0, 0, 397, 398, + 399, 0, 400, 0, 401, 402, 403, 404, 405, 0, + 406, 407, 408, 0, 0, 409, 0, 0, 0, 410, + 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, + 419, 0, 420, 421, 0, 422, 423, 424, 0, 0, + 425, 0, 426, 0, 427, 428, 0, 429, 430, 0, + 431, 0, 432, 0, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 0, 445, 446, + 0, 0, 0, 447, 448, 449, 450, 0, 0, 0, + 451, 0, 0, 0, 452, 0, 453, 454, 455, 456, + 457, 458, 0, 459, 460, 461, 462, 463, 464, 0, + 0, 0, 0, 0, 0, 465, 466, 0, 467, 0, + 0, 468, 0, 0, 0, 469, 470, 471, 0, 0, + 0, 472, 0, 0, 473, 474, 0, 475, 476, 477, + 478, 479, 480, 0, 0, 481, 482, 483, 484, 0, + 485, 486, 0, 0, 487, 488, 489, 490, 0, 0, + 491, 492, 0, 493, 494, 495, 496, 0, 0, 0, + 0, 0, 497, 498, 499, 0, 0, 0, 500, 501, + 502, 503, 0, 504, 505, 0, 506, 507, 0, 508, + 509, 0, 0, 510, 0, 0, 511, 0, 512, 0, + 513, 514, 0, 0, 0, 0, 0, 0, 515, 0, + 0, 516, 0, 0, 0, 517, 518, 519, 520, 521, + 522, 523, 0, 0, 0, 0, 0, 0, 524, 525, + 0, 526, 527, 528, 0, 0, 529, 0, 0, 0, + 0, 159, 0, 160, 161, 162, 163, 164, 165, 0, + 0, 166, 0, 0, 0, 167, 0, 0, 168, 567, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 0, + 178, 0, 0, 0, 179, 0, 0, 0, 180, 0, + 0, 181, 182, 183, 0, 184, 0, 185, 186, 0, + 0, 187, 0, 0, 188, 189, 0, 190, 191, 0, + 192, 193, 0, 194, 195, 196, 197, 198, 199, 0, + 200, 201, 202, 203, 204, 205, 206, 0, 207, 208, + 209, 210, 211, 212, 213, 214, 0, 215, 216, 0, + 217, 218, 219, 220, 221, 0, 222, 0, 0, 223, + 0, 0, 224, 0, 225, 0, 0, 226, 0, 227, + 0, 0, 0, 228, 229, 230, 0, 0, 231, 0, + 0, 0, 0, 232, 233, 0, 0, 0, 0, 234, + 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, + 239, 240, 241, 0, 0, 0, 0, 242, 0, 0, + 243, 244, 245, 0, 0, 0, 246, 0, 247, 248, + 0, 249, 250, 251, 0, 252, 253, 0, 254, 255, + 256, 257, 258, 259, 260, 0, 0, 261, 262, 263, + 264, 0, 0, 265, 266, 0, 267, 268, 269, 0, + 0, 270, 0, 0, 0, 271, 272, 0, 273, 0, + 274, 0, 275, 276, 277, 278, 279, 280, 281, 0, + 282, 0, 0, 283, 284, 285, 0, 286, 0, 0, + 0, 287, 288, 0, 0, 0, 289, 290, 291, 292, + 293, 0, 0, 0, 294, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 298, 299, 0, 0, 0, 300, + 0, 301, 302, 0, 303, 304, 0, 0, 0, 305, + 0, 0, 306, 307, 308, 0, 0, 309, 0, 0, + 310, 311, 0, 0, 0, 0, 0, 312, 313, 0, + 314, 0, 315, 0, 316, 317, 0, 0, 0, 0, + 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, + 335, 336, 337, 0, 338, 339, 340, 341, 0, 342, + 343, 344, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 0, 0, 351, 352, 0, 353, 0, 354, + 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 0, 0, 365, 0, 0, 366, 367, 368, 369, + 0, 0, 0, 370, 371, 0, 0, 0, 372, 0, + 373, 374, 375, 0, 376, 377, 378, 379, 0, 380, + 381, 0, 0, 0, 0, 0, 0, 0, 0, 382, + 383, 384, 0, 0, 385, 0, 386, 0, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 0, 0, + 397, 398, 399, 0, 400, 0, 401, 402, 403, 404, + 405, 0, 406, 407, 408, 0, 0, 409, 0, 0, + 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, + 417, 418, 419, 0, 420, 421, 0, 422, 423, 424, + 0, 0, 425, 0, 426, 0, 427, 428, 0, 429, + 430, 0, 431, 0, 432, 0, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 0, + 445, 446, 0, 0, 0, 447, 448, 449, 450, 0, + 0, 0, 451, 0, 0, 0, 452, 0, 453, 454, + 455, 456, 457, 458, 0, 459, 460, 461, 462, 463, + 464, 0, 0, 0, 0, 0, 0, 465, 466, 0, + 467, 0, 0, 468, 0, 0, 0, 469, 470, 471, + 0, 0, 0, 472, 0, 0, 473, 474, 0, 475, + 476, 477, 478, 479, 480, 0, 0, 481, 482, 483, + 484, 0, 485, 486, 0, 0, 487, 488, 489, 490, + 0, 0, 491, 492, 0, 493, 494, 495, 496, 0, + 0, 0, 0, 0, 497, 498, 499, 0, 0, 0, + 500, 501, 502, 503, 0, 504, 505, 0, 506, 507, + 0, 508, 509, 0, 0, 510, 0, 0, 511, 0, + 512, 0, 513, 514, 0, 0, 0, 0, 0, 0, + 515, 0, 0, 516, 0, 0, 0, 517, 518, 519, + 520, 521, 522, 523, 0, 0, 0, 0, 0, 0, + 524, 525, 0, 526, 527, 528, 0, 0, 529, 0, + 0, 0, 0, 159, 0, 160, 161, 162, 163, 164, + 165, 0, 0, 166, 0, 0, 0, 167, 0, 0, + 168, 829, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 0, 178, 0, 0, 0, 179, 0, 0, 0, + 180, 0, 0, 181, 182, 183, 0, 184, 0, 185, + 186, 0, 0, 187, 0, 0, 188, 189, 0, 190, + 191, 0, 192, 193, 0, 194, 195, 196, 197, 198, + 199, 0, 200, 201, 202, 203, 204, 205, 206, 0, + 207, 208, 209, 210, 211, 212, 213, 214, 0, 215, + 216, 0, 217, 218, 219, 220, 221, 0, 222, 0, + 0, 223, 0, 0, 224, 0, 225, 0, 0, 226, + 0, 227, 0, 0, 0, 228, 229, 230, 0, 0, + 231, 0, 0, 0, 0, 232, 233, 0, 0, 0, + 0, 234, 0, 235, 0, 0, 0, 0, 236, 0, + 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, + 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, + 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, + 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, + 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, + 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, + 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, + 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, + 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, + 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, + 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, + 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, + 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, + 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, + 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, + 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, + 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, + 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, + 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, + 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, + 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, + 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, + 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, + 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, + 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, + 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, + 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, + 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, + 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, + 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, + 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, + 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, + 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, + 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, + 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, + 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, + 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, + 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, + 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, + 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, + 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, + 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, + 0, 0, 524, 525, 0, 526, 527, 528, 0, 0, + 529, 0, 0, 0, 0, 159, 0, 160, 161, 162, + 163, 164, 165, 0, 0, 166, 0, 0, 0, 167, + 0, 0, 168, 3285, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 0, 178, 0, 0, 0, 179, 0, + 0, 0, 180, 0, 0, 181, 182, 183, 0, 184, + 0, 185, 186, 0, 0, 187, 0, 0, 188, 189, + 0, 190, 1008, 1009, 192, 193, 0, 194, 195, 196, + 197, 198, 199, 0, 200, 201, 202, 203, 204, 205, + 206, 0, 207, 208, 209, 210, 211, 212, 213, 214, + 0, 215, 216, 0, 217, 218, 219, 220, 221, 0, + 222, 0, 0, 223, 0, 0, 224, 0, 225, 0, + 0, 226, 0, 227, 0, 0, 0, 228, 229, 230, + 0, 0, 231, 0, 0, 0, 0, 232, 233, 0, + 0, 0, 1010, 234, 0, 235, 0, 0, 0, 0, + 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, + 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, + 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, + 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, + 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, + 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, + 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, + 279, 280, 1011, 0, 282, 0, 0, 283, 284, 285, + 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, + 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, + 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, + 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, + 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, + 0, 309, 0, 0, 310, 311, 0, 0, 0, 0, + 0, 312, 313, 0, 1012, 0, 315, 0, 316, 317, + 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, + 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, + 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, + 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, + 360, 361, 1013, 363, 364, 0, 0, 365, 0, 0, + 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, + 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, + 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, + 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, + 386, 0, 387, 388, 1014, 390, 391, 392, 393, 394, + 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, + 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, + 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, + 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, + 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, + 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, + 0, 1015, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, + 448, 1016, 450, 0, 0, 0, 451, 0, 0, 0, + 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, + 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, + 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, + 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, + 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, + 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, + 487, 488, 489, 490, 0, 0, 491, 492, 0, 493, + 494, 495, 496, 0, 0, 0, 0, 0, 1017, 498, + 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, + 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, + 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, + 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, + 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, + 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, + 0, 0, 529, 0, 0, 0, 159, 0, 160, 161, + 162, 163, 164, 165, 0, 0, 166, 0, 0, 0, + 167, 0, 0, 168, 1018, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 0, 178, 0, 0, 0, 179, + 0, 0, 0, 180, 0, 0, 181, 182, 183, 0, + 184, 0, 185, 186, 0, 0, 187, 0, 0, 188, + 189, 0, 190, 191, 0, 192, 193, 0, 194, 195, + 196, 197, 198, 199, 0, 200, 201, 202, 203, 204, + 205, 206, 0, 207, 208, 209, 210, 211, 212, 213, + 214, 0, 215, 216, 0, 217, 218, 219, 220, 221, + 0, 222, 0, 0, 223, 0, 0, 224, 0, 225, + 0, 0, 226, 0, 227, 0, 0, 0, 228, 229, + 230, 0, 0, 231, 0, 0, 0, 0, 232, 233, + 0, 0, 0, 0, 234, 0, 235, 0, 0, 0, + 0, 236, 0, 237, 238, 239, 240, 241, 0, 0, + 0, 0, 242, 0, 0, 243, 244, 245, 0, 0, + 0, 246, 0, 247, 248, 0, 249, 250, 251, 0, + 252, 253, 0, 254, 255, 256, 257, 258, 259, 260, + 0, 0, 261, 262, 263, 264, 0, 0, 265, 266, + 0, 267, 268, 269, 0, 0, 270, 0, 0, 0, + 271, 272, 0, 273, 0, 274, 0, 275, 276, 277, + 278, 279, 280, 281, 0, 282, 0, 0, 283, 284, + 285, 0, 286, 0, 0, 0, 287, 288, 0, 0, + 0, 289, 290, 291, 292, 293, 0, 0, 0, 294, + 295, 296, 0, 0, 297, 0, 0, 0, 0, 298, + 299, 0, 0, 0, 300, 0, 301, 302, 0, 303, + 304, 0, 0, 0, 305, 0, 0, 306, 307, 308, + 0, 0, 309, 0, 0, 310, 311, 665, 0, 0, + 0, 0, 312, 313, 0, 314, 0, 315, 0, 316, + 317, 0, 0, 0, 0, 0, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 0, 334, 335, 336, 337, 0, 338, + 339, 340, 341, 0, 342, 343, 344, 0, 0, 0, + 0, 345, 346, 347, 348, 349, 350, 0, 0, 351, + 352, 0, 353, 0, 354, 0, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 0, 0, 365, 0, + 0, 366, 367, 368, 369, 0, 0, 0, 370, 371, + 0, 0, 0, 372, 0, 373, 374, 375, 0, 376, + 377, 378, 379, 0, 380, 381, 0, 0, 0, 0, + 0, 0, 0, 0, 382, 383, 384, 0, 0, 385, + 0, 386, 0, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 0, 0, 397, 398, 399, 0, 400, + 0, 401, 402, 403, 404, 405, 0, 406, 407, 408, + 0, 0, 409, 0, 0, 0, 410, 411, 412, 413, + 414, 0, 0, 415, 416, 417, 418, 419, 0, 420, + 421, 0, 422, 423, 424, 0, 0, 425, 0, 426, + 0, 427, 428, 0, 429, 430, 0, 431, 0, 432, + 0, 0, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 0, 445, 446, 0, 0, 0, + 447, 448, 449, 450, 0, 0, 0, 451, 0, 0, + 0, 452, 0, 453, 454, 455, 456, 457, 458, 0, + 459, 460, 461, 462, 463, 464, 0, 0, 0, 0, + 0, 0, 465, 466, 0, 467, 0, 0, 468, 0, + 0, 0, 469, 470, 471, 0, 0, 0, 472, 0, + 0, 473, 474, 0, 475, 476, 477, 478, 479, 480, + 0, 0, 481, 482, 483, 484, 0, 485, 486, 0, + 0, 487, 488, 489, 490, 0, 156, 491, 492, 0, + 493, 494, 495, 496, 0, 0, 0, 0, 0, 497, + 498, 499, 0, 0, 0, 500, 501, 502, 503, 0, + 504, 505, 0, 506, 507, 0, 508, 509, 0, 0, + 510, 0, 0, 511, 0, 512, 0, 513, 514, 0, + 0, 0, 0, 0, 0, 515, 0, 0, 516, 0, + 0, 0, 517, 518, 519, 520, 521, 522, 523, 0, + 0, 0, 0, 0, 0, 524, 525, 0, 526, 527, + 528, 0, 0, 529, 0, 0, 0, 159, 0, 160, + 161, 162, 163, 164, 165, 0, 0, 166, 0, 0, + 0, 167, 0, 0, 168, 1539, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 0, 178, 0, 0, 0, + 179, 0, 0, 0, 180, 0, 0, 181, 182, 183, + 0, 184, 0, 185, 186, 0, 0, 187, 0, 0, + 188, 189, 0, 190, 191, 0, 192, 193, 0, 194, + 195, 196, 197, 198, 199, 0, 200, 201, 202, 203, + 204, 205, 206, 0, 207, 208, 209, 210, 211, 212, + 213, 214, 0, 215, 216, 0, 217, 218, 219, 220, + 221, 0, 222, 0, 0, 223, 0, 0, 224, 0, + 225, 0, 0, 226, 0, 227, 0, 0, 0, 228, + 229, 230, 0, 0, 231, 0, 0, 0, 0, 232, + 233, 0, 0, 0, 0, 234, 0, 235, 0, 0, + 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, + 0, 0, 0, 242, 0, 0, 243, 244, 245, 0, + 0, 0, 246, 0, 247, 248, 0, 249, 250, 251, + 0, 252, 253, 0, 254, 255, 256, 257, 258, 259, + 260, 0, 0, 261, 262, 263, 264, 0, 0, 265, + 266, 0, 267, 268, 269, 0, 0, 270, 0, 0, + 0, 271, 272, 0, 273, 0, 274, 0, 275, 276, + 277, 278, 279, 280, 281, 0, 282, 0, 0, 283, + 284, 285, 0, 286, 0, 0, 0, 287, 288, 0, + 0, 0, 289, 290, 291, 292, 293, 0, 0, 0, + 294, 295, 296, 0, 0, 297, 0, 0, 0, 0, + 298, 299, 0, 0, 0, 300, 0, 301, 302, 0, + 303, 304, 0, 0, 0, 305, 0, 0, 306, 307, + 308, 0, 0, 309, 0, 0, 310, 311, 665, 0, + 0, 0, 0, 312, 313, 0, 314, 0, 315, 0, + 316, 317, 0, 0, 0, 0, 0, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 0, 334, 335, 336, 337, 0, + 338, 339, 340, 341, 0, 342, 343, 344, 0, 0, + 0, 0, 345, 346, 347, 348, 349, 350, 0, 0, + 351, 352, 0, 353, 0, 354, 0, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 0, 0, 365, + 0, 0, 366, 367, 368, 369, 0, 0, 0, 370, + 371, 0, 0, 0, 372, 0, 373, 374, 375, 0, + 376, 377, 378, 379, 0, 380, 381, 0, 0, 0, + 0, 0, 0, 0, 0, 382, 383, 384, 0, 0, + 385, 0, 386, 0, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 0, 397, 398, 399, 0, + 400, 0, 401, 402, 403, 404, 405, 0, 406, 407, + 408, 0, 0, 409, 0, 0, 0, 410, 411, 412, + 413, 414, 0, 0, 415, 416, 417, 418, 419, 0, + 420, 421, 0, 422, 423, 424, 0, 0, 425, 0, + 426, 0, 427, 428, 0, 429, 430, 0, 431, 0, + 432, 0, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 0, 445, 446, 0, 0, + 0, 447, 448, 449, 450, 0, 0, 0, 451, 0, + 0, 0, 452, 0, 453, 454, 455, 456, 457, 458, + 0, 459, 460, 461, 462, 463, 464, 0, 0, 0, + 0, 0, 0, 465, 466, 0, 467, 0, 0, 468, + 0, 0, 0, 469, 470, 471, 0, 0, 0, 472, + 0, 0, 473, 474, 0, 475, 476, 477, 478, 479, + 480, 0, 0, 481, 482, 483, 484, 0, 485, 486, + 0, 0, 487, 488, 489, 490, 0, 156, 491, 492, + 0, 493, 494, 495, 496, 0, 0, 0, 0, 0, + 497, 498, 499, 0, 0, 0, 500, 501, 502, 503, + 0, 504, 505, 0, 506, 507, 0, 508, 509, 0, + 0, 510, 0, 0, 511, 0, 512, 0, 513, 514, + 0, 0, 0, 0, 0, 0, 515, 0, 0, 516, + 0, 0, 0, 517, 518, 519, 520, 521, 522, 523, + 0, 0, 0, 0, 0, 0, 524, 525, 0, 526, + 527, 528, 0, 0, 529, 0, 0, 0, 159, 0, + 160, 161, 162, 163, 164, 165, 0, 0, 166, 0, + 0, 0, 167, 0, 0, 168, 1890, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 0, 178, 0, 0, + 0, 179, 0, 0, 0, 180, 0, 0, 181, 182, + 183, 0, 184, 0, 185, 186, 0, 0, 187, 0, + 0, 188, 189, 0, 190, 191, 0, 192, 193, 0, + 194, 195, 196, 197, 198, 199, 0, 200, 201, 202, + 203, 204, 205, 206, 0, 207, 208, 209, 210, 211, + 212, 213, 214, 0, 215, 216, 0, 217, 218, 219, + 220, 221, 0, 222, 0, 0, 223, 0, 0, 224, + 0, 225, 0, 0, 226, 0, 227, 0, 0, 0, + 228, 229, 230, 0, 0, 231, 0, 0, 0, 0, + 232, 233, 0, 0, 0, 0, 234, 0, 235, 0, + 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, + 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, + 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, + 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, + 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, + 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, + 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, + 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, + 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, + 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, + 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, + 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, + 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, + 307, 308, 0, 0, 309, 0, 0, 310, 311, 665, + 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, + 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, + 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, + 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, + 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, + 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, + 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, + 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, + 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, + 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, + 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, + 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, + 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, + 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, + 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, + 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, + 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, + 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, + 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, + 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, + 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, + 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, + 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, + 486, 0, 0, 487, 488, 489, 490, 0, 156, 491, + 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, + 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, + 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, + 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, + 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, + 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, + 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, + 526, 527, 528, 0, 0, 529, 0, 0, 0, 159, + 0, 160, 161, 162, 163, 164, 165, 0, 0, 166, + 0, 0, 0, 167, 0, 0, 168, 2616, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, + 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, + 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, + 0, 0, 188, 189, 0, 190, 1008, 1009, 192, 193, + 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, + 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, + 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, + 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, + 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, + 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, + 0, 232, 233, 0, 0, 0, 1010, 234, 0, 235, + 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, + 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, + 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, + 250, 251, 0, 252, 253, 0, 254, 255, 256, 257, + 258, 259, 260, 0, 0, 261, 262, 263, 264, 0, + 0, 265, 266, 0, 267, 268, 269, 0, 0, 270, + 0, 0, 0, 271, 272, 0, 273, 0, 274, 0, + 275, 276, 277, 278, 279, 280, 1011, 0, 282, 0, + 0, 283, 284, 285, 0, 286, 0, 0, 0, 287, + 288, 0, 0, 0, 289, 290, 291, 292, 293, 0, + 0, 0, 294, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 298, 299, 0, 0, 0, 300, 0, 301, + 302, 0, 303, 304, 0, 0, 0, 305, 0, 0, + 306, 307, 308, 0, 0, 309, 0, 0, 310, 311, + 0, 0, 0, 0, 0, 312, 313, 0, 1012, 0, + 315, 0, 316, 317, 0, 0, 0, 0, 0, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, + 337, 0, 338, 339, 340, 341, 0, 342, 343, 344, + 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, + 0, 0, 351, 352, 0, 353, 0, 354, 0, 355, + 356, 357, 358, 359, 360, 361, 1013, 363, 364, 0, + 0, 365, 0, 0, 366, 367, 368, 369, 0, 0, + 0, 370, 371, 0, 0, 0, 372, 0, 373, 374, + 375, 0, 376, 377, 378, 379, 0, 380, 381, 0, + 0, 0, 0, 0, 0, 0, 0, 382, 383, 384, + 0, 0, 385, 0, 386, 0, 387, 388, 1014, 390, + 391, 392, 393, 394, 395, 396, 0, 0, 397, 398, + 399, 0, 400, 0, 401, 402, 403, 404, 405, 0, + 406, 407, 408, 0, 0, 409, 0, 0, 0, 410, + 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, + 419, 0, 420, 421, 0, 422, 423, 424, 0, 0, + 425, 0, 426, 0, 427, 428, 0, 429, 430, 0, + 431, 0, 432, 0, 0, 1015, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 0, 445, 446, + 0, 0, 0, 447, 448, 1016, 450, 0, 0, 0, + 451, 0, 0, 0, 452, 0, 453, 454, 455, 456, + 457, 458, 0, 459, 460, 461, 462, 463, 464, 0, + 0, 0, 0, 0, 0, 465, 466, 0, 467, 0, + 0, 468, 0, 0, 0, 469, 470, 471, 0, 0, + 0, 472, 0, 0, 473, 474, 0, 475, 476, 477, + 478, 479, 480, 0, 0, 481, 482, 483, 484, 0, + 485, 486, 0, 0, 487, 488, 489, 490, 0, 0, + 491, 492, 0, 493, 494, 495, 496, 0, 0, 0, + 0, 0, 497, 498, 499, 0, 0, 0, 500, 501, + 502, 503, 0, 504, 505, 0, 506, 507, 0, 508, + 509, 0, 0, 510, 0, 0, 511, 0, 512, 0, + 513, 514, 0, 0, 0, 0, 0, 0, 515, 0, + 0, 516, 0, 0, 0, 517, 518, 519, 520, 521, + 522, 523, 0, 0, 0, 0, 0, 0, 524, 525, + 0, 526, 527, 528, 0, 0, 529, 0, 0, 0, + 159, 0, 160, 161, 162, 163, 164, 165, 0, 0, + 166, 0, 0, 0, 167, 0, 0, 168, 1018, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 0, 178, + 0, 0, 0, 179, 0, 0, 0, 180, 0, 0, + 181, 182, 183, 0, 184, 0, 185, 186, 0, 0, + 187, 0, 0, 188, 189, 0, 190, 191, 0, 192, + 193, 0, 194, 195, 196, 197, 198, 199, 0, 200, + 201, 202, 203, 204, 205, 206, 0, 207, 208, 209, + 210, 211, 212, 213, 214, 1379, 215, 216, 0, 217, + 218, 219, 220, 221, 0, 222, 0, 0, 223, 0, + 0, 224, 0, 225, 0, 0, 226, 0, 227, 0, + 0, 0, 228, 229, 230, 0, 0, 231, 0, 0, + 0, 0, 232, 233, 0, 0, 0, 0, 234, 0, + 235, 0, 0, 0, 0, 236, 0, 237, 238, 239, + 240, 241, 0, 0, 0, 0, 242, 0, 0, 243, + 244, 245, 0, 0, 0, 246, 0, 247, 248, 0, + 249, 250, 251, 0, 252, 253, 0, 254, 255, 256, + 257, 258, 259, 260, 0, 0, 261, 262, 263, 264, + 0, 0, 265, 266, 0, 267, 268, 269, 0, 0, + 270, 0, 0, 0, 271, 272, 0, 273, 0, 274, + 0, 275, 276, 277, 278, 279, 280, 281, 0, 282, + 0, 0, 283, 284, 285, 0, 286, 0, 0, 0, + 287, 288, 0, 0, 0, 289, 290, 291, 292, 293, + 0, 0, 0, 294, 295, 296, 0, 0, 297, 0, + 0, 0, 0, 298, 299, 0, 0, 0, 300, 0, + 301, 302, 0, 303, 304, 0, 0, 0, 305, 0, + 0, 306, 307, 308, 0, 0, 309, 0, 0, 310, + 311, 0, 0, 0, 0, 0, 312, 313, 0, 314, + 0, 315, 0, 316, 317, 0, 0, 0, 0, 0, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 0, 334, 335, + 336, 337, 0, 338, 339, 340, 341, 0, 342, 343, + 344, 0, 0, 0, 0, 345, 346, 347, 348, 349, + 350, 0, 0, 351, 352, 0, 353, 0, 354, 0, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 0, 0, 365, 0, 0, 366, 367, 368, 369, 0, + 0, 0, 370, 371, 0, 0, 0, 372, 0, 373, + 374, 375, 0, 376, 377, 378, 379, 0, 380, 381, + 0, 0, 0, 0, 0, 0, 0, 0, 382, 383, + 384, 0, 0, 385, 0, 386, 0, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 0, 0, 397, + 398, 399, 0, 400, 0, 401, 402, 403, 404, 405, + 0, 406, 407, 408, 0, 0, 409, 0, 0, 0, + 410, 411, 412, 413, 414, 0, 0, 415, 416, 417, + 418, 419, 0, 420, 421, 0, 422, 423, 424, 0, + 0, 425, 0, 426, 0, 427, 428, 0, 429, 430, + 0, 431, 0, 432, 0, 0, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 0, 445, + 446, 0, 0, 0, 447, 448, 449, 450, 0, 0, + 0, 451, 0, 0, 0, 452, 0, 453, 454, 455, + 456, 457, 458, 0, 459, 460, 461, 462, 463, 464, + 0, 0, 0, 0, 0, 0, 465, 466, 0, 467, + 0, 0, 468, 0, 0, 0, 469, 470, 471, 0, + 0, 0, 472, 0, 0, 473, 474, 0, 475, 476, + 477, 478, 479, 480, 0, 0, 481, 482, 483, 484, + 0, 485, 486, 0, 0, 487, 488, 489, 490, 0, + 0, 491, 492, 0, 493, 494, 495, 496, 0, 0, + 0, 0, 0, 497, 498, 499, 0, 0, 0, 500, + 501, 502, 503, 0, 504, 505, 0, 506, 507, 0, + 508, 509, 0, 0, 510, 0, 0, 511, 0, 512, + 0, 513, 514, 0, 0, 0, 0, 0, 0, 515, + 0, 0, 516, 0, 0, 0, 517, 518, 519, 520, + 521, 522, 523, 0, 0, 0, 0, 0, 0, 524, + 525, 0, 526, 527, 528, 0, 0, 529, 0, 0, + 0, 159, 0, 160, 161, 162, 163, 164, 165, 0, + 0, 166, 0, 0, 0, 167, 0, 0, 168, 1380, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 0, + 178, 0, 0, 0, 179, 0, 0, 0, 180, 0, + 0, 181, 182, 183, 0, 184, 0, 185, 186, 0, + 0, 187, 0, 0, 188, 189, 0, 190, 191, 0, + 192, 193, 0, 194, 195, 196, 197, 198, 199, 0, + 200, 201, 202, 203, 204, 205, 206, 0, 207, 208, + 209, 210, 211, 212, 213, 214, 0, 215, 216, 0, + 217, 218, 219, 220, 221, 0, 222, 0, 0, 223, + 0, 0, 224, 0, 225, 0, 0, 226, 0, 227, + 0, 0, 0, 228, 229, 230, 0, 0, 231, 0, + 0, 0, 0, 232, 233, 0, 0, 0, 0, 234, + 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, + 239, 240, 241, 0, 0, 0, 0, 242, 0, 0, + 243, 244, 245, 0, 0, 0, 246, 0, 247, 248, + 0, 249, 250, 251, 0, 252, 253, 0, 254, 255, + 256, 257, 258, 259, 260, 0, 0, 261, 262, 263, + 264, 0, 0, 265, 266, 0, 267, 268, 269, 0, + 0, 270, 0, 0, 0, 271, 272, 0, 273, 0, + 274, 0, 275, 276, 277, 278, 279, 280, 281, 0, + 282, 0, 0, 283, 284, 285, 0, 286, 0, 0, + 0, 287, 288, 0, 0, 0, 289, 290, 291, 292, + 293, 0, 0, 0, 294, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 298, 299, 0, 0, 0, 300, + 0, 301, 302, 0, 303, 304, 0, 0, 0, 305, + 0, 0, 306, 307, 308, 0, 0, 309, 0, 0, + 310, 311, 0, 0, 0, 0, 0, 312, 313, 0, + 314, 0, 315, 0, 316, 317, 0, 0, 0, 0, + 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, + 335, 336, 337, 0, 338, 339, 340, 341, 0, 342, + 343, 344, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 0, 0, 351, 352, 0, 353, 0, 354, + 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 0, 0, 365, 0, 0, 366, 367, 368, 369, + 0, 0, 0, 370, 371, 0, 0, 0, 372, 0, + 373, 374, 375, 0, 376, 377, 378, 379, 0, 380, + 381, 0, 0, 0, 0, 0, 0, 0, 0, 382, + 383, 384, 0, 0, 385, 0, 386, 0, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 0, 0, + 397, 398, 399, 0, 400, 0, 401, 402, 403, 404, + 405, 0, 406, 407, 408, 0, 0, 409, 0, 0, + 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, + 417, 418, 419, 0, 420, 421, 0, 422, 423, 424, + 0, 0, 425, 0, 426, 0, 427, 428, 0, 429, + 430, 0, 431, 0, 432, 0, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 0, + 445, 446, 0, 0, 0, 447, 448, 449, 450, 0, + 0, 0, 451, 0, 0, 0, 452, 0, 453, 454, + 455, 456, 457, 458, 0, 459, 460, 461, 462, 463, + 464, 0, 0, 0, 0, 0, 0, 465, 466, 0, + 467, 0, 0, 468, 0, 0, 0, 469, 470, 471, + 0, 0, 0, 472, 0, 0, 473, 474, 0, 475, + 476, 477, 478, 479, 480, 0, 0, 481, 482, 483, + 484, 0, 485, 486, 0, 0, 487, 488, 489, 490, + 0, 0, 491, 492, 0, 493, 494, 495, 496, 0, + 0, 0, 0, 0, 497, 498, 499, 0, 0, 0, + 500, 501, 502, 503, 0, 504, 505, 0, 506, 507, + 0, 508, 509, 0, 0, 510, 0, 0, 511, 0, + 512, 0, 513, 514, 0, 0, 0, 0, 0, 0, + 515, 0, 0, 516, 0, 0, 0, 517, 518, 519, + 520, 521, 522, 523, 0, 0, 0, 0, 0, 0, + 524, 525, 0, 526, 527, 528, 0, 0, 529, 0, + 0, 0, 159, 0, 160, 161, 162, 163, 164, 165, + 0, 0, 166, 0, 0, 0, 167, 0, 0, 0, + 1380, 169, 170, 171, 172, 173, 174, 175, 176, 0, + 0, 923, 0, 0, 0, 179, 0, 0, 0, 180, + 0, 0, 181, 182, 183, 0, 184, 0, 0, 0, + 0, 0, 187, 7, 0, 188, 189, 0, 190, 0, + 0, 0, 0, 0, 194, 195, 196, 924, 198, 199, + 0, 200, 201, 0, 0, 0, 0, 0, 0, 207, + 0, 209, 0, 211, 212, 213, 214, 0, 215, 216, + 0, 217, 218, 219, 0, 221, 0, 222, 0, 0, + 223, 0, 0, 224, 0, 225, 0, 0, 226, 0, + 227, 0, 0, 0, 228, 229, 230, 0, 0, 231, + 0, 0, 0, 0, 232, 0, 0, 0, 0, 0, + 234, 0, 235, 0, 0, 0, 0, 236, 0, 237, + 238, 239, 240, 241, 0, 0, 0, 0, 0, 0, + 0, 243, 244, 245, 0, 0, 0, 246, 0, 0, + 248, 0, 249, 250, 251, 0, 252, 253, 0, 254, + 255, 256, 257, 258, 0, 0, 0, 0, 261, 262, + 263, 264, 0, 0, 265, 266, 925, 267, 268, 269, + 0, 0, 0, 0, 0, 0, 0, 272, 0, 273, + 0, 274, 0, 275, 276, 277, 278, 279, 0, 281, + 0, 282, 0, 0, 0, 284, 285, 0, 0, 0, + 0, 0, 0, 288, 0, 0, 0, 289, 290, 291, + 292, 293, 26, 0, 0, 294, 295, 296, 0, 0, + 297, 0, 0, 0, 0, 298, 0, 0, 0, 0, + 300, 0, 301, 302, 0, 303, 304, 926, 0, 0, + 305, 0, 0, 0, 307, 308, 0, 0, 309, 927, + 0, 310, 311, 0, 0, 0, 0, 0, 312, 313, + 0, 314, 0, 315, 0, 316, 317, 0, 0, 0, + 0, 32, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 0, + 334, 335, 336, 337, 0, 338, 339, 340, 341, 0, + 342, 343, 344, 0, 0, 0, 0, 345, 346, 347, + 348, 349, 350, 0, 0, 351, 352, 0, 353, 0, + 354, 0, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 0, 0, 365, 0, 0, 366, 367, 368, + 369, 0, 0, 0, 0, 371, 0, 0, 0, 372, + 0, 373, 374, 375, 0, 376, 377, 378, 928, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 383, 384, 0, 0, 0, 0, 386, 0, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 0, 0, + 0, 0, 398, 399, 0, 400, 0, 401, 402, 403, + 404, 405, 0, 406, 407, 408, 0, 0, 409, 0, + 0, 0, 410, 411, 412, 413, 414, 0, 0, 415, + 416, 417, 418, 419, 0, 420, 0, 0, 422, 0, + 424, 41, 0, 425, 0, 0, 0, 427, 0, 0, + 429, 430, 0, 431, 929, 432, 0, 0, 433, 0, + 435, 436, 437, 438, 439, 440, 441, 0, 443, 444, + 0, 445, 0, 0, 0, 0, 447, 448, 449, 0, + 0, 0, 0, 451, 0, 0, 0, 0, 0, 0, + 454, 0, 0, 457, 458, 0, 459, 0, 461, 0, + 463, 464, 0, 0, 0, 0, 0, 0, 465, 466, + 0, 467, 0, 0, 468, 0, 0, 0, 469, 0, + 471, 0, 0, 0, 472, 0, 0, 0, 474, 0, + 475, 476, 477, 478, 479, 480, 0, 0, 481, 482, + 483, 484, 0, 485, 486, 0, 0, 487, 488, 489, + 490, 0, 0, 491, 492, 0, 493, 494, 495, 496, + 0, 0, 0, 0, 0, 497, 498, 499, 0, 0, + 0, 0, 501, 502, 503, 0, 504, 505, 0, 506, + 507, 0, 0, 0, 0, 0, 510, 0, 0, 511, + 0, 0, 0, 513, 514, 0, 0, 0, 0, 0, + 0, 515, 0, 0, 516, 0, 0, 0, 517, 518, + 519, 520, 521, 522, 523, 0, 0, 60, 0, 0, + 0, 524, 0, 0, 526, 0, 528, 0, 159, 529, + 160, 161, 162, 163, 164, 165, 0, 0, 166, 0, + 0, 0, 167, 0, 0, 168, 4578, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 0, 178, 0, 0, + 0, 179, 0, 0, 0, 180, 0, 0, 181, 182, + 183, 0, 184, 0, 185, 186, 0, 0, 187, 0, + 0, 188, 189, 0, 190, 191, 0, 192, 193, 0, + 194, 195, 196, 197, 198, 199, 0, 200, 201, 202, + 203, 204, 205, 206, 0, 207, 208, 209, 210, 211, + 212, 213, 214, 0, 215, 216, 0, 217, 218, 219, + 220, 221, 0, 222, 0, 0, 223, 0, 0, 224, + 0, 225, 1122, 0, 226, 0, 227, 0, 0, 0, + 228, 229, 230, 0, 0, 231, 0, 0, 0, 0, + 232, 233, 0, 0, 0, 0, 234, 0, 235, 0, + 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, + 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, + 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, + 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, + 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, + 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, + 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, + 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, + 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, + 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, + 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, + 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, + 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, + 307, 308, 0, 0, 309, 0, 0, 310, 311, 665, + 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, + 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, + 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, + 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, + 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, + 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, + 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, + 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, + 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, + 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, + 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, + 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, + 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, + 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, + 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, + 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, + 0, 0, 447, 448, 449, 450, 0, 0, 0, 451, + 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, + 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, + 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, + 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, + 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, + 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, + 486, 0, 0, 487, 488, 489, 490, 0, 156, 491, + 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, + 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, + 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, + 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, + 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, + 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, + 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, + 526, 527, 528, 0, 159, 529, 160, 161, 162, 163, + 164, 165, 0, 0, 166, 0, 0, 0, 167, 0, + 1281, 168, 0, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 0, 178, 0, 0, 0, 179, 0, 0, + 0, 180, 0, 0, 181, 182, 183, 0, 184, 0, + 185, 186, 0, 0, 187, 0, 0, 188, 189, 0, + 190, 191, 0, 192, 193, 0, 194, 195, 196, 197, + 198, 199, 0, 200, 201, 202, 203, 204, 205, 206, + 0, 207, 208, 209, 210, 211, 212, 213, 214, 0, + 215, 216, 0, 217, 218, 219, 220, 221, 0, 222, + 0, 0, 223, 0, 0, 224, 0, 225, 0, 0, + 226, 0, 227, 0, 0, 0, 228, 229, 230, 0, + 0, 231, 0, 0, 0, 0, 232, 233, 0, 0, + 0, 0, 234, 0, 235, 0, 0, 0, 0, 236, + 0, 237, 238, 239, 240, 241, 0, 0, 0, 0, + 242, 0, 0, 243, 244, 245, 0, 0, 0, 246, + 0, 247, 248, 0, 249, 250, 251, 0, 252, 253, + 0, 254, 255, 256, 257, 258, 259, 260, 0, 0, + 261, 262, 263, 264, 0, 0, 265, 266, 0, 267, + 268, 269, 0, 0, 270, 0, 0, 0, 271, 272, + 0, 273, 0, 274, 0, 275, 276, 277, 278, 279, + 280, 281, 0, 282, 0, 0, 283, 284, 285, 0, + 286, 0, 0, 0, 287, 288, 0, 0, 0, 289, + 290, 291, 292, 293, 0, 0, 0, 294, 295, 296, + 0, 0, 297, 0, 0, 0, 0, 298, 299, 0, + 0, 0, 300, 0, 301, 302, 0, 303, 304, 0, + 0, 0, 305, 0, 0, 306, 307, 308, 0, 0, + 309, 0, 0, 310, 311, 0, 0, 0, 0, 0, + 312, 313, 0, 314, 0, 315, 0, 316, 317, 0, + 0, 0, 0, 0, 0, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 0, 334, 335, 336, 337, 0, 338, 339, 340, + 341, 0, 342, 343, 344, 0, 0, 0, 0, 345, + 346, 347, 348, 349, 350, 0, 0, 351, 352, 0, + 353, 0, 354, 0, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 0, 0, 365, 0, 0, 366, + 367, 368, 369, 0, 0, 0, 370, 371, 0, 0, + 0, 372, 0, 373, 374, 375, 0, 376, 377, 378, + 379, 0, 380, 381, 0, 0, 0, 0, 0, 0, + 0, 0, 382, 383, 384, 0, 0, 385, 0, 386, + 0, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 0, 0, 397, 398, 399, 0, 400, 0, 401, + 402, 403, 404, 405, 0, 406, 407, 408, 0, 0, + 409, 0, 0, 0, 410, 411, 412, 413, 414, 0, + 0, 415, 416, 417, 418, 419, 0, 420, 421, 0, + 422, 423, 424, 0, 0, 425, 0, 426, 0, 427, + 428, 0, 429, 430, 0, 431, 0, 432, 0, 0, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 0, 445, 446, 0, 0, 0, 447, 448, + 449, 450, 0, 0, 0, 451, 0, 0, 0, 452, + 0, 453, 454, 455, 456, 457, 458, 0, 459, 460, + 461, 462, 463, 464, 0, 0, 0, 0, 0, 0, + 465, 466, 0, 467, 0, 0, 468, 0, 0, 0, + 469, 470, 471, 0, 0, 0, 472, 0, 0, 473, + 474, 0, 475, 476, 477, 478, 479, 480, 0, 0, + 481, 482, 483, 484, 0, 485, 486, 0, 0, 487, + 488, 489, 490, 0, 0, 491, 492, 0, 493, 494, + 495, 496, 0, 0, 0, 0, 0, 497, 498, 499, + 0, 0, 0, 500, 501, 502, 503, 0, 504, 505, + 0, 506, 507, 0, 508, 509, 0, 0, 510, 0, + 0, 511, 0, 512, 0, 513, 514, 0, 0, 0, + 0, 0, 0, 515, 0, 0, 516, 0, 0, 0, + 517, 518, 519, 520, 521, 522, 523, 0, 0, 0, + 0, 0, 0, 524, 525, 0, 526, 527, 528, 0, + 159, 529, 160, 161, 162, 163, 164, 165, 0, 0, + 166, 2345, 0, 0, 167, 0, 0, 168, 0, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 0, 178, + 0, 0, 0, 179, 0, 0, 0, 180, 0, 0, + 181, 182, 183, 0, 184, 0, 185, 186, 0, 0, + 187, 0, 0, 188, 189, 0, 190, 191, 0, 192, + 193, 0, 194, 195, 196, 197, 198, 199, 0, 200, + 201, 202, 203, 204, 205, 206, 0, 207, 208, 209, + 210, 211, 212, 213, 214, 0, 215, 216, 0, 217, + 218, 219, 220, 221, 0, 222, 0, 0, 223, 0, + 0, 224, 0, 225, 0, 0, 226, 0, 227, 0, + 0, 0, 228, 229, 230, 0, 0, 231, 0, 0, + 0, 0, 232, 233, 0, 0, 0, 0, 234, 0, + 235, 0, 0, 0, 0, 236, 0, 237, 238, 239, + 240, 241, 0, 0, 0, 0, 242, 0, 0, 243, + 244, 245, 0, 0, 0, 246, 0, 247, 248, 0, + 249, 250, 251, 0, 252, 253, 0, 254, 255, 256, + 257, 258, 259, 260, 0, 0, 261, 262, 263, 264, + 0, 0, 265, 266, 0, 267, 268, 269, 0, 0, + 270, 0, 0, 0, 271, 272, 0, 273, 0, 274, + 0, 275, 276, 277, 278, 279, 280, 281, 0, 282, + 0, 0, 283, 284, 285, 0, 286, 0, 0, 0, + 287, 288, 0, 0, 0, 289, 290, 291, 292, 293, + 0, 0, 0, 294, 295, 296, 0, 0, 297, 0, + 0, 0, 0, 298, 299, 0, 0, 0, 300, 0, + 301, 302, 0, 303, 304, 0, 0, 0, 305, 0, + 0, 306, 307, 308, 0, 0, 309, 0, 0, 310, + 311, 0, 0, 0, 0, 0, 312, 313, 0, 314, + 0, 315, 0, 316, 317, 0, 0, 0, 0, 0, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 0, 334, 335, + 336, 337, 0, 338, 339, 340, 341, 0, 342, 343, + 344, 0, 0, 0, 0, 345, 346, 347, 348, 349, + 350, 0, 0, 351, 352, 0, 353, 0, 354, 0, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 0, 0, 365, 0, 0, 366, 367, 368, 369, 0, + 0, 0, 370, 371, 0, 0, 0, 372, 0, 373, + 374, 375, 0, 376, 377, 378, 379, 0, 380, 381, + 0, 0, 0, 0, 0, 0, 0, 0, 382, 383, + 384, 0, 0, 385, 0, 386, 0, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 0, 0, 397, + 398, 399, 0, 400, 0, 401, 402, 403, 404, 405, + 0, 406, 407, 408, 0, 0, 409, 0, 0, 0, + 410, 411, 412, 413, 414, 0, 0, 415, 416, 417, + 418, 419, 0, 420, 421, 0, 422, 423, 424, 0, + 0, 425, 0, 426, 0, 427, 428, 0, 429, 430, + 0, 431, 0, 432, 0, 0, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 0, 445, + 446, 0, 0, 0, 447, 448, 449, 450, 0, 0, + 0, 451, 0, 0, 0, 452, 0, 453, 454, 455, + 456, 457, 458, 0, 459, 460, 461, 462, 463, 464, + 0, 0, 0, 0, 0, 0, 465, 466, 0, 467, + 0, 0, 468, 0, 0, 0, 469, 470, 471, 0, + 0, 0, 472, 0, 0, 473, 474, 0, 475, 476, + 477, 478, 479, 480, 0, 0, 481, 482, 483, 484, + 0, 485, 486, 0, 0, 487, 488, 489, 490, 0, + 0, 491, 492, 0, 493, 494, 495, 496, 0, 0, + 0, 0, 0, 497, 498, 499, 0, 0, 0, 500, + 501, 502, 503, 0, 504, 505, 0, 506, 507, 0, + 508, 509, 0, 0, 510, 0, 0, 511, 0, 512, + 0, 513, 514, 0, 0, 0, 0, 0, 0, 515, + 0, 0, 516, 0, 0, 0, 517, 518, 519, 520, + 521, 522, 523, 0, 0, 0, 0, 0, 0, 524, + 525, 0, 526, 527, 528, 0, 159, 529, 160, 161, + 162, 163, 164, 165, 0, 0, 166, 3119, 0, 0, + 167, 0, 0, 168, 0, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 0, 178, 0, 0, 0, 179, + 0, 0, 0, 180, 0, 0, 181, 182, 183, 0, + 184, 0, 185, 186, 0, 0, 187, 0, 0, 188, + 189, 0, 190, 191, 0, 192, 193, 0, 194, 195, + 196, 197, 198, 199, 0, 200, 201, 202, 203, 204, + 205, 206, 0, 207, 208, 209, 210, 211, 212, 213, + 214, 0, 215, 216, 0, 217, 218, 219, 220, 221, + 0, 222, 0, 0, 223, 0, 0, 224, 0, 225, + 0, 0, 226, 0, 227, 0, 0, 0, 228, 229, + 230, 0, 0, 231, 0, 0, 0, 0, 232, 233, + 0, 0, 0, 0, 234, 0, 235, 0, 0, 0, + 0, 236, 0, 237, 238, 239, 240, 241, 0, 0, + 0, 0, 242, 0, 0, 243, 244, 245, 0, 0, + 0, 246, 0, 247, 248, 0, 249, 250, 251, 0, + 252, 253, 0, 254, 255, 256, 257, 258, 259, 260, + 0, 0, 261, 262, 263, 264, 0, 0, 265, 266, + 0, 267, 268, 269, 0, 0, 270, 0, 0, 0, + 271, 272, 0, 273, 0, 274, 0, 275, 276, 277, + 278, 279, 280, 281, 0, 282, 0, 0, 283, 284, + 285, 0, 286, 0, 0, 0, 287, 288, 0, 0, + 0, 289, 290, 291, 292, 293, 0, 0, 0, 294, + 295, 296, 0, 0, 297, 0, 0, 0, 0, 298, + 299, 0, 0, 0, 300, 0, 301, 302, 0, 303, + 304, 0, 0, 0, 305, 0, 0, 306, 307, 308, + 0, 0, 309, 0, 0, 310, 311, 0, 0, 0, + 0, 0, 312, 313, 0, 314, 0, 315, 0, 316, + 317, 0, 0, 0, 0, 0, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 0, 334, 335, 336, 337, 0, 338, + 339, 340, 341, 0, 342, 343, 344, 0, 0, 0, + 0, 345, 346, 347, 348, 349, 350, 0, 0, 351, + 352, 0, 353, 0, 354, 0, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 0, 0, 365, 0, + 0, 366, 367, 368, 369, 0, 0, 0, 370, 371, + 0, 0, 0, 372, 0, 373, 374, 375, 0, 376, + 377, 378, 379, 0, 380, 381, 0, 0, 0, 0, + 0, 0, 0, 0, 382, 383, 384, 0, 0, 385, + 0, 386, 0, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 0, 0, 397, 398, 399, 0, 400, + 0, 401, 402, 403, 404, 405, 0, 406, 407, 408, + 0, 0, 409, 0, 0, 0, 410, 411, 412, 413, + 414, 0, 0, 415, 416, 417, 418, 419, 0, 420, + 421, 0, 422, 423, 424, 0, 0, 425, 0, 426, + 0, 427, 428, 0, 429, 430, 0, 431, 0, 432, + 0, 0, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 0, 445, 446, 0, 0, 0, + 447, 448, 449, 450, 0, 0, 0, 451, 0, 0, + 0, 452, 0, 453, 454, 455, 456, 457, 458, 0, + 459, 460, 461, 462, 463, 464, 0, 0, 0, 0, + 0, 0, 465, 466, 0, 467, 0, 0, 468, 0, + 0, 0, 469, 470, 471, 0, 0, 0, 472, 0, + 0, 473, 474, 0, 475, 476, 477, 478, 479, 480, + 0, 0, 481, 482, 483, 484, 0, 485, 486, 0, + 0, 487, 488, 489, 490, 0, 0, 491, 492, 0, + 493, 494, 495, 496, 0, 0, 0, 0, 0, 497, + 498, 499, 0, 0, 0, 500, 501, 502, 503, 0, + 504, 505, 0, 506, 507, 0, 508, 509, 0, 0, + 510, 0, 0, 511, 0, 512, 0, 513, 514, 0, + 0, 0, 0, 0, 0, 515, 0, 0, 516, 0, + 0, 0, 517, 518, 519, 520, 521, 522, 523, 0, + 0, 0, 0, 0, 0, 524, 525, 0, 526, 527, + 528, 0, 159, 529, 160, 161, 162, 163, 164, 165, + 0, 0, 166, 3481, 0, 0, 167, 0, 0, 168, + 0, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 0, 178, 0, 0, 0, 179, 0, 0, 0, 180, + 0, 0, 181, 182, 183, 0, 184, 0, 185, 186, + 0, 0, 187, 0, 0, 188, 189, 0, 190, 191, + 0, 192, 193, 0, 194, 195, 196, 197, 198, 199, + 0, 200, 201, 202, 203, 204, 205, 206, 0, 207, + 208, 209, 210, 211, 212, 213, 214, 0, 215, 216, + 0, 217, 218, 219, 220, 221, 0, 222, 0, 0, + 223, 0, 0, 224, 0, 225, 0, 0, 226, 0, + 227, 0, 0, 0, 228, 229, 230, 0, 0, 231, + 0, 0, 0, 0, 232, 233, 0, 0, 0, 0, + 234, 0, 235, 0, 0, 0, 0, 236, 0, 237, + 238, 239, 240, 241, 0, 0, 0, 0, 242, 0, + 0, 243, 244, 245, 0, 0, 0, 246, 0, 247, + 248, 0, 249, 250, 251, 0, 252, 253, 0, 254, + 255, 256, 257, 258, 259, 260, 0, 0, 261, 262, + 263, 264, 0, 0, 265, 266, 0, 267, 268, 269, + 0, 0, 270, 0, 0, 0, 271, 272, 0, 273, + 0, 274, 0, 275, 276, 277, 278, 279, 280, 281, + 0, 282, 0, 0, 283, 284, 285, 0, 286, 0, + 0, 0, 287, 288, 0, 0, 0, 289, 290, 291, + 292, 293, 0, 0, 0, 294, 295, 296, 0, 0, + 297, 0, 0, 0, 0, 298, 299, 0, 0, 0, + 300, 0, 301, 302, 0, 303, 304, 0, 0, 0, + 305, 0, 0, 306, 307, 308, 0, 0, 309, 0, + 0, 310, 311, 0, 0, 0, 0, 0, 312, 313, + 0, 314, 0, 315, 0, 316, 317, 0, 0, 0, + 0, 0, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 0, + 334, 335, 336, 337, 0, 338, 339, 340, 341, 0, + 342, 343, 344, 0, 0, 0, 0, 345, 346, 347, + 348, 349, 350, 0, 0, 351, 352, 0, 353, 0, + 354, 0, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 0, 0, 365, 0, 0, 366, 367, 368, + 369, 0, 0, 0, 370, 371, 0, 0, 0, 372, + 0, 373, 374, 375, 0, 376, 377, 378, 379, 0, + 380, 381, 0, 0, 0, 0, 0, 0, 0, 0, + 382, 383, 384, 0, 0, 385, 0, 386, 0, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 0, + 0, 397, 398, 399, 0, 400, 0, 401, 402, 403, + 404, 405, 0, 406, 407, 408, 0, 0, 409, 0, + 0, 0, 410, 411, 412, 413, 414, 0, 0, 415, + 416, 417, 418, 419, 0, 420, 421, 0, 422, 423, + 424, 0, 0, 425, 0, 426, 0, 427, 428, 0, + 429, 430, 0, 431, 0, 432, 0, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 0, 445, 446, 0, 0, 0, 447, 448, 449, 450, + 0, 0, 0, 451, 0, 0, 0, 452, 0, 453, + 454, 455, 456, 457, 458, 0, 459, 460, 461, 462, + 463, 464, 0, 0, 0, 0, 0, 0, 465, 466, + 0, 467, 0, 0, 468, 0, 0, 0, 469, 470, + 471, 0, 0, 0, 472, 0, 0, 473, 474, 0, + 475, 476, 477, 478, 479, 480, 0, 0, 481, 482, + 483, 484, 0, 485, 486, 0, 0, 487, 488, 489, + 490, 0, 0, 491, 492, 0, 493, 494, 495, 496, + 0, 0, 0, 0, 0, 497, 498, 499, 0, 0, + 0, 500, 501, 502, 503, 0, 504, 505, 0, 506, + 507, 0, 508, 509, 0, 0, 510, 0, 0, 511, + 0, 512, 0, 513, 514, 0, 0, 0, 0, 0, + 0, 515, 0, 0, 516, 0, 0, 0, 517, 518, + 519, 520, 521, 522, 523, 0, 0, 0, 0, 0, + 0, 524, 525, 0, 526, 527, 528, 0, 159, 529, + 160, 161, 162, 163, 164, 165, 0, 0, 166, 3887, + 0, 0, 167, 0, 0, 168, 0, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 0, 178, 0, 0, + 1526, 179, 0, 0, 0, 180, 0, 0, 181, 182, + 183, 0, 184, 0, 185, 186, 0, 0, 187, 0, + 0, 188, 189, 0, 190, 191, 0, 192, 193, 0, + 194, 195, 196, 197, 198, 199, 0, 200, 201, 202, + 203, 204, 205, 206, 0, 207, 208, 209, 210, 211, + 212, 213, 214, 0, 215, 216, 0, 217, 218, 219, + 220, 221, 0, 222, 0, 0, 223, 0, 0, 224, + 0, 225, 0, 0, 226, 0, 227, 0, 0, 0, + 228, 229, 230, 0, 0, 231, 0, 0, 0, 0, + 232, 233, 0, 0, 0, 1527, 234, 0, 235, 0, + 0, 0, 0, 236, 0, 237, 238, 239, 240, 241, + 0, 0, 0, 0, 242, 0, 0, 243, 244, 245, + 0, 0, 0, 246, 0, 247, 248, 0, 249, 250, + 251, 0, 252, 253, 0, 254, 255, 256, 257, 258, + 259, 260, 0, 0, 261, 262, 263, 264, 0, 0, + 265, 266, 0, 267, 268, 269, 0, 0, 270, 0, + 0, 0, 271, 272, 0, 273, 0, 274, 0, 275, + 276, 277, 278, 279, 280, 281, 0, 282, 0, 0, + 283, 284, 285, 0, 286, 0, 0, 0, 287, 288, + 0, 0, 0, 289, 290, 291, 292, 293, 0, 0, + 0, 294, 295, 296, 0, 0, 297, 0, 0, 0, + 0, 298, 299, 0, 0, 0, 300, 0, 301, 302, + 0, 303, 304, 0, 0, 0, 305, 0, 0, 306, + 307, 308, 0, 0, 309, 0, 0, 310, 311, 665, + 0, 0, 0, 0, 312, 313, 0, 314, 0, 315, + 0, 316, 317, 0, 0, 0, 0, 0, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, + 0, 338, 339, 340, 341, 0, 342, 343, 344, 0, + 0, 0, 0, 345, 346, 347, 348, 349, 350, 0, + 0, 351, 352, 0, 353, 0, 354, 0, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 0, 0, + 365, 0, 0, 366, 367, 368, 369, 0, 0, 0, + 370, 371, 0, 0, 0, 372, 0, 373, 374, 375, + 0, 376, 377, 378, 379, 0, 380, 381, 0, 0, + 0, 0, 0, 0, 0, 0, 382, 383, 384, 0, + 0, 385, 0, 386, 0, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 0, 0, 397, 398, 399, + 0, 400, 0, 401, 402, 403, 404, 405, 0, 406, + 407, 408, 0, 0, 409, 0, 0, 0, 410, 411, + 412, 413, 414, 0, 0, 415, 416, 417, 418, 419, + 0, 420, 421, 0, 422, 423, 424, 0, 0, 425, + 0, 426, 0, 427, 428, 0, 429, 430, 0, 431, + 0, 432, 0, 0, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 0, 445, 446, 0, + 0, 0, 447, 448, 449, 450, 0, 0, 1528, 451, + 0, 0, 0, 452, 0, 453, 454, 455, 456, 457, + 458, 0, 459, 460, 461, 462, 463, 464, 0, 0, + 0, 0, 0, 0, 465, 466, 0, 467, 0, 0, + 468, 0, 0, 0, 469, 470, 471, 0, 0, 0, + 472, 0, 0, 473, 474, 0, 475, 476, 477, 478, + 479, 480, 0, 0, 481, 482, 483, 484, 0, 485, + 486, 0, 0, 487, 488, 489, 490, 0, 156, 491, + 492, 0, 493, 494, 495, 496, 0, 0, 0, 0, + 0, 497, 498, 499, 0, 0, 0, 500, 501, 502, + 503, 0, 504, 505, 0, 506, 507, 0, 508, 509, + 0, 0, 510, 0, 0, 511, 0, 512, 0, 513, + 514, 0, 0, 0, 0, 0, 0, 515, 0, 0, + 516, 0, 0, 0, 517, 518, 519, 520, 521, 522, + 523, 0, 0, 0, 0, 0, 0, 524, 525, 0, + 526, 527, 528, 0, 0, 529, 0, 159, 1529, 160, + 161, 162, 163, 164, 165, 871, 872, 166, 0, 0, + 0, 167, 0, 0, 168, 0, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 0, 178, 0, 0, 0, + 179, 0, 0, 0, 180, 0, 0, 181, 182, 183, + 0, 184, 0, 185, 186, 0, 0, 187, 0, 0, + 188, 189, 0, 190, 191, 0, 192, 193, 0, 194, + 195, 196, 197, 198, 199, 0, 200, 201, 202, 203, + 204, 205, 206, 0, 207, 208, 209, 210, 211, 212, + 213, 214, 0, 215, 216, 0, 217, 218, 219, 220, + 221, 0, 222, 0, 0, 223, 873, 0, 224, 0, + 225, 0, 874, 226, 0, 227, 0, 0, 0, 228, + 229, 230, 0, 0, 231, 0, 0, 0, 0, 232, + 233, 0, 0, 0, 0, 234, 0, 235, 875, 0, + 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, + 0, 0, 0, 242, 876, 0, 243, 244, 245, 0, + 0, 0, 246, 0, 247, 248, 0, 249, 250, 251, + 0, 252, 253, 0, 254, 255, 877, 257, 258, 259, + 878, 0, 0, 261, 262, 263, 264, 0, 0, 265, + 266, 0, 879, 268, 269, 0, 0, 270, 0, 0, + 0, 271, 272, 0, 273, 0, 274, 0, 275, 276, + 277, 278, 279, 280, 281, 880, 282, 0, 0, 283, + 284, 285, 0, 286, 0, 0, 0, 287, 288, 0, + 0, 0, 289, 290, 291, 292, 293, 0, 0, 0, + 294, 295, 296, 881, 0, 297, 0, 0, 0, 882, + 298, 299, 0, 0, 0, 300, 0, 301, 302, 0, + 303, 304, 0, 0, 0, 305, 0, 0, 306, 307, + 308, 0, 0, 309, 0, 0, 310, 311, 665, 0, + 0, 0, 0, 312, 313, 0, 314, 0, 315, 883, + 316, 317, 0, 0, 0, 0, 0, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 0, 334, 335, 336, 337, 0, + 338, 339, 340, 341, 0, 342, 343, 344, 0, 0, + 0, 0, 345, 346, 347, 348, 349, 350, 0, 0, + 351, 352, 0, 353, 0, 354, 0, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 0, 0, 365, + 0, 0, 366, 367, 368, 369, 0, 0, 0, 370, + 371, 0, 0, 0, 372, 0, 373, 374, 375, 0, + 376, 377, 378, 379, 0, 380, 381, 0, 0, 0, + 0, 0, 0, 0, 0, 382, 383, 384, 0, 0, + 385, 0, 386, 0, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 0, 397, 398, 399, 0, + 400, 0, 884, 402, 403, 404, 885, 0, 406, 407, + 408, 0, 0, 409, 0, 0, 0, 410, 411, 412, + 413, 414, 886, 0, 415, 416, 417, 418, 419, 0, + 887, 421, 0, 422, 423, 424, 0, 0, 888, 0, + 426, 0, 427, 428, 0, 429, 430, 0, 431, 0, + 432, 0, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 0, 445, 446, 889, 0, + 0, 447, 448, 449, 450, 0, 0, 0, 451, 0, + 0, 890, 891, 0, 453, 454, 455, 456, 457, 458, + 0, 459, 460, 461, 462, 463, 464, 0, 0, 0, + 0, 0, 0, 465, 466, 0, 467, 0, 0, 468, + 0, 0, 0, 469, 470, 471, 0, 0, 0, 472, + 0, 0, 473, 474, 0, 475, 476, 477, 478, 479, + 480, 0, 0, 892, 482, 483, 484, 0, 485, 486, + 0, 0, 487, 488, 489, 490, 0, 156, 491, 492, + 0, 493, 494, 495, 496, 0, 0, 0, 0, 0, + 497, 498, 499, 893, 0, 0, 500, 501, 502, 503, + 0, 504, 505, 0, 506, 507, 0, 508, 509, 0, + 0, 510, 0, 0, 511, 894, 512, 895, 513, 514, + 0, 0, 0, 0, 0, 0, 515, 0, 0, 516, + 0, 0, 0, 517, 518, 519, 520, 521, 522, 523, + 0, 0, 0, 0, 0, 0, 524, 525, 0, 526, + 527, 528, 0, 159, 529, 977, 161, 162, 163, 164, + 165, 978, 872, 166, 0, 0, 0, 167, 0, 0, + 168, 0, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 0, 178, 0, 0, 0, 179, 0, 0, 0, + 180, 0, 0, 181, 182, 183, 0, 184, 0, 185, + 186, 0, 0, 187, 0, 0, 188, 189, 0, 190, + 191, 0, 192, 193, 0, 194, 195, 196, 197, 198, + 199, 0, 200, 201, 202, 203, 204, 205, 206, 0, + 207, 208, 209, 210, 211, 212, 213, 214, 0, 215, + 216, 0, 217, 218, 219, 220, 221, 0, 222, 0, + 0, 223, 873, 0, 224, 0, 225, 0, 874, 226, + 0, 227, 0, 0, 0, 228, 229, 230, 0, 0, + 231, 0, 0, 0, 0, 232, 233, 0, 0, 0, + 0, 234, 0, 235, 875, 0, 0, 0, 236, 0, + 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, + 876, 0, 243, 244, 245, 0, 0, 0, 246, 0, + 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, + 254, 255, 877, 257, 258, 259, 878, 0, 0, 261, + 262, 263, 264, 0, 0, 265, 266, 0, 879, 268, + 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, + 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, + 281, 880, 282, 0, 0, 283, 284, 285, 0, 286, + 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, + 291, 292, 293, 0, 0, 0, 294, 295, 296, 881, + 0, 297, 0, 0, 0, 882, 298, 299, 0, 0, + 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, + 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, + 0, 0, 310, 311, 665, 0, 0, 0, 0, 312, + 313, 0, 314, 0, 315, 883, 316, 317, 0, 0, + 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, + 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, + 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, + 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, + 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, + 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, + 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, + 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 0, 0, 397, 398, 399, 0, 400, 0, 884, 402, + 403, 404, 979, 0, 406, 407, 408, 0, 0, 409, + 0, 0, 0, 410, 411, 412, 413, 414, 886, 0, + 415, 416, 417, 418, 419, 0, 887, 421, 0, 422, + 423, 424, 0, 0, 888, 0, 426, 0, 427, 428, + 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 0, 445, 446, 889, 0, 0, 447, 448, 449, + 450, 0, 0, 0, 451, 0, 0, 890, 891, 0, + 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, + 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, + 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, + 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, + 0, 475, 476, 477, 478, 479, 480, 0, 0, 892, + 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, + 489, 490, 0, 156, 491, 492, 0, 493, 494, 495, + 496, 0, 0, 0, 0, 0, 497, 498, 499, 893, + 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, + 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, + 511, 894, 512, 895, 513, 514, 0, 0, 0, 0, + 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, + 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, + 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, + 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, + 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, + 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, + 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, + 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, + 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, + 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, + 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, + 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, + 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, + 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, + 0, 232, 233, 2594, 0, 0, 0, 234, 0, 235, + 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, + 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, + 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, + 250, 251, 0, 252, 253, 0, 254, 255, 256, 257, + 258, 259, 260, 0, 0, 261, 262, 263, 264, 0, + 0, 265, 266, 0, 267, 268, 269, 2595, 0, 270, + 0, 0, 0, 271, 272, 0, 273, 0, 274, 0, + 275, 276, 277, 278, 279, 280, 281, 0, 282, 0, + 0, 283, 284, 285, 0, 286, 2596, 0, 0, 287, + 288, 0, 0, 0, 289, 290, 291, 292, 293, 0, + 0, 0, 294, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 298, 299, 0, 0, 0, 300, 0, 301, + 302, 0, 303, 304, 0, 0, 0, 305, 0, 0, + 306, 307, 308, 0, 0, 309, 0, 0, 310, 311, + 0, 0, 0, 0, 0, 312, 313, 0, 314, 0, + 315, 0, 316, 317, 0, 0, 2597, 0, 0, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, + 337, 0, 338, 339, 340, 341, 0, 342, 343, 344, + 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, + 0, 0, 351, 352, 0, 353, 0, 354, 0, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 0, + 0, 365, 0, 0, 366, 367, 368, 369, 152, 153, + 0, 370, 371, 0, 0, 2598, 372, 0, 373, 374, + 375, 0, 376, 377, 378, 379, 0, 380, 381, 0, + 0, 0, 0, 0, 0, 0, 0, 382, 383, 384, + 0, 0, 385, 0, 386, 0, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 0, 0, 397, 398, + 399, 0, 400, 0, 401, 402, 403, 404, 405, 0, + 406, 407, 408, 0, 0, 409, 0, 0, 0, 410, + 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, + 419, 0, 420, 421, 0, 422, 423, 424, 0, 0, + 425, 0, 426, 0, 427, 428, 0, 429, 430, 0, + 431, 0, 432, 0, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 0, 445, 446, + 0, 0, 0, 447, 448, 449, 450, 0, 0, 0, + 451, 0, 0, 0, 452, 0, 453, 454, 455, 456, + 457, 458, 0, 459, 460, 461, 462, 463, 464, 0, + 0, 4430, 595, 4431, 0, 465, 466, 0, 467, 0, + 0, 468, 0, 0, 0, 469, 470, 471, 0, 0, + 0, 472, 0, 0, 473, 474, 0, 475, 476, 477, + 478, 479, 480, 0, 0, 481, 482, 483, 484, 0, + 485, 486, 0, 0, 487, 488, 489, 490, 0, 0, + 491, 492, 0, 493, 494, 495, 496, 0, 0, 0, + 0, 0, 497, 498, 499, 0, 0, 0, 500, 501, + 502, 503, 2599, 504, 505, 0, 506, 507, 0, 508, + 509, 0, 0, 510, 0, 0, 511, 0, 512, 0, + 513, 514, 0, 0, 0, 0, 0, 0, 515, 0, + 0, 516, 0, 0, 0, 517, 518, 519, 520, 521, + 522, 523, 0, 0, 0, 0, 0, 0, 524, 525, + 0, 526, 527, 528, 0, 159, 529, 160, 161, 162, + 163, 164, 165, 0, 0, 166, 0, 0, 0, 167, + 0, 0, 168, 0, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 0, 178, 0, 0, 0, 179, 0, + 0, 0, 180, 0, 0, 181, 182, 183, 0, 184, + 0, 185, 186, 0, 0, 187, 0, 0, 188, 189, + 0, 190, 191, 0, 192, 193, 0, 194, 195, 196, + 197, 198, 199, 0, 200, 201, 202, 203, 204, 205, + 206, 0, 207, 208, 209, 210, 211, 212, 213, 214, + 0, 215, 216, 0, 217, 218, 219, 220, 221, 0, + 222, 0, 0, 223, 0, 0, 224, 0, 225, 0, + 0, 226, 0, 227, 0, 0, 0, 228, 229, 230, + 0, 0, 231, 0, 0, 0, 0, 232, 233, 1774, + 0, 0, 3705, 234, 0, 235, 0, 0, 0, 0, + 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, + 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, + 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, + 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, + 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, + 267, 268, 269, 1775, 0, 270, 0, 0, 0, 271, + 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, + 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, + 0, 286, 3189, 0, 0, 287, 288, 0, 0, 0, + 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, + 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, + 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, + 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, + 0, 309, 0, 0, 310, 311, 0, 0, 0, 0, + 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, + 0, 0, 3190, 0, 0, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, + 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, + 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, + 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, + 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, + 0, 3191, 372, 0, 373, 374, 375, 0, 376, 377, + 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, + 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, + 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, + 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, + 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, + 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, + 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, + 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, + 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, + 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, + 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, + 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, + 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, + 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, + 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, + 487, 488, 489, 490, 0, 156, 491, 492, 0, 493, + 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, + 499, 0, 0, 0, 500, 501, 502, 503, 3192, 504, + 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, + 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, + 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, + 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, + 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, + 0, 159, 529, 160, 161, 162, 163, 164, 165, 0, + 0, 166, 0, 0, 0, 167, 0, 0, 168, 0, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 0, + 178, 0, 0, 0, 179, 0, 0, 0, 180, 0, + 0, 181, 182, 183, 0, 184, 0, 185, 186, 0, + 0, 187, 0, 0, 188, 189, 0, 190, 191, 0, + 192, 193, 0, 194, 195, 196, 197, 198, 199, 0, + 200, 201, 202, 203, 204, 205, 206, 0, 207, 208, + 209, 210, 211, 212, 213, 214, 0, 215, 216, 0, + 217, 218, 219, 220, 221, 0, 222, 0, 0, 223, + 0, 0, 224, 0, 225, 0, 0, 226, 0, 227, + 0, 0, 0, 228, 229, 230, 0, 0, 231, 0, + 0, 0, 0, 232, 233, 1774, 0, 0, 4669, 234, + 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, + 239, 240, 241, 0, 0, 0, 0, 242, 0, 0, + 243, 244, 245, 0, 0, 0, 246, 0, 247, 248, + 0, 249, 250, 251, 0, 252, 253, 0, 254, 255, + 256, 257, 258, 259, 260, 0, 0, 261, 262, 263, + 264, 0, 0, 265, 266, 0, 267, 268, 269, 1775, + 0, 270, 0, 0, 0, 271, 272, 0, 273, 0, + 274, 0, 275, 276, 277, 278, 279, 280, 281, 0, + 282, 0, 0, 283, 284, 285, 0, 286, 3189, 0, + 0, 287, 288, 0, 0, 0, 289, 290, 291, 292, + 293, 0, 0, 0, 294, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 298, 299, 0, 0, 0, 300, + 0, 301, 302, 0, 303, 304, 0, 0, 0, 305, + 0, 0, 306, 307, 308, 0, 0, 309, 0, 0, + 310, 311, 0, 0, 0, 0, 0, 312, 313, 0, + 314, 0, 315, 0, 316, 317, 0, 0, 3190, 0, + 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, + 335, 336, 337, 0, 338, 339, 340, 341, 0, 342, + 343, 344, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 0, 0, 351, 352, 0, 353, 0, 354, + 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 0, 0, 365, 0, 0, 366, 367, 368, 369, + 0, 0, 0, 370, 371, 0, 0, 3191, 372, 0, + 373, 374, 375, 0, 376, 377, 378, 379, 0, 380, + 381, 0, 0, 0, 0, 0, 0, 0, 0, 382, + 383, 384, 0, 0, 385, 0, 386, 0, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 0, 0, + 397, 398, 399, 0, 400, 0, 401, 402, 403, 404, + 405, 0, 406, 407, 408, 0, 0, 409, 0, 0, + 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, + 417, 418, 419, 0, 420, 421, 0, 422, 423, 424, + 0, 0, 425, 0, 426, 0, 427, 428, 0, 429, + 430, 0, 431, 0, 432, 0, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 0, + 445, 446, 0, 0, 0, 447, 448, 449, 450, 0, + 0, 0, 451, 0, 0, 0, 452, 0, 453, 454, + 455, 456, 457, 458, 0, 459, 460, 461, 462, 463, + 464, 0, 0, 0, 0, 0, 0, 465, 466, 0, + 467, 0, 0, 468, 0, 0, 0, 469, 470, 471, + 0, 0, 0, 472, 0, 0, 473, 474, 0, 475, + 476, 477, 478, 479, 480, 0, 0, 481, 482, 483, + 484, 0, 485, 486, 0, 0, 487, 488, 489, 490, + 0, 156, 491, 492, 0, 493, 494, 495, 496, 0, + 0, 0, 0, 0, 497, 498, 499, 0, 0, 0, + 500, 501, 502, 503, 3192, 504, 505, 0, 506, 507, + 0, 508, 509, 0, 0, 510, 0, 0, 511, 0, + 512, 0, 513, 514, 0, 0, 0, 0, 0, 0, + 515, 0, 0, 516, 0, 0, 0, 517, 518, 519, + 520, 521, 522, 523, 0, 0, 0, 0, 0, 0, + 524, 525, 0, 526, 527, 528, 0, 159, 529, 160, + 161, 162, 163, 164, 165, 0, 0, 166, 0, 0, + 0, 167, 0, 0, 168, 0, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 0, 178, 0, 0, 0, + 179, 0, 0, 0, 180, 0, 0, 181, 182, 183, + 0, 184, 0, 185, 186, 0, 0, 187, 0, 0, + 188, 189, 0, 190, 191, 0, 192, 193, 0, 194, + 195, 196, 197, 198, 199, 0, 200, 201, 202, 203, + 204, 205, 206, 0, 207, 208, 209, 210, 211, 212, + 213, 214, 0, 215, 216, 0, 217, 218, 219, 220, + 221, 0, 222, 0, 0, 223, 0, 0, 224, 0, + 225, 0, 0, 226, 0, 227, 0, 0, 0, 228, + 229, 230, 0, 0, 231, 0, 0, 0, 0, 232, + 233, 1774, 0, 0, 4738, 234, 0, 235, 0, 0, + 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, + 0, 0, 0, 242, 0, 0, 243, 244, 245, 0, + 0, 0, 246, 0, 247, 248, 0, 249, 250, 251, + 0, 252, 253, 0, 254, 255, 256, 257, 258, 259, + 260, 0, 0, 261, 262, 263, 264, 0, 0, 265, + 266, 0, 267, 268, 269, 1775, 0, 270, 0, 0, + 0, 271, 272, 0, 273, 0, 274, 0, 275, 276, + 277, 278, 279, 280, 281, 0, 282, 0, 0, 283, + 284, 285, 0, 286, 3189, 0, 0, 287, 288, 0, + 0, 0, 289, 290, 291, 292, 293, 0, 0, 0, + 294, 295, 296, 0, 0, 297, 0, 0, 0, 0, + 298, 299, 0, 0, 0, 300, 0, 301, 302, 0, + 303, 304, 0, 0, 0, 305, 0, 0, 306, 307, + 308, 0, 0, 309, 0, 0, 310, 311, 0, 0, + 0, 0, 0, 312, 313, 0, 314, 0, 315, 0, + 316, 317, 0, 0, 3190, 0, 0, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 0, 334, 335, 336, 337, 0, + 338, 339, 340, 341, 0, 342, 343, 344, 0, 0, + 0, 0, 345, 346, 347, 348, 349, 350, 0, 0, + 351, 352, 0, 353, 0, 354, 0, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 0, 0, 365, + 0, 0, 366, 367, 368, 369, 0, 0, 0, 370, + 371, 0, 0, 3191, 372, 0, 373, 374, 375, 0, + 376, 377, 378, 379, 0, 380, 381, 0, 0, 0, + 0, 0, 0, 0, 0, 382, 383, 384, 0, 0, + 385, 0, 386, 0, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 0, 397, 398, 399, 0, + 400, 0, 401, 402, 403, 404, 405, 0, 406, 407, + 408, 0, 0, 409, 0, 0, 0, 410, 411, 412, + 413, 414, 0, 0, 415, 416, 417, 418, 419, 0, + 420, 421, 0, 422, 423, 424, 0, 0, 425, 0, + 426, 0, 427, 428, 0, 429, 430, 0, 431, 0, + 432, 0, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 0, 445, 446, 0, 0, + 0, 447, 448, 449, 450, 0, 0, 0, 451, 0, + 0, 0, 452, 0, 453, 454, 455, 456, 457, 458, + 0, 459, 460, 461, 462, 463, 464, 0, 0, 0, + 0, 0, 0, 465, 466, 0, 467, 0, 0, 468, + 0, 0, 0, 469, 470, 471, 0, 0, 0, 472, + 0, 0, 473, 474, 0, 475, 476, 477, 478, 479, + 480, 0, 0, 481, 482, 483, 484, 0, 485, 486, + 0, 0, 487, 488, 489, 490, 0, 156, 491, 492, + 0, 493, 494, 495, 496, 0, 0, 0, 0, 0, + 497, 498, 499, 0, 0, 0, 500, 501, 502, 503, + 3192, 504, 505, 0, 506, 507, 0, 508, 509, 0, + 0, 510, 0, 0, 511, 0, 512, 0, 513, 514, + 0, 0, 0, 0, 0, 0, 515, 0, 0, 516, + 0, 0, 0, 517, 518, 519, 520, 521, 522, 523, + 0, 0, 0, 0, 0, 0, 524, 525, 0, 526, + 527, 528, 0, 159, 529, 160, 161, 162, 163, 164, + 165, 0, 0, 166, 0, 0, 0, 167, 0, 0, + 168, 0, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 0, 178, 0, 0, 0, 179, 0, 0, 0, + 180, 0, 0, 181, 182, 183, 0, 184, 0, 185, + 186, 0, 0, 187, 0, 0, 188, 189, 0, 190, + 191, 0, 192, 193, 0, 194, 195, 196, 197, 198, + 199, 0, 200, 201, 202, 203, 204, 205, 206, 0, + 207, 208, 209, 210, 211, 212, 213, 214, 0, 215, + 216, 0, 217, 218, 219, 220, 221, 0, 222, 0, + 0, 223, 0, 0, 224, 0, 225, 1122, 874, 226, + 0, 227, 0, 0, 0, 228, 229, 230, 0, 0, + 231, 0, 0, 0, 0, 232, 233, 0, 0, 0, + 0, 234, 0, 235, 0, 0, 0, 0, 236, 0, + 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, + 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, + 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, + 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, + 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, + 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, + 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, + 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, + 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, + 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, + 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, + 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, + 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, + 0, 0, 310, 311, 665, 0, 0, 0, 0, 312, + 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, + 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, + 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, + 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, + 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, + 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, + 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, + 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, + 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, + 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, + 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, + 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, + 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, + 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, + 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, + 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, + 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, + 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, + 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, + 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, + 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, + 489, 490, 0, 156, 491, 492, 0, 493, 494, 495, + 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, + 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, + 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, + 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, + 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, + 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, + 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, + 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, + 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, + 0, 1541, 179, 0, 0, 0, 180, 0, 0, 181, + 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, + 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, + 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, + 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, + 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, + 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, + 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, + 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, + 0, 232, 233, 0, 0, 0, 1542, 234, 0, 235, + 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, + 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, + 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, + 250, 251, 0, 252, 253, 0, 254, 255, 256, 257, + 258, 259, 260, 0, 0, 261, 262, 263, 264, 0, + 0, 265, 266, 0, 267, 268, 269, 0, 0, 270, + 0, 0, 0, 271, 272, 0, 273, 0, 274, 0, + 275, 276, 277, 278, 279, 280, 281, 0, 282, 0, + 0, 283, 284, 285, 0, 286, 0, 0, 0, 287, + 288, 0, 0, 0, 289, 290, 291, 292, 293, 0, + 0, 0, 294, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 298, 299, 0, 0, 0, 300, 0, 301, + 302, 0, 303, 304, 0, 0, 0, 305, 0, 0, + 306, 307, 308, 0, 0, 309, 0, 0, 310, 311, + 665, 0, 0, 0, 0, 312, 313, 0, 314, 0, + 315, 0, 316, 317, 0, 0, 0, 0, 0, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, + 337, 0, 338, 339, 340, 341, 0, 342, 343, 344, + 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, + 0, 0, 351, 352, 0, 353, 0, 354, 0, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 0, + 0, 365, 0, 0, 366, 367, 368, 369, 0, 0, + 0, 370, 371, 0, 0, 0, 372, 0, 373, 374, + 375, 0, 376, 377, 378, 379, 0, 380, 381, 0, + 0, 0, 0, 0, 0, 0, 0, 382, 383, 384, + 0, 0, 385, 0, 386, 0, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 0, 0, 397, 398, + 399, 0, 400, 0, 401, 402, 403, 404, 405, 0, + 406, 407, 408, 0, 0, 409, 0, 0, 0, 410, + 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, + 419, 0, 420, 421, 0, 422, 423, 424, 0, 0, + 425, 0, 426, 0, 427, 428, 0, 429, 430, 0, + 431, 0, 432, 0, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 0, 445, 446, + 0, 0, 0, 447, 448, 449, 450, 0, 0, 0, + 451, 0, 0, 0, 452, 0, 453, 454, 455, 456, + 457, 458, 0, 459, 460, 461, 462, 463, 464, 0, + 0, 0, 0, 0, 0, 465, 466, 0, 467, 0, + 0, 468, 0, 0, 0, 469, 470, 471, 0, 0, + 0, 472, 0, 0, 473, 474, 0, 475, 476, 477, + 478, 479, 480, 0, 0, 481, 482, 483, 484, 0, + 485, 486, 0, 0, 487, 488, 489, 490, 0, 156, + 491, 492, 0, 493, 494, 495, 496, 0, 0, 0, + 0, 0, 497, 498, 499, 0, 0, 0, 500, 501, + 502, 503, 0, 504, 505, 0, 506, 507, 0, 508, + 509, 0, 0, 510, 0, 0, 511, 0, 512, 0, + 513, 514, 0, 0, 0, 0, 0, 0, 515, 0, + 0, 516, 0, 0, 0, 517, 518, 519, 520, 521, + 522, 523, 0, 0, 0, 0, 0, 0, 524, 525, + 0, 526, 527, 528, 0, 159, 529, 160, 161, 162, + 163, 164, 165, 0, 0, 166, 0, 0, 0, 167, + 0, 0, 168, 0, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 0, 178, 0, 0, 0, 179, 1084, + 0, 0, 180, 0, 0, 181, 182, 183, 0, 184, + 0, 185, 186, 0, 0, 187, 0, 0, 188, 189, + 0, 190, 191, 0, 192, 193, 0, 194, 195, 196, + 197, 198, 199, 0, 200, 201, 202, 203, 204, 205, + 206, 0, 207, 208, 209, 210, 211, 212, 213, 214, + 0, 215, 216, 0, 217, 218, 219, 220, 221, 0, + 222, 0, 0, 223, 0, 0, 224, 0, 225, 0, + 0, 226, 0, 227, 0, 0, 0, 228, 229, 230, + 0, 0, 231, 0, 0, 0, 0, 232, 233, 0, + 0, 0, 0, 234, 0, 235, 0, 0, 0, 0, + 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, + 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, + 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, + 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, + 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, + 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, + 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, + 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, + 0, 286, 1085, 1086, 0, 287, 288, 0, 0, 0, + 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, + 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, + 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, + 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, + 0, 309, 0, 0, 310, 311, 0, 0, 0, 0, + 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, + 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, + 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, + 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, + 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, + 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, + 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, + 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, + 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, + 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, + 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, + 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, + 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, + 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, + 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, + 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, + 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, + 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, + 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, + 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, + 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, + 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, + 487, 488, 489, 490, 0, 1087, 491, 492, 0, 493, + 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, + 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, + 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, + 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, + 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, + 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, + 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, + 0, 159, 529, 160, 161, 162, 163, 164, 165, 0, + 0, 166, 0, 0, 0, 167, 0, 0, 168, 0, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 0, + 178, 0, 0, 0, 179, 0, 0, 0, 180, 0, + 0, 181, 182, 183, 0, 184, 0, 185, 186, 0, + 0, 187, 0, 0, 188, 189, 0, 190, 191, 0, + 192, 193, 0, 194, 195, 196, 197, 198, 199, 0, + 200, 201, 202, 203, 204, 205, 206, 0, 207, 208, + 209, 210, 211, 212, 213, 214, 0, 215, 216, 0, + 217, 218, 219, 220, 221, 0, 222, 0, 0, 223, + 0, 0, 224, 0, 225, 0, 0, 226, 0, 227, + 0, 0, 0, 228, 229, 230, 0, 0, 231, 0, + 0, 0, 0, 232, 233, 0, 0, 0, 0, 234, + 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, + 239, 240, 241, 0, 0, 0, 0, 242, 0, 0, + 243, 244, 245, 0, 0, 0, 246, 0, 247, 248, + 0, 249, 250, 251, 0, 252, 253, 0, 254, 255, + 256, 257, 258, 259, 260, 0, 0, 261, 262, 263, + 264, 0, 0, 265, 266, 0, 267, 268, 269, 0, + 0, 270, 0, 0, 0, 271, 272, 0, 273, 0, + 274, 0, 275, 276, 277, 278, 279, 280, 281, 0, + 282, 0, 0, 283, 284, 285, 0, 286, 0, 0, + 0, 287, 288, 0, 0, 0, 289, 290, 291, 292, + 293, 0, 0, 0, 294, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 298, 299, 0, 0, 0, 300, + 0, 301, 302, 0, 303, 304, 0, 0, 0, 305, + 0, 0, 306, 307, 308, 0, 0, 309, 0, 0, + 310, 311, 0, 0, 0, 0, 0, 312, 313, 0, + 314, 0, 315, 0, 316, 317, 0, 0, 2081, 0, + 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, + 335, 336, 337, 0, 338, 339, 340, 341, 0, 342, + 343, 344, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 0, 0, 351, 352, 0, 353, 0, 354, + 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 0, 0, 365, 0, 0, 366, 367, 368, 369, + 0, 0, 0, 370, 371, 0, 0, 2082, 372, 0, + 373, 374, 375, 0, 376, 377, 378, 379, 0, 380, + 381, 0, 0, 0, 0, 0, 0, 0, 0, 382, + 383, 384, 0, 783, 385, 0, 386, 0, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 0, 0, + 397, 398, 399, 0, 400, 0, 401, 402, 403, 404, + 405, 0, 406, 407, 408, 0, 0, 409, 0, 0, + 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, + 417, 418, 419, 0, 420, 421, 0, 422, 423, 424, + 0, 0, 425, 0, 426, 0, 427, 428, 0, 429, + 430, 0, 431, 0, 432, 0, 0, 433, 434, 435, + 436, 2083, 438, 439, 440, 441, 442, 443, 444, 0, + 445, 446, 0, 0, 0, 447, 448, 449, 450, 0, + 0, 0, 451, 0, 0, 0, 452, 0, 453, 454, + 455, 456, 457, 458, 0, 459, 460, 461, 462, 463, + 464, 0, 0, 0, 0, 0, 0, 465, 466, 0, + 467, 0, 0, 468, 0, 0, 0, 469, 470, 471, + 0, 0, 0, 472, 0, 0, 473, 474, 0, 475, + 476, 477, 478, 479, 480, 0, 0, 481, 482, 483, + 484, 0, 485, 486, 0, 0, 487, 488, 489, 490, + 0, 0, 491, 492, 0, 493, 494, 495, 496, 0, + 0, 0, 0, 0, 497, 498, 499, 0, 0, 0, + 500, 501, 502, 503, 2084, 504, 505, 0, 506, 507, + 0, 508, 509, 0, 0, 510, 0, 0, 511, 0, + 512, 0, 513, 514, 0, 0, 0, 0, 0, 0, + 515, 0, 0, 516, 0, 0, 0, 517, 518, 519, + 520, 521, 522, 523, 0, 0, 0, 0, 0, 0, + 524, 525, 0, 526, 527, 528, 0, 159, 529, 160, + 161, 162, 163, 164, 165, 0, 0, 166, 0, 0, + 0, 167, 0, 0, 168, 0, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 0, 178, 0, 0, 0, + 179, 0, 0, 0, 180, 0, 0, 181, 182, 183, + 0, 184, 0, 185, 186, 0, 0, 187, 0, 0, + 188, 189, 0, 190, 191, 0, 192, 193, 0, 194, + 195, 196, 197, 198, 199, 0, 200, 201, 202, 203, + 204, 205, 206, 0, 207, 208, 209, 210, 211, 212, + 213, 214, 0, 215, 216, 0, 217, 218, 219, 220, + 221, 0, 222, 0, 0, 223, 0, 0, 224, 0, + 225, 0, 0, 226, 0, 227, 0, 0, 0, 228, + 229, 230, 0, 0, 231, 0, 0, 0, 0, 232, + 233, 0, 0, 0, 0, 234, 0, 235, 0, 0, + 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, + 0, 0, 0, 242, 0, 0, 243, 244, 245, 0, + 0, 0, 246, 0, 247, 248, 0, 249, 250, 251, + 0, 252, 253, 0, 254, 255, 256, 257, 258, 259, + 260, 0, 0, 261, 262, 263, 264, 0, 0, 265, + 266, 0, 267, 268, 269, 0, 0, 270, 0, 0, + 0, 271, 272, 0, 273, 0, 274, 0, 275, 276, + 277, 278, 279, 280, 281, 0, 282, 0, 0, 283, + 284, 285, 0, 286, 0, 0, 0, 287, 288, 0, + 0, 0, 289, 290, 291, 292, 293, 0, 0, 0, + 294, 295, 296, 0, 0, 297, 0, 0, 0, 0, + 298, 299, 0, 0, 0, 300, 0, 301, 302, 0, + 303, 304, 0, 0, 0, 305, 0, 0, 306, 307, + 308, 0, 0, 309, 0, 0, 310, 311, 0, 0, + 0, 0, 0, 312, 313, 0, 314, 0, 315, 0, + 316, 317, 0, 0, 2081, 0, 0, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 0, 334, 335, 336, 337, 0, + 338, 339, 340, 341, 0, 342, 343, 344, 0, 0, + 0, 0, 345, 346, 347, 348, 349, 350, 0, 0, + 351, 352, 0, 353, 0, 354, 0, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 0, 0, 365, + 0, 0, 366, 367, 368, 369, 0, 0, 0, 370, + 371, 0, 0, 2082, 372, 0, 373, 374, 375, 0, + 376, 377, 378, 379, 0, 380, 381, 0, 0, 0, + 0, 0, 0, 0, 0, 382, 383, 384, 0, 783, + 385, 0, 386, 0, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 0, 397, 398, 399, 0, + 400, 0, 401, 402, 403, 404, 405, 0, 406, 407, + 408, 0, 0, 409, 0, 0, 0, 410, 411, 412, + 413, 414, 0, 0, 415, 416, 417, 418, 419, 0, + 420, 421, 0, 422, 423, 424, 0, 0, 425, 0, + 426, 0, 427, 428, 0, 429, 430, 0, 431, 0, + 432, 0, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 0, 445, 446, 0, 0, + 0, 447, 448, 449, 450, 0, 0, 0, 451, 0, + 0, 0, 452, 0, 453, 454, 455, 456, 457, 458, + 0, 459, 460, 461, 462, 463, 464, 0, 0, 0, + 0, 0, 0, 465, 466, 0, 467, 0, 0, 468, + 0, 0, 0, 469, 470, 471, 0, 0, 0, 472, + 0, 0, 473, 474, 0, 475, 476, 477, 478, 479, + 480, 0, 0, 481, 482, 483, 484, 0, 485, 486, + 0, 0, 487, 488, 489, 490, 0, 0, 491, 492, + 0, 493, 494, 495, 496, 0, 0, 0, 0, 0, + 497, 498, 499, 0, 0, 0, 500, 501, 502, 503, + 2084, 504, 505, 0, 506, 507, 0, 508, 509, 0, + 0, 510, 0, 0, 511, 0, 512, 0, 513, 514, + 0, 0, 0, 0, 0, 0, 515, 0, 0, 516, + 0, 0, 0, 517, 518, 519, 520, 521, 522, 523, + 0, 0, 0, 0, 0, 0, 524, 525, 0, 526, + 527, 528, 0, 159, 529, 160, 161, 162, 163, 164, + 165, 0, 0, 166, 0, 0, 0, 167, 0, 0, + 168, 0, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 0, 178, 0, 0, 1526, 179, 0, 0, 0, + 180, 0, 0, 181, 182, 183, 0, 184, 0, 185, + 186, 0, 0, 187, 0, 0, 188, 189, 0, 190, + 191, 0, 192, 193, 0, 194, 195, 196, 197, 198, + 199, 0, 200, 201, 202, 203, 204, 205, 206, 0, + 207, 208, 209, 210, 211, 212, 213, 214, 0, 215, + 216, 0, 217, 218, 219, 220, 221, 0, 222, 0, + 0, 223, 0, 0, 224, 0, 225, 0, 0, 226, + 0, 227, 0, 0, 0, 228, 229, 230, 0, 0, + 231, 0, 0, 0, 0, 232, 233, 0, 0, 0, + 1527, 234, 0, 235, 0, 0, 0, 0, 236, 0, + 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, + 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, + 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, + 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, + 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, + 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, + 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, + 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, + 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, + 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, + 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, + 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, + 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, + 0, 0, 310, 311, 665, 0, 0, 0, 0, 312, + 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, + 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, + 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, + 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, + 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, + 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, + 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, + 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, + 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, + 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, + 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, + 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, + 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, + 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, + 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, + 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, + 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, + 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, + 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, + 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, + 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, + 489, 490, 0, 156, 491, 492, 0, 493, 494, 495, + 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, + 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, + 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, + 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, + 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, + 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, + 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, + 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, + 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, + 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, + 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, + 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, + 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, + 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, + 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, + 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, + 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, + 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, + 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, + 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, + 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, + 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, + 250, 251, 0, 252, 253, 0, 254, 255, 256, 257, + 258, 259, 260, 0, 0, 261, 262, 263, 264, 0, + 0, 265, 266, 0, 267, 268, 269, 0, 0, 270, + 0, 0, 0, 271, 272, 0, 273, 0, 274, 0, + 275, 276, 277, 278, 279, 280, 281, 0, 282, 0, + 0, 283, 284, 285, 0, 286, 0, 0, 0, 287, + 288, 0, 0, 0, 289, 290, 291, 292, 293, 0, + 0, 0, 294, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 298, 299, 0, 0, 0, 300, 0, 301, + 302, 0, 303, 304, 0, 0, 0, 305, 0, 0, + 306, 307, 308, 0, 0, 309, 0, 0, 310, 311, + 0, 0, 0, 0, 0, 312, 313, 0, 314, 0, + 315, 0, 316, 317, 0, 0, 2081, 0, 0, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, + 337, 0, 338, 339, 340, 341, 0, 342, 343, 344, + 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, + 0, 0, 351, 352, 0, 353, 0, 354, 0, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 0, + 0, 365, 0, 0, 366, 367, 368, 369, 0, 0, + 0, 370, 371, 0, 0, 2082, 372, 0, 373, 374, + 375, 0, 376, 377, 378, 379, 0, 380, 381, 0, + 0, 0, 0, 0, 0, 0, 0, 382, 383, 384, + 0, 783, 385, 0, 386, 0, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 0, 0, 397, 398, + 399, 0, 400, 0, 401, 402, 403, 404, 405, 0, + 406, 407, 408, 0, 0, 409, 0, 0, 0, 410, + 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, + 419, 0, 420, 421, 0, 422, 423, 424, 0, 0, + 425, 0, 426, 0, 427, 428, 0, 429, 430, 0, + 431, 0, 432, 0, 0, 433, 434, 435, 436, 4263, + 438, 439, 440, 441, 442, 443, 444, 0, 445, 446, + 0, 0, 0, 447, 448, 449, 450, 0, 0, 0, + 451, 0, 0, 0, 452, 0, 453, 454, 455, 456, + 457, 458, 0, 459, 460, 461, 462, 463, 464, 0, + 0, 0, 0, 0, 0, 465, 466, 0, 467, 0, + 0, 468, 0, 0, 0, 469, 470, 471, 0, 0, + 0, 472, 0, 0, 473, 474, 0, 475, 476, 477, + 478, 479, 480, 0, 0, 481, 482, 483, 484, 0, + 485, 486, 0, 0, 487, 488, 489, 490, 0, 0, + 491, 492, 0, 493, 494, 495, 496, 0, 0, 0, + 0, 0, 497, 498, 499, 0, 0, 0, 500, 501, + 502, 503, 2084, 504, 505, 0, 506, 507, 0, 508, + 509, 0, 0, 510, 0, 0, 511, 0, 512, 0, + 513, 514, 0, 0, 0, 0, 0, 0, 515, 0, + 0, 516, 0, 0, 0, 517, 518, 519, 520, 521, + 522, 523, 0, 0, 0, 0, 0, 0, 524, 525, + 0, 526, 527, 528, 0, 159, 529, 160, 161, 162, + 163, 164, 165, 0, 0, 166, 0, 0, 0, 167, + 0, 0, 168, 0, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 0, 178, 0, 0, 0, 179, 0, + 0, 0, 180, 0, 0, 181, 182, 183, 0, 184, + 0, 185, 186, 0, 0, 187, 0, 0, 188, 189, + 0, 190, 191, 0, 192, 193, 0, 194, 195, 196, + 197, 198, 199, 0, 200, 201, 202, 203, 204, 205, + 206, 0, 207, 208, 209, 210, 211, 212, 213, 214, + 0, 215, 216, 0, 217, 218, 219, 220, 221, 0, + 222, 0, 0, 223, 0, 0, 224, 0, 225, 1122, + 0, 226, 0, 227, 0, 0, 0, 228, 229, 230, + 0, 0, 231, 0, 0, 0, 0, 232, 233, 0, + 0, 0, 0, 234, 0, 235, 0, 0, 0, 0, + 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, + 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, + 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, + 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, + 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, + 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, + 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, + 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, + 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, + 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, + 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, + 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, + 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, + 0, 309, 0, 0, 310, 311, 665, 0, 0, 0, + 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, + 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, + 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, + 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, + 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, + 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, + 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, + 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, + 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, + 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, + 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, + 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, + 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, + 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, + 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, + 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, + 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, + 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, + 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, + 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, + 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, + 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, + 487, 488, 489, 490, 0, 156, 491, 492, 0, 493, + 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, + 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, + 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, + 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, + 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, + 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, + 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, + 0, 159, 529, 160, 161, 162, 163, 164, 165, 1564, + 0, 166, 0, 0, 0, 167, 0, 0, 168, 0, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 0, + 178, 0, 0, 0, 179, 0, 0, 0, 180, 0, + 0, 181, 182, 183, 0, 184, 0, 185, 186, 0, + 0, 187, 0, 0, 188, 189, 0, 190, 191, 0, + 192, 193, 0, 194, 195, 196, 197, 198, 199, 0, + 200, 201, 202, 203, 204, 205, 206, 0, 207, 208, + 209, 210, 211, 212, 213, 214, 0, 215, 216, 0, + 217, 218, 219, 220, 221, 0, 222, 0, 0, 223, + 0, 0, 224, 0, 225, 0, 0, 226, 0, 227, + 0, 0, 0, 228, 229, 230, 0, 0, 231, 0, + 0, 0, 0, 232, 233, 0, 0, 0, 0, 234, + 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, + 239, 240, 241, 0, 0, 0, 0, 242, 0, 0, + 243, 244, 245, 0, 0, 0, 246, 0, 247, 248, + 0, 249, 250, 251, 0, 252, 253, 0, 254, 255, + 256, 257, 258, 259, 260, 0, 0, 261, 262, 263, + 264, 0, 0, 265, 266, 0, 267, 268, 269, 0, + 0, 270, 0, 0, 0, 271, 272, 0, 273, 0, + 274, 0, 275, 276, 277, 278, 279, 280, 281, 0, + 282, 0, 0, 283, 284, 285, 0, 286, 0, 0, + 0, 287, 288, 0, 0, 0, 289, 290, 291, 292, + 293, 0, 0, 0, 294, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 298, 299, 0, 0, 0, 300, + 0, 301, 302, 0, 303, 304, 0, 0, 0, 305, + 0, 0, 306, 307, 308, 0, 0, 309, 0, 0, + 310, 311, 665, 0, 0, 0, 0, 312, 313, 0, + 314, 0, 315, 0, 316, 317, 0, 0, 0, 0, + 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, + 335, 336, 337, 0, 338, 339, 340, 341, 0, 342, + 343, 344, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 0, 0, 351, 352, 0, 353, 0, 354, + 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 0, 0, 365, 0, 0, 366, 367, 368, 369, + 0, 0, 0, 370, 371, 0, 0, 0, 372, 0, + 373, 374, 375, 0, 376, 377, 378, 379, 0, 380, + 381, 0, 0, 0, 0, 0, 0, 0, 0, 382, + 383, 384, 0, 0, 385, 0, 386, 0, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 0, 0, + 397, 398, 399, 0, 400, 0, 401, 402, 403, 404, + 405, 0, 406, 407, 408, 0, 0, 409, 0, 0, + 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, + 417, 418, 419, 0, 420, 421, 0, 422, 423, 424, + 0, 0, 425, 0, 426, 0, 427, 428, 0, 429, + 430, 0, 431, 0, 432, 0, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 0, + 445, 446, 0, 0, 0, 447, 448, 449, 450, 0, + 0, 0, 451, 0, 0, 0, 452, 0, 453, 454, + 455, 456, 457, 458, 0, 459, 460, 461, 462, 463, + 464, 0, 0, 0, 0, 0, 0, 465, 466, 0, + 467, 0, 0, 468, 0, 0, 0, 469, 470, 471, + 0, 0, 0, 472, 0, 0, 473, 474, 0, 475, + 476, 477, 478, 479, 480, 0, 0, 481, 482, 483, + 484, 0, 485, 486, 0, 0, 487, 488, 489, 490, + 0, 156, 491, 492, 0, 493, 494, 495, 496, 0, + 0, 0, 0, 0, 497, 498, 499, 0, 0, 0, + 500, 501, 502, 503, 0, 504, 505, 0, 506, 507, + 0, 508, 509, 0, 0, 510, 0, 0, 511, 0, + 512, 0, 513, 514, 0, 0, 0, 0, 0, 0, + 515, 0, 0, 516, 0, 0, 0, 517, 518, 519, + 520, 521, 522, 523, 0, 0, 0, 0, 0, 0, + 524, 525, 0, 526, 527, 528, 0, 159, 529, 160, + 161, 162, 163, 164, 165, 0, 0, 166, 0, 0, + 0, 167, 0, 0, 168, 0, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 0, 178, 0, 0, 0, + 179, 0, 0, 0, 180, 0, 0, 181, 182, 183, + 0, 184, 0, 185, 186, 0, 0, 187, 0, 0, + 188, 189, 0, 190, 191, 0, 192, 193, 0, 194, + 195, 196, 197, 198, 199, 0, 200, 201, 202, 203, + 204, 205, 206, 0, 207, 208, 209, 210, 211, 212, + 213, 214, 0, 215, 216, 0, 217, 218, 219, 220, + 221, 0, 222, 0, 0, 223, 0, 0, 224, 0, + 225, 0, 874, 226, 0, 227, 0, 0, 0, 228, + 229, 230, 0, 0, 231, 0, 0, 0, 0, 232, + 233, 0, 0, 0, 0, 234, 0, 235, 0, 0, + 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, + 0, 0, 0, 242, 0, 0, 243, 244, 245, 0, + 0, 0, 246, 0, 247, 248, 0, 249, 250, 251, + 0, 252, 253, 0, 254, 255, 256, 257, 258, 259, + 260, 0, 0, 261, 262, 263, 264, 0, 0, 265, + 266, 0, 267, 268, 269, 0, 0, 270, 0, 0, + 0, 271, 272, 0, 273, 0, 274, 0, 275, 276, + 277, 278, 279, 280, 281, 0, 282, 0, 0, 283, + 284, 285, 0, 286, 0, 0, 0, 287, 288, 0, + 0, 0, 289, 290, 291, 292, 293, 0, 0, 0, + 294, 295, 296, 0, 0, 297, 0, 0, 0, 0, + 298, 299, 0, 0, 0, 300, 0, 301, 302, 0, + 303, 304, 0, 0, 0, 305, 0, 0, 306, 307, + 308, 0, 0, 309, 0, 0, 310, 311, 665, 0, + 0, 0, 0, 312, 313, 0, 314, 0, 315, 0, + 316, 317, 0, 0, 0, 0, 0, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 0, 334, 335, 336, 337, 0, + 338, 339, 340, 341, 0, 342, 343, 344, 0, 0, + 0, 0, 345, 346, 347, 348, 349, 350, 0, 0, + 351, 352, 0, 353, 0, 354, 0, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 0, 0, 365, + 0, 0, 366, 367, 368, 369, 0, 0, 0, 370, + 371, 0, 0, 0, 372, 0, 373, 374, 375, 0, + 376, 377, 378, 379, 0, 380, 381, 0, 0, 0, + 0, 0, 0, 0, 0, 382, 383, 384, 0, 0, + 385, 0, 386, 0, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 0, 397, 398, 399, 0, + 400, 0, 401, 402, 403, 404, 405, 0, 406, 407, + 408, 0, 0, 409, 0, 0, 0, 410, 411, 412, + 413, 414, 0, 0, 415, 416, 417, 418, 419, 0, + 420, 421, 0, 422, 423, 424, 0, 0, 425, 0, + 426, 0, 427, 428, 0, 429, 430, 0, 431, 0, + 432, 0, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 0, 445, 446, 0, 0, + 0, 447, 448, 449, 450, 0, 0, 0, 451, 0, + 0, 0, 452, 0, 453, 454, 455, 456, 457, 458, + 0, 459, 460, 461, 462, 463, 464, 0, 0, 0, + 0, 0, 0, 465, 466, 0, 467, 0, 0, 468, + 0, 0, 0, 469, 470, 471, 0, 0, 0, 472, + 0, 0, 473, 474, 0, 475, 476, 477, 478, 479, + 480, 0, 0, 481, 482, 483, 484, 0, 485, 486, + 0, 0, 487, 488, 489, 490, 0, 156, 491, 492, + 0, 493, 494, 495, 496, 0, 0, 0, 0, 0, + 497, 498, 499, 0, 0, 0, 500, 501, 502, 503, + 0, 504, 505, 0, 506, 507, 0, 508, 509, 0, + 0, 510, 0, 0, 511, 0, 512, 0, 513, 514, + 0, 0, 0, 0, 0, 0, 515, 0, 0, 516, + 0, 0, 0, 517, 518, 519, 520, 521, 522, 523, + 0, 0, 0, 0, 0, 0, 524, 525, 0, 526, + 527, 528, 0, 159, 529, 160, 161, 162, 163, 164, + 165, 0, 0, 166, 0, 0, 0, 167, 0, 0, + 168, 0, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 0, 178, 0, 0, 0, 179, 0, 0, 0, + 180, 0, 0, 181, 182, 183, 0, 184, 0, 185, + 186, 0, 0, 187, 0, 0, 188, 189, 0, 190, + 191, 0, 192, 193, 0, 194, 195, 196, 197, 198, + 199, 0, 200, 201, 202, 203, 204, 205, 206, 0, + 207, 208, 209, 210, 211, 212, 213, 214, 0, 215, + 216, 0, 217, 218, 219, 220, 221, 0, 222, 0, + 0, 223, 0, 0, 224, 0, 225, 0, 0, 226, + 0, 227, 0, 0, 0, 228, 229, 230, 0, 0, + 231, 0, 0, 0, 0, 232, 233, 0, 0, 0, + 2654, 234, 0, 235, 0, 0, 0, 0, 236, 0, + 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, + 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, + 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, + 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, + 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, + 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, + 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, + 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, + 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, + 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, + 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, + 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, + 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, + 0, 0, 310, 311, 665, 0, 0, 0, 0, 312, + 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, + 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, + 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, + 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, + 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, + 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, + 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, + 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, + 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, + 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, + 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, + 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, + 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, + 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, + 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, + 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, + 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, + 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, + 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, + 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, + 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, + 489, 490, 0, 156, 491, 492, 0, 493, 494, 495, + 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, + 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, + 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, + 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, + 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, + 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, + 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, + 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, + 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, + 0, 1526, 179, 0, 0, 0, 180, 0, 0, 181, + 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, + 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, + 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, + 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, + 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, + 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, + 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, + 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, + 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, + 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, + 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, + 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, + 250, 251, 0, 252, 253, 0, 254, 255, 256, 257, + 258, 259, 260, 0, 0, 261, 262, 263, 264, 0, + 0, 265, 266, 0, 267, 268, 269, 0, 0, 270, + 0, 0, 0, 271, 272, 0, 273, 0, 274, 0, + 275, 276, 277, 278, 279, 280, 281, 0, 282, 0, + 0, 283, 284, 285, 0, 286, 0, 0, 0, 287, + 288, 0, 0, 0, 289, 290, 291, 292, 293, 0, + 0, 0, 294, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 298, 299, 0, 0, 0, 300, 0, 301, + 302, 0, 303, 304, 0, 0, 0, 305, 0, 0, + 306, 307, 308, 0, 0, 309, 0, 0, 310, 311, + 665, 0, 0, 0, 0, 312, 313, 0, 314, 0, + 315, 0, 316, 317, 0, 0, 0, 0, 0, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, + 337, 0, 338, 339, 340, 341, 0, 342, 343, 344, + 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, + 0, 0, 351, 352, 0, 353, 0, 354, 0, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 0, + 0, 365, 0, 0, 366, 367, 368, 369, 0, 0, + 0, 370, 371, 0, 0, 0, 372, 0, 373, 374, + 375, 0, 376, 377, 378, 379, 0, 380, 381, 0, + 0, 0, 0, 0, 0, 0, 0, 382, 383, 384, + 0, 0, 385, 0, 386, 0, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 0, 0, 397, 398, + 399, 0, 400, 0, 401, 402, 403, 404, 405, 0, + 406, 407, 408, 0, 0, 409, 0, 0, 0, 410, + 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, + 419, 0, 420, 421, 0, 422, 423, 424, 0, 0, + 425, 0, 426, 0, 427, 428, 0, 429, 430, 0, + 431, 0, 432, 0, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 0, 445, 446, + 0, 0, 0, 447, 448, 449, 450, 0, 0, 0, + 451, 0, 0, 0, 452, 0, 453, 454, 455, 456, + 457, 458, 0, 459, 460, 461, 462, 463, 464, 0, + 0, 0, 0, 0, 0, 465, 466, 0, 467, 0, + 0, 468, 0, 0, 0, 469, 470, 471, 0, 0, + 0, 472, 0, 0, 473, 474, 0, 475, 476, 477, + 478, 479, 480, 0, 0, 481, 482, 483, 484, 0, + 485, 486, 0, 0, 487, 488, 489, 490, 0, 156, + 491, 492, 0, 493, 494, 495, 496, 0, 0, 0, + 0, 0, 497, 498, 499, 0, 0, 0, 500, 501, + 502, 503, 0, 504, 505, 0, 506, 507, 0, 508, + 509, 0, 0, 510, 0, 0, 511, 0, 512, 0, + 513, 514, 0, 0, 0, 0, 0, 0, 515, 0, + 0, 516, 0, 0, 0, 517, 518, 519, 520, 521, + 522, 523, 0, 0, 0, 0, 0, 0, 524, 525, + 0, 526, 527, 528, 0, 159, 529, 160, 161, 162, + 163, 164, 165, 0, 0, 166, 0, 0, 0, 167, + 0, 0, 168, 0, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 0, 178, 0, 0, 0, 179, 0, + 0, 0, 180, 0, 0, 181, 182, 183, 0, 184, + 0, 185, 186, 0, 0, 187, 0, 0, 188, 189, + 0, 190, 191, 0, 192, 193, 0, 194, 195, 196, + 197, 198, 199, 0, 200, 201, 202, 203, 204, 205, + 206, 0, 207, 208, 209, 210, 211, 212, 213, 214, + 0, 215, 216, 0, 217, 218, 219, 220, 221, 0, + 222, 0, 0, 223, 0, 0, 224, 0, 225, 0, + 0, 226, 0, 227, 0, 0, 0, 228, 229, 230, + 0, 0, 231, 0, 0, 0, 0, 232, 233, 0, + 0, 0, 0, 234, 0, 235, 0, 0, 0, 0, + 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, + 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, + 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, + 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, + 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, + 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, + 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, + 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, + 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, + 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, + 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, + 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, + 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, + 0, 309, 0, 0, 310, 311, 665, 0, 0, 0, + 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, + 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, + 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, + 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, + 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, + 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, + 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, + 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, + 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, + 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, + 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, + 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, + 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, + 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, + 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, + 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, + 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, + 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, + 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, + 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, + 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, + 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, + 487, 488, 489, 490, 0, 156, 491, 492, 0, 493, + 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, + 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, + 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, + 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, + 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, + 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, + 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, + 0, 159, 529, 160, 161, 162, 163, 164, 165, 0, + 0, 166, 0, 0, 0, 167, 3115, 0, 168, 0, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 0, + 178, 0, 0, 0, 179, 0, 0, 0, 180, 0, + 0, 181, 182, 183, 0, 184, 0, 185, 186, 0, + 0, 187, 0, 0, 188, 189, 0, 190, 191, 0, + 192, 193, 0, 194, 195, 196, 197, 198, 199, 0, + 200, 201, 202, 203, 204, 205, 206, 0, 207, 208, + 209, 210, 211, 212, 213, 214, 0, 215, 216, 0, + 217, 218, 219, 220, 221, 0, 222, 0, 0, 223, + 0, 0, 224, 0, 225, 0, 0, 226, 0, 227, + 0, 0, 0, 228, 229, 230, 0, 0, 231, 0, + 0, 0, 0, 232, 233, 0, 0, 0, 0, 234, + 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, + 239, 240, 241, 0, 0, 0, 0, 242, 0, 0, + 243, 244, 245, 0, 0, 0, 246, 0, 247, 248, + 0, 249, 250, 251, 0, 252, 253, 0, 254, 255, + 256, 257, 258, 259, 260, 0, 0, 261, 262, 263, + 264, 0, 0, 265, 266, 0, 267, 268, 269, 0, + 0, 270, 0, 0, 0, 271, 272, 0, 273, 0, + 274, 0, 275, 276, 277, 278, 279, 280, 281, 0, + 282, 0, 0, 283, 284, 285, 0, 286, 0, 0, + 0, 287, 288, 0, 0, 0, 289, 290, 291, 292, + 293, 0, 0, 0, 294, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 298, 299, 0, 0, 0, 300, + 0, 301, 302, 0, 303, 304, 0, 0, 0, 305, + 0, 0, 306, 307, 308, 0, 0, 309, 0, 0, + 310, 311, 0, 0, 0, 0, 0, 312, 313, 0, + 314, 0, 315, 0, 316, 317, 0, 0, 0, 0, + 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, + 335, 336, 337, 0, 338, 339, 340, 341, 0, 342, + 343, 344, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 0, 0, 351, 352, 0, 353, 0, 354, + 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 0, 0, 365, 0, 0, 366, 367, 368, 369, + 0, 0, 0, 370, 371, 0, 0, 0, 372, 0, + 373, 374, 375, 0, 376, 377, 378, 379, 0, 380, + 381, 0, 0, 0, 0, 0, 0, 0, 0, 382, + 383, 384, 0, 0, 385, 0, 386, 0, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 0, 0, + 397, 398, 399, 0, 400, 0, 401, 402, 403, 404, + 405, 0, 406, 407, 408, 0, 0, 409, 0, 0, + 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, + 417, 418, 419, 0, 420, 421, 0, 422, 423, 424, + 0, 0, 425, 0, 426, 0, 427, 428, 0, 429, + 430, 0, 431, 0, 432, 0, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 0, + 445, 446, 0, 0, 0, 447, 448, 449, 450, 0, + 0, 0, 451, 0, 0, 0, 452, 0, 453, 454, + 455, 456, 457, 458, 0, 459, 460, 461, 462, 463, + 464, 0, 0, 0, 0, 0, 0, 465, 466, 0, + 467, 0, 0, 468, 0, 0, 0, 469, 470, 471, + 0, 0, 0, 472, 0, 0, 473, 474, 0, 475, + 476, 477, 478, 479, 480, 0, 0, 481, 482, 483, + 484, 0, 485, 486, 0, 0, 487, 488, 489, 490, + 0, 156, 491, 492, 0, 493, 494, 495, 496, 0, + 0, 0, 0, 0, 497, 498, 499, 0, 0, 0, + 500, 501, 502, 503, 0, 504, 505, 0, 506, 507, + 0, 508, 509, 0, 0, 510, 0, 0, 511, 0, + 512, 0, 513, 514, 0, 0, 0, 0, 0, 0, + 515, 0, 0, 516, 0, 0, 0, 517, 518, 519, + 520, 521, 522, 523, 0, 0, 0, 0, 0, 0, + 524, 525, 0, 526, 527, 528, 0, 159, 529, 160, + 161, 162, 163, 164, 165, 0, 0, 166, 0, 0, + 0, 167, 0, 0, 168, 0, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 0, 178, 0, 0, 0, + 179, 0, 0, 0, 180, 0, 0, 181, 182, 183, + 0, 184, 0, 185, 186, 0, 0, 187, 0, 0, + 188, 189, 0, 190, 191, 0, 192, 193, 0, 194, + 195, 196, 197, 198, 199, 0, 200, 201, 202, 203, + 204, 205, 206, 0, 207, 208, 209, 210, 211, 212, + 213, 214, 0, 215, 216, 0, 217, 218, 219, 220, + 221, 3299, 222, 0, 0, 223, 0, 0, 224, 0, + 225, 0, 0, 226, 0, 227, 0, 0, 0, 228, + 229, 230, 0, 0, 231, 0, 0, 0, 0, 232, + 233, 0, 0, 0, 0, 234, 0, 235, 0, 0, + 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, + 0, 0, 0, 242, 0, 0, 243, 244, 245, 0, + 0, 0, 246, 0, 247, 248, 0, 249, 250, 251, + 0, 252, 253, 0, 254, 255, 256, 257, 258, 259, + 260, 0, 3300, 261, 262, 263, 264, 0, 0, 265, + 266, 0, 267, 268, 269, 0, 0, 270, 0, 0, + 0, 271, 272, 0, 273, 0, 274, 0, 275, 276, + 277, 278, 279, 280, 281, 0, 282, 0, 0, 283, + 284, 285, 0, 286, 0, 0, 0, 287, 288, 0, + 0, 0, 289, 290, 291, 292, 293, 0, 0, 0, + 294, 295, 296, 0, 0, 297, 0, 0, 0, 0, + 298, 299, 0, 0, 0, 300, 0, 301, 302, 0, + 303, 304, 0, 0, 0, 305, 0, 0, 306, 307, + 308, 0, 0, 309, 0, 0, 310, 311, 0, 0, + 0, 0, 0, 312, 313, 0, 314, 0, 315, 0, + 316, 317, 0, 0, 0, 0, 0, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 0, 334, 335, 336, 337, 0, + 338, 339, 340, 341, 0, 342, 343, 344, 0, 0, + 0, 0, 345, 346, 347, 348, 349, 350, 0, 0, + 351, 352, 0, 353, 0, 354, 0, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 0, 0, 365, + 0, 0, 366, 367, 368, 369, 0, 0, 0, 370, + 371, 0, 0, 0, 372, 0, 373, 374, 375, 0, + 376, 377, 378, 379, 0, 380, 381, 0, 0, 0, + 0, 0, 0, 0, 0, 382, 383, 384, 0, 0, + 385, 0, 386, 0, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 0, 397, 398, 399, 0, + 400, 0, 401, 402, 403, 404, 405, 0, 406, 407, + 408, 0, 0, 409, 0, 0, 0, 410, 411, 412, + 413, 414, 0, 0, 415, 416, 417, 418, 419, 0, + 420, 421, 0, 422, 423, 424, 0, 0, 425, 0, + 426, 0, 427, 428, 0, 429, 430, 0, 431, 0, + 432, 0, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 0, 445, 446, 0, 0, + 0, 447, 448, 449, 450, 0, 0, 0, 451, 0, + 0, 0, 452, 0, 453, 454, 455, 456, 457, 458, + 0, 459, 460, 461, 462, 463, 464, 0, 0, 0, + 0, 0, 0, 465, 466, 0, 467, 0, 0, 468, + 0, 0, 0, 469, 470, 471, 0, 0, 0, 472, + 0, 0, 473, 474, 0, 475, 476, 477, 478, 479, + 480, 0, 0, 481, 482, 483, 484, 0, 485, 486, + 0, 0, 487, 488, 489, 490, 0, 0, 491, 492, + 0, 493, 494, 495, 496, 0, 0, 0, 0, 0, + 497, 498, 499, 0, 0, 0, 500, 501, 502, 503, + 0, 504, 505, 0, 506, 507, 0, 508, 509, 0, + 0, 510, 0, 0, 511, 0, 512, 0, 513, 514, + 0, 0, 0, 0, 0, 0, 515, 0, 0, 516, + 0, 0, 0, 517, 518, 519, 520, 521, 522, 523, + 0, 0, 0, 0, 0, 0, 524, 525, 0, 526, + 527, 528, 0, 159, 529, 160, 161, 162, 163, 164, + 165, 0, 0, 166, 0, 0, 0, 167, 0, 0, + 168, 0, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 0, 178, 0, 0, 0, 179, 0, 0, 0, + 180, 0, 0, 181, 182, 183, 0, 184, 0, 185, + 186, 0, 0, 187, 0, 0, 188, 189, 0, 190, + 191, 0, 192, 193, 0, 194, 195, 196, 197, 198, + 199, 0, 200, 201, 202, 203, 204, 205, 206, 0, + 207, 208, 209, 210, 211, 212, 213, 214, 0, 215, + 216, 0, 217, 218, 219, 220, 221, 0, 222, 0, + 0, 223, 0, 0, 224, 0, 225, 0, 0, 226, + 0, 227, 0, 0, 0, 228, 229, 230, 0, 0, + 231, 0, 0, 0, 0, 232, 233, 0, 0, 0, + 0, 234, 0, 235, 0, 0, 0, 0, 236, 0, + 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, + 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, + 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, + 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, + 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, + 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, + 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, + 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, + 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, + 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, + 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, + 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, + 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, + 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, + 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, + 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, + 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, + 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, + 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, + 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, + 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, + 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, + 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 0, 0, 397, 398, 399, 0, 400, 0, 401, 402, + 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, + 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, + 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, + 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, + 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, + 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, + 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, + 462, 463, 464, 0, 0, 0, 595, 0, 0, 465, + 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, + 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, + 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, + 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, + 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, + 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, + 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, + 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, + 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, + 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, + 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, + 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, + 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, + 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, + 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, + 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, + 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, + 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, + 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, + 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, + 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, + 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, + 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, + 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, + 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, + 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, + 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, + 250, 251, 0, 252, 253, 0, 254, 255, 256, 257, + 258, 259, 260, 0, 0, 261, 262, 263, 264, 0, + 0, 265, 266, 0, 267, 268, 269, 0, 0, 270, + 0, 0, 0, 271, 272, 1181, 273, 0, 274, 0, + 275, 276, 277, 278, 279, 280, 281, 0, 282, 0, + 0, 283, 284, 285, 0, 286, 0, 0, 0, 287, + 288, 0, 0, 0, 289, 290, 291, 292, 293, 0, + 0, 0, 294, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 298, 299, 0, 0, 0, 300, 0, 301, + 302, 0, 303, 304, 0, 0, 0, 305, 0, 0, + 306, 307, 308, 0, 0, 309, 0, 0, 310, 311, + 0, 0, 0, 0, 0, 312, 313, 0, 314, 0, + 315, 0, 316, 317, 0, 0, 0, 0, 0, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, + 337, 0, 338, 339, 340, 341, 0, 342, 343, 344, + 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, + 0, 0, 351, 352, 0, 353, 0, 354, 0, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 0, + 0, 365, 0, 0, 366, 367, 368, 369, 0, 0, + 0, 370, 371, 0, 0, 0, 372, 0, 373, 374, + 375, 0, 376, 377, 378, 379, 0, 380, 381, 0, + 0, 0, 0, 0, 0, 0, 0, 382, 383, 384, + 0, 0, 385, 0, 386, 0, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 0, 0, 397, 398, + 399, 0, 400, 0, 401, 402, 403, 404, 405, 0, + 406, 407, 408, 0, 0, 409, 0, 0, 0, 410, + 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, + 419, 0, 420, 421, 0, 422, 423, 424, 0, 0, + 425, 0, 426, 0, 427, 428, 0, 429, 430, 0, + 431, 0, 432, 0, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 0, 445, 446, + 0, 0, 0, 447, 448, 449, 450, 0, 0, 0, + 451, 0, 0, 0, 452, 0, 453, 454, 455, 456, + 457, 458, 0, 459, 460, 461, 462, 463, 464, 0, + 0, 0, 0, 0, 0, 465, 466, 0, 467, 0, + 0, 468, 0, 0, 0, 469, 470, 471, 0, 0, + 0, 472, 0, 0, 473, 474, 0, 475, 476, 477, + 478, 479, 480, 0, 0, 481, 482, 483, 484, 0, + 485, 486, 0, 0, 487, 488, 489, 490, 0, 0, + 491, 492, 0, 493, 494, 495, 496, 0, 0, 0, + 0, 0, 497, 498, 499, 0, 0, 0, 500, 501, + 502, 503, 0, 504, 505, 0, 506, 507, 0, 508, + 509, 0, 0, 510, 0, 0, 511, 0, 512, 0, + 513, 514, 0, 0, 0, 0, 0, 0, 515, 0, + 0, 516, 0, 0, 0, 517, 518, 519, 520, 521, + 522, 523, 0, 0, 0, 0, 0, 0, 524, 525, + 0, 526, 527, 528, 0, 159, 529, 160, 161, 162, + 163, 164, 165, 0, 0, 166, 0, 0, 0, 167, + 0, 0, 168, 0, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 0, 178, 0, 0, 0, 179, 0, + 0, 0, 180, 0, 0, 181, 182, 183, 0, 184, + 0, 185, 186, 0, 0, 187, 0, 0, 188, 189, + 0, 190, 191, 0, 192, 193, 0, 194, 195, 196, + 197, 198, 199, 0, 200, 201, 202, 203, 204, 205, + 206, 0, 207, 208, 209, 210, 211, 212, 213, 214, + 0, 215, 216, 0, 217, 218, 219, 220, 221, 0, + 222, 0, 0, 223, 0, 0, 224, 0, 225, 0, + 0, 226, 0, 227, 0, 0, 0, 228, 229, 230, + 0, 0, 231, 0, 0, 0, 0, 232, 233, 0, + 0, 0, 1519, 234, 0, 235, 0, 0, 0, 0, + 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, + 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, + 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, + 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, + 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, + 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, + 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, + 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, + 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, + 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, + 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, + 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, + 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, + 0, 309, 0, 0, 310, 311, 0, 0, 0, 0, + 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, + 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, + 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, + 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, + 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, + 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, + 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, + 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, + 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, + 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, + 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, + 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, + 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, + 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, + 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, + 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, + 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, + 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, + 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, + 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, + 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, + 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, + 487, 488, 489, 490, 0, 0, 491, 492, 0, 493, + 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, + 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, + 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, + 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, + 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, + 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, + 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, + 0, 159, 529, 160, 161, 162, 163, 164, 165, 0, + 0, 166, 0, 0, 0, 167, 0, 0, 168, 0, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 0, + 178, 0, 0, 0, 179, 0, 0, 0, 180, 0, + 0, 181, 182, 183, 0, 184, 0, 185, 186, 0, + 0, 187, 0, 0, 188, 189, 0, 190, 191, 0, + 192, 193, 0, 194, 195, 196, 197, 198, 199, 0, + 200, 201, 202, 203, 204, 205, 206, 0, 207, 208, + 209, 210, 211, 212, 213, 214, 0, 215, 216, 0, + 217, 218, 219, 220, 221, 0, 222, 0, 0, 223, + 0, 0, 224, 0, 225, 0, 0, 226, 0, 227, + 0, 0, 0, 228, 229, 230, 0, 0, 231, 0, + 0, 0, 0, 232, 233, 0, 0, 0, 1519, 234, + 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, + 239, 240, 241, 0, 0, 0, 0, 242, 0, 0, + 243, 244, 245, 0, 0, 0, 246, 0, 247, 248, + 0, 249, 250, 251, 0, 252, 253, 0, 254, 255, + 256, 257, 258, 259, 260, 0, 0, 261, 262, 263, + 264, 0, 0, 265, 266, 0, 267, 268, 269, 0, + 0, 270, 0, 0, 0, 271, 272, 0, 273, 0, + 274, 0, 275, 276, 277, 278, 279, 280, 281, 0, + 282, 0, 0, 283, 284, 285, 0, 286, 0, 0, + 0, 287, 288, 0, 0, 0, 289, 290, 291, 292, + 293, 0, 0, 0, 294, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 298, 299, 0, 0, 0, 300, + 0, 301, 302, 0, 303, 304, 0, 0, 0, 305, + 0, 0, 306, 307, 308, 0, 0, 309, 0, 0, + 310, 311, 0, 0, 0, 0, 0, 312, 313, 0, + 314, 0, 315, 0, 316, 317, 0, 0, 0, 0, + 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, + 335, 336, 337, 0, 338, 339, 340, 341, 0, 342, + 343, 344, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 0, 0, 351, 352, 0, 353, 0, 354, + 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 0, 0, 365, 0, 0, 366, 367, 368, 369, + 0, 0, 0, 370, 371, 0, 0, 0, 372, 0, + 373, 374, 375, 0, 376, 377, 378, 379, 0, 380, + 381, 0, 0, 0, 0, 0, 0, 0, 0, 382, + 383, 384, 0, 0, 385, 0, 386, 0, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 0, 0, + 397, 398, 399, 0, 400, 0, 401, 402, 403, 404, + 405, 0, 406, 407, 408, 0, 0, 409, 0, 0, + 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, + 417, 418, 419, 0, 420, 421, 0, 422, 423, 424, + 0, 0, 425, 0, 426, 0, 427, 428, 0, 429, + 430, 0, 431, 0, 432, 0, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 0, + 445, 446, 0, 0, 0, 447, 448, 449, 450, 0, + 0, 0, 451, 0, 0, 0, 452, 0, 453, 454, + 455, 456, 457, 458, 0, 459, 460, 461, 462, 463, + 464, 0, 0, 0, 0, 0, 0, 465, 466, 0, + 467, 0, 0, 468, 0, 0, 0, 469, 470, 471, + 0, 0, 0, 472, 0, 0, 473, 474, 0, 475, + 476, 477, 478, 479, 480, 0, 0, 481, 482, 483, + 484, 0, 485, 486, 0, 0, 487, 488, 489, 490, + 0, 0, 491, 492, 0, 493, 494, 495, 496, 0, + 0, 0, 0, 0, 2135, 498, 499, 0, 0, 0, + 500, 501, 502, 503, 0, 504, 505, 0, 506, 507, + 0, 508, 509, 0, 0, 510, 0, 0, 511, 0, + 512, 0, 513, 514, 0, 0, 0, 0, 0, 0, + 515, 0, 0, 516, 0, 0, 0, 517, 518, 519, + 520, 521, 522, 523, 0, 0, 0, 0, 0, 0, + 524, 525, 0, 526, 527, 528, 0, 159, 529, 160, + 161, 162, 163, 164, 165, 0, 0, 166, 0, 0, + 0, 167, 0, 0, 168, 0, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 0, 178, 0, 0, 0, + 179, 0, 0, 0, 180, 0, 0, 181, 182, 183, + 0, 184, 0, 185, 186, 0, 0, 187, 0, 0, + 188, 189, 0, 190, 191, 0, 192, 193, 0, 194, + 195, 196, 197, 198, 199, 0, 200, 201, 202, 203, + 204, 205, 206, 0, 207, 208, 209, 210, 211, 212, + 213, 214, 0, 215, 216, 0, 217, 218, 219, 220, + 221, 0, 222, 0, 0, 223, 0, 0, 224, 0, + 225, 0, 0, 226, 0, 227, 0, 0, 0, 228, + 229, 230, 0, 0, 231, 0, 0, 0, 0, 232, + 233, 0, 0, 0, 2273, 234, 0, 235, 0, 0, + 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, + 0, 0, 0, 242, 0, 0, 243, 244, 245, 0, + 0, 0, 246, 0, 247, 248, 0, 249, 250, 251, + 0, 252, 253, 0, 254, 255, 256, 257, 258, 259, + 260, 0, 0, 261, 262, 263, 264, 0, 0, 265, + 266, 0, 267, 268, 269, 0, 0, 270, 0, 0, + 0, 271, 272, 0, 273, 0, 274, 0, 275, 276, + 277, 278, 279, 280, 281, 0, 282, 0, 0, 283, + 284, 285, 0, 286, 0, 0, 0, 287, 288, 0, + 0, 0, 289, 290, 291, 292, 293, 0, 0, 0, + 294, 295, 296, 0, 0, 297, 0, 0, 0, 0, + 298, 299, 0, 0, 0, 300, 0, 301, 302, 0, + 303, 304, 0, 0, 0, 305, 0, 0, 306, 307, + 308, 0, 0, 309, 0, 0, 310, 311, 0, 0, + 0, 0, 0, 312, 313, 0, 314, 0, 315, 0, + 316, 317, 0, 0, 0, 0, 0, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 0, 334, 335, 336, 337, 0, + 338, 339, 340, 341, 0, 342, 343, 344, 0, 0, + 0, 0, 345, 346, 347, 348, 349, 350, 0, 0, + 351, 352, 0, 353, 0, 354, 0, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 0, 0, 365, + 0, 0, 366, 367, 368, 369, 0, 0, 0, 370, + 371, 0, 0, 0, 372, 0, 373, 374, 375, 0, + 376, 377, 378, 379, 0, 380, 381, 0, 0, 0, + 0, 0, 0, 0, 0, 382, 383, 384, 0, 0, + 385, 0, 386, 0, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 0, 397, 398, 399, 0, + 400, 0, 401, 402, 403, 404, 405, 0, 406, 407, + 408, 0, 0, 409, 0, 0, 0, 410, 411, 412, + 413, 414, 0, 0, 415, 416, 417, 418, 419, 0, + 420, 421, 0, 422, 423, 424, 0, 0, 425, 0, + 426, 0, 427, 428, 0, 429, 430, 0, 431, 0, + 432, 0, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 0, 445, 446, 0, 0, + 0, 447, 448, 449, 450, 0, 0, 0, 451, 0, + 0, 0, 452, 0, 453, 454, 455, 456, 457, 458, + 0, 459, 460, 461, 462, 463, 464, 0, 0, 0, + 0, 0, 0, 465, 466, 0, 467, 0, 0, 468, + 0, 0, 0, 469, 470, 471, 0, 0, 0, 472, + 0, 0, 473, 474, 0, 475, 476, 477, 478, 479, + 480, 0, 0, 481, 482, 483, 484, 0, 485, 486, + 0, 0, 487, 488, 489, 490, 0, 0, 491, 492, + 0, 493, 494, 495, 496, 0, 0, 0, 0, 0, + 497, 498, 499, 0, 0, 0, 500, 501, 502, 503, + 0, 504, 505, 0, 506, 507, 0, 508, 509, 0, + 0, 510, 0, 0, 511, 0, 512, 0, 513, 514, + 0, 0, 0, 0, 0, 0, 515, 0, 0, 516, + 0, 0, 0, 517, 518, 519, 520, 521, 522, 523, + 0, 0, 0, 0, 0, 0, 524, 525, 0, 526, + 527, 528, 0, 159, 529, 160, 161, 162, 163, 164, + 165, 0, 0, 166, 0, 0, 0, 167, 0, 0, + 168, 0, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 0, 178, 0, 0, 0, 179, 0, 0, 0, + 180, 0, 0, 181, 182, 183, 0, 184, 0, 185, + 186, 0, 0, 187, 0, 0, 188, 189, 0, 190, + 191, 0, 192, 193, 0, 194, 195, 196, 197, 198, + 199, 0, 200, 201, 202, 203, 204, 205, 206, 0, + 207, 208, 209, 210, 211, 212, 213, 214, 0, 215, + 216, 0, 217, 218, 219, 220, 221, 0, 222, 0, + 0, 223, 0, 0, 224, 0, 225, 0, 0, 226, + 0, 227, 0, 0, 0, 228, 229, 230, 0, 0, + 231, 0, 0, 0, 0, 232, 233, 0, 0, 0, + 0, 234, 0, 235, 0, 0, 0, 0, 236, 0, + 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, + 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, + 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, + 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, + 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, + 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, + 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, + 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, + 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, + 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, + 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, + 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, + 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, + 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, + 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, + 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, + 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, + 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, + 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, + 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, + 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, + 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, + 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 0, 0, 397, 398, 399, 3308, 400, 0, 401, 402, + 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, + 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, + 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, + 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, + 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, + 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, + 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, + 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, + 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, + 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, + 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, + 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, + 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, + 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, + 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, + 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, + 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, + 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, + 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, + 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, + 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, + 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, + 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, + 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, + 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, + 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, + 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, + 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, + 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, + 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, + 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, + 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, + 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, + 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, + 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, + 250, 251, 0, 252, 253, 0, 254, 255, 256, 257, + 258, 259, 260, 0, 0, 261, 262, 263, 264, 0, + 0, 265, 266, 0, 267, 268, 269, 0, 0, 270, + 0, 0, 0, 271, 272, 0, 273, 0, 274, 0, + 275, 276, 277, 278, 279, 280, 281, 0, 282, 0, + 0, 283, 284, 285, 0, 286, 0, 0, 0, 287, + 288, 0, 0, 0, 289, 290, 291, 292, 293, 0, + 0, 0, 294, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 298, 299, 0, 0, 0, 300, 0, 301, + 302, 0, 303, 304, 0, 0, 0, 305, 0, 0, + 306, 307, 308, 0, 0, 309, 0, 0, 310, 311, + 0, 0, 0, 0, 0, 312, 313, 0, 314, 0, + 315, 0, 316, 317, 0, 0, 0, 0, 0, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, + 337, 0, 338, 339, 340, 341, 0, 342, 343, 344, + 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, + 0, 0, 351, 352, 0, 353, 0, 354, 0, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 0, + 0, 365, 0, 0, 366, 367, 368, 369, 0, 0, + 0, 370, 371, 0, 0, 0, 372, 0, 373, 374, + 375, 0, 376, 377, 378, 379, 0, 380, 381, 0, + 0, 0, 0, 0, 0, 0, 0, 382, 383, 384, + 0, 0, 385, 0, 386, 0, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 0, 0, 397, 398, + 399, 0, 400, 0, 401, 402, 403, 404, 405, 0, + 406, 407, 408, 0, 0, 409, 0, 0, 0, 410, + 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, + 419, 0, 420, 421, 0, 422, 423, 424, 0, 0, + 425, 0, 426, 0, 427, 428, 0, 429, 430, 0, + 431, 0, 432, 0, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 0, 445, 446, + 0, 0, 0, 447, 448, 449, 450, 0, 0, 0, + 451, 0, 0, 0, 452, 0, 453, 454, 455, 456, + 457, 458, 0, 459, 460, 461, 462, 463, 464, 0, + 0, 0, 0, 0, 0, 465, 466, 0, 467, 0, + 0, 468, 0, 0, 0, 469, 470, 471, 0, 0, + 0, 472, 0, 0, 473, 474, 0, 475, 476, 477, + 478, 479, 480, 0, 0, 481, 482, 483, 484, 0, + 485, 486, 0, 0, 487, 488, 489, 490, 0, 156, + 491, 492, 0, 493, 494, 495, 496, 0, 0, 0, + 0, 0, 497, 498, 499, 0, 0, 0, 500, 501, + 502, 503, 0, 504, 505, 0, 506, 507, 0, 508, + 509, 0, 0, 510, 0, 0, 511, 0, 512, 0, + 513, 514, 0, 0, 0, 0, 0, 0, 515, 0, + 0, 516, 0, 0, 0, 517, 518, 519, 520, 521, + 522, 523, 0, 0, 0, 0, 0, 0, 524, 525, + 0, 526, 527, 528, 0, 159, 529, 160, 161, 162, + 163, 164, 165, 0, 0, 166, 0, 0, 0, 167, + 0, 0, 168, 0, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 0, 178, 0, 0, 0, 179, 0, + 0, 0, 180, 0, 0, 181, 182, 183, 0, 184, + 0, 185, 186, 0, 0, 187, 0, 0, 188, 189, + 0, 190, 191, 0, 192, 193, 0, 194, 195, 196, + 197, 198, 199, 0, 200, 201, 202, 203, 204, 205, + 206, 0, 207, 208, 209, 210, 211, 212, 213, 214, + 0, 215, 216, 0, 217, 218, 219, 220, 221, 0, + 222, 0, 0, 223, 0, 0, 224, 0, 225, 0, + 0, 226, 0, 227, 0, 0, 0, 228, 229, 230, + 0, 0, 231, 0, 0, 0, 0, 232, 233, 0, + 0, 0, 3621, 234, 0, 235, 0, 0, 0, 0, + 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, + 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, + 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, + 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, + 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, + 267, 268, 269, 0, 0, 270, 0, 0, 0, 271, + 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, + 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, + 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, + 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, + 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, + 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, + 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, + 0, 309, 0, 0, 310, 311, 0, 0, 0, 0, + 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, + 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, + 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, + 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, + 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, + 366, 367, 368, 369, 0, 0, 0, 370, 371, 0, + 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, + 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, + 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, + 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, + 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, + 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, + 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, + 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, + 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, + 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, + 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, + 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, + 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, + 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, + 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, + 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, + 487, 488, 489, 490, 0, 0, 491, 492, 0, 493, + 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, + 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, + 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, + 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, + 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, + 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, + 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, + 0, 159, 529, 160, 161, 162, 163, 164, 165, 3629, + 0, 166, 0, 0, 0, 167, 0, 0, 168, 0, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 0, + 178, 0, 0, 0, 179, 0, 0, 0, 180, 0, + 0, 181, 182, 183, 0, 184, 0, 185, 186, 0, + 0, 187, 0, 0, 188, 189, 0, 190, 191, 0, + 192, 193, 0, 194, 195, 196, 197, 198, 199, 0, + 200, 201, 202, 203, 204, 205, 206, 0, 207, 208, + 209, 210, 211, 212, 213, 214, 0, 215, 216, 0, + 217, 218, 219, 220, 221, 0, 222, 0, 0, 223, + 0, 0, 224, 0, 225, 0, 0, 226, 0, 227, + 0, 0, 0, 228, 229, 230, 0, 0, 231, 0, + 0, 0, 0, 232, 233, 0, 0, 0, 0, 234, + 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, + 239, 240, 241, 0, 0, 0, 0, 242, 0, 0, + 243, 244, 245, 0, 0, 0, 246, 0, 247, 248, + 0, 249, 250, 251, 0, 252, 253, 0, 254, 255, + 256, 257, 258, 259, 260, 0, 0, 261, 262, 263, + 264, 0, 0, 265, 266, 0, 267, 268, 269, 0, + 0, 270, 0, 0, 0, 271, 272, 0, 273, 0, + 274, 0, 275, 276, 277, 278, 279, 280, 281, 0, + 282, 0, 0, 283, 284, 285, 0, 286, 0, 0, + 0, 287, 288, 0, 0, 0, 289, 290, 291, 292, + 293, 0, 0, 0, 294, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 298, 299, 0, 0, 0, 300, + 0, 301, 302, 0, 303, 304, 0, 0, 0, 305, + 0, 0, 306, 307, 308, 0, 0, 309, 0, 0, + 310, 311, 0, 0, 0, 0, 0, 312, 313, 0, + 314, 0, 315, 0, 316, 317, 0, 0, 0, 0, + 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, + 335, 336, 337, 0, 338, 339, 340, 341, 0, 342, + 343, 344, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 0, 0, 351, 352, 0, 353, 0, 354, + 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 0, 0, 365, 0, 0, 366, 367, 368, 369, + 0, 0, 0, 370, 371, 0, 0, 0, 372, 0, + 373, 374, 375, 0, 376, 377, 378, 379, 0, 380, + 381, 0, 0, 0, 0, 0, 0, 0, 0, 382, + 383, 384, 0, 0, 385, 0, 386, 0, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 0, 0, + 397, 398, 399, 0, 400, 0, 401, 402, 403, 404, + 405, 0, 406, 407, 408, 0, 0, 409, 0, 0, + 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, + 417, 418, 419, 0, 420, 421, 0, 422, 423, 424, + 0, 0, 425, 0, 426, 0, 427, 428, 0, 429, + 430, 0, 431, 0, 432, 0, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 0, + 445, 446, 0, 0, 0, 447, 448, 449, 450, 0, + 0, 0, 451, 0, 0, 0, 452, 0, 453, 454, + 455, 456, 457, 458, 0, 459, 460, 461, 462, 463, + 464, 0, 0, 0, 0, 0, 0, 465, 466, 0, + 467, 0, 0, 468, 0, 0, 0, 469, 470, 471, + 0, 0, 0, 472, 0, 0, 473, 474, 0, 475, + 476, 477, 478, 479, 480, 0, 0, 481, 482, 483, + 484, 0, 485, 486, 0, 0, 487, 488, 489, 490, + 0, 0, 491, 492, 0, 493, 494, 495, 496, 0, + 0, 0, 0, 0, 497, 498, 499, 0, 0, 0, + 500, 501, 502, 503, 0, 504, 505, 0, 506, 507, + 0, 508, 509, 0, 0, 510, 0, 0, 511, 0, + 512, 0, 513, 514, 0, 0, 0, 0, 0, 0, + 515, 0, 0, 516, 0, 0, 0, 517, 518, 519, + 520, 521, 522, 523, 0, 0, 0, 0, 0, 0, + 524, 525, 0, 526, 527, 528, 0, 159, 529, 160, + 161, 162, 163, 164, 165, 0, 0, 166, 0, 0, + 0, 167, 0, 0, 168, 0, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 0, 178, 0, 0, 0, + 179, 0, 0, 0, 180, 0, 0, 181, 182, 183, + 0, 184, 0, 185, 186, 0, 0, 187, 0, 0, + 188, 189, 0, 190, 191, 0, 192, 193, 0, 194, + 195, 196, 197, 198, 199, 0, 200, 201, 202, 203, + 204, 205, 206, 0, 207, 208, 209, 210, 211, 212, + 213, 214, 0, 215, 216, 0, 217, 218, 219, 220, + 221, 0, 222, 0, 0, 223, 0, 0, 224, 0, + 225, 0, 0, 226, 0, 227, 0, 0, 0, 228, + 229, 230, 0, 0, 231, 0, 0, 0, 0, 232, + 233, 0, 0, 0, 3653, 234, 0, 235, 0, 0, + 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, + 0, 0, 0, 242, 0, 0, 243, 244, 245, 0, + 0, 0, 246, 0, 247, 248, 0, 249, 250, 251, + 0, 252, 253, 0, 254, 255, 256, 257, 258, 259, + 260, 0, 0, 261, 262, 263, 264, 0, 0, 265, + 266, 0, 267, 268, 269, 0, 0, 270, 0, 0, + 0, 271, 272, 0, 273, 0, 274, 0, 275, 276, + 277, 278, 279, 280, 281, 0, 282, 0, 0, 283, + 284, 285, 0, 286, 0, 0, 0, 287, 288, 0, + 0, 0, 289, 290, 291, 292, 293, 0, 0, 0, + 294, 295, 296, 0, 0, 297, 0, 0, 0, 0, + 298, 299, 0, 0, 0, 300, 0, 301, 302, 0, + 303, 304, 0, 0, 0, 305, 0, 0, 306, 307, + 308, 0, 0, 309, 0, 0, 310, 311, 0, 0, + 0, 0, 0, 312, 313, 0, 314, 0, 315, 0, + 316, 317, 0, 0, 0, 0, 0, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 0, 334, 335, 336, 337, 0, + 338, 339, 340, 341, 0, 342, 343, 344, 0, 0, + 0, 0, 345, 346, 347, 348, 349, 350, 0, 0, + 351, 352, 0, 353, 0, 354, 0, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 0, 0, 365, + 0, 0, 366, 367, 368, 369, 0, 0, 0, 370, + 371, 0, 0, 0, 372, 0, 373, 374, 375, 0, + 376, 377, 378, 379, 0, 380, 381, 0, 0, 0, + 0, 0, 0, 0, 0, 382, 383, 384, 0, 0, + 385, 0, 386, 0, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 0, 0, 397, 398, 399, 0, + 400, 0, 401, 402, 403, 404, 405, 0, 406, 407, + 408, 0, 0, 409, 0, 0, 0, 410, 411, 412, + 413, 414, 0, 0, 415, 416, 417, 418, 419, 0, + 420, 421, 0, 422, 423, 424, 0, 0, 425, 0, + 426, 0, 427, 428, 0, 429, 430, 0, 431, 0, + 432, 0, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 0, 445, 446, 0, 0, + 0, 447, 448, 449, 450, 0, 0, 0, 451, 0, + 0, 0, 452, 0, 453, 454, 455, 456, 457, 458, + 0, 459, 460, 461, 462, 463, 464, 0, 0, 0, + 0, 0, 0, 465, 466, 0, 467, 0, 0, 468, + 0, 0, 0, 469, 470, 471, 0, 0, 0, 472, + 0, 0, 473, 474, 0, 475, 476, 477, 478, 479, + 480, 0, 0, 481, 482, 483, 484, 0, 485, 486, + 0, 0, 487, 488, 489, 490, 0, 0, 491, 492, + 0, 493, 494, 495, 496, 0, 0, 0, 0, 0, + 497, 498, 499, 0, 0, 0, 500, 501, 502, 503, + 0, 504, 505, 0, 506, 507, 0, 508, 509, 0, + 0, 510, 0, 0, 511, 0, 512, 0, 513, 514, + 0, 0, 0, 0, 0, 0, 515, 0, 0, 516, + 0, 0, 0, 517, 518, 519, 520, 521, 522, 523, + 0, 0, 0, 0, 0, 0, 524, 525, 0, 526, + 527, 528, 0, 159, 529, 160, 161, 162, 163, 164, + 165, 0, 0, 166, 0, 0, 0, 167, 0, 0, + 168, 0, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 0, 178, 0, 0, 0, 179, 0, 0, 0, + 180, 0, 0, 181, 182, 183, 0, 184, 0, 185, + 186, 0, 0, 187, 0, 0, 188, 189, 0, 190, + 191, 0, 192, 193, 0, 194, 195, 196, 197, 198, + 199, 0, 200, 201, 202, 203, 204, 205, 206, 0, + 207, 208, 209, 210, 211, 212, 213, 214, 0, 215, + 216, 0, 217, 218, 219, 220, 221, 0, 222, 0, + 0, 223, 0, 0, 224, 0, 225, 0, 0, 226, + 0, 227, 0, 0, 0, 228, 229, 230, 0, 0, + 231, 0, 0, 0, 0, 232, 233, 0, 0, 0, + 0, 234, 0, 235, 0, 0, 0, 0, 236, 0, + 237, 238, 239, 240, 241, 0, 0, 0, 0, 242, + 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, + 247, 248, 0, 249, 250, 251, 0, 252, 253, 0, + 254, 255, 256, 257, 258, 259, 260, 0, 0, 261, + 262, 263, 264, 0, 0, 265, 266, 0, 267, 268, + 269, 0, 0, 270, 0, 0, 0, 271, 272, 0, + 273, 0, 274, 0, 275, 276, 277, 278, 279, 280, + 281, 0, 282, 0, 0, 283, 284, 285, 0, 286, + 0, 0, 0, 287, 288, 0, 0, 0, 289, 290, + 291, 292, 293, 0, 0, 0, 294, 295, 296, 0, + 0, 297, 0, 0, 0, 0, 298, 299, 0, 0, + 0, 300, 0, 301, 302, 0, 303, 304, 0, 0, + 0, 305, 0, 0, 306, 307, 308, 0, 0, 309, + 0, 0, 310, 311, 0, 0, 0, 0, 0, 312, + 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, + 0, 0, 0, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, + 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, + 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, + 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, + 368, 369, 0, 0, 0, 370, 371, 0, 0, 0, + 372, 0, 373, 374, 375, 0, 376, 377, 378, 379, + 0, 380, 381, 0, 0, 0, 0, 0, 0, 0, + 0, 382, 383, 384, 0, 0, 385, 0, 386, 0, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 0, 0, 397, 398, 399, 4574, 400, 0, 401, 402, + 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, + 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, + 415, 416, 417, 418, 419, 0, 420, 421, 0, 422, + 423, 424, 0, 0, 425, 0, 426, 0, 427, 428, + 0, 429, 430, 0, 431, 0, 432, 0, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 0, 445, 446, 0, 0, 0, 447, 448, 449, + 450, 0, 0, 0, 451, 0, 0, 0, 452, 0, + 453, 454, 455, 456, 457, 458, 0, 459, 460, 461, + 462, 463, 464, 0, 0, 0, 0, 0, 0, 465, + 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, + 470, 471, 0, 0, 0, 472, 0, 0, 473, 474, + 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, + 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, + 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, + 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, + 0, 0, 500, 501, 502, 503, 0, 504, 505, 0, + 506, 507, 0, 508, 509, 0, 0, 510, 0, 0, + 511, 0, 512, 0, 513, 514, 0, 0, 0, 0, + 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, + 518, 519, 520, 521, 522, 523, 0, 0, 0, 0, + 0, 0, 524, 525, 0, 526, 527, 528, 0, 159, + 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, + 0, 0, 0, 167, 0, 0, 168, 0, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 0, 178, 0, + 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, + 182, 183, 0, 184, 0, 185, 186, 0, 0, 187, + 0, 0, 188, 189, 0, 190, 191, 0, 192, 193, + 0, 194, 195, 196, 197, 198, 199, 0, 200, 201, + 202, 203, 204, 205, 206, 0, 207, 208, 209, 210, + 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, + 219, 220, 221, 0, 222, 0, 0, 223, 0, 0, + 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, + 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, + 0, 232, 233, 0, 0, 0, 0, 234, 0, 235, + 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, + 241, 0, 0, 0, 0, 242, 0, 0, 243, 244, + 245, 0, 0, 0, 246, 0, 247, 248, 0, 249, + 250, 251, 0, 252, 253, 0, 254, 255, 256, 257, + 258, 259, 260, 0, 0, 261, 262, 263, 264, 0, + 0, 265, 266, 0, 267, 268, 269, 0, 0, 270, + 0, 0, 0, 271, 272, 0, 273, 0, 274, 0, + 275, 276, 277, 278, 279, 280, 281, 0, 282, 0, + 0, 283, 284, 285, 0, 286, 0, 0, 0, 287, + 288, 0, 0, 0, 289, 290, 291, 292, 293, 0, + 0, 0, 294, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 298, 299, 0, 0, 0, 300, 0, 301, + 302, 0, 303, 304, 0, 0, 0, 305, 0, 0, + 306, 307, 308, 0, 0, 309, 0, 0, 310, 311, + 0, 0, 0, 0, 0, 312, 313, 0, 314, 0, + 315, 0, 316, 317, 0, 0, 0, 0, 0, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, + 337, 0, 338, 339, 340, 341, 0, 342, 343, 344, + 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, + 0, 0, 351, 352, 0, 353, 0, 354, 0, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 0, + 0, 365, 0, 0, 366, 367, 368, 369, 0, 0, + 0, 370, 371, 0, 0, 0, 372, 0, 373, 374, + 375, 0, 376, 377, 378, 379, 0, 380, 381, 0, + 0, 0, 0, 0, 0, 0, 0, 382, 383, 384, + 0, 0, 385, 0, 386, 0, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 0, 0, 397, 398, + 399, 0, 400, 0, 401, 402, 403, 404, 405, 0, + 406, 407, 408, 0, 0, 409, 0, 0, 0, 410, + 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, + 419, 0, 420, 421, 0, 422, 423, 424, 0, 0, + 425, 0, 426, 0, 427, 428, 0, 429, 430, 0, + 431, 0, 432, 0, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 0, 445, 446, + 0, 0, 0, 447, 448, 449, 450, 0, 0, 0, + 451, 0, 0, 0, 452, 0, 453, 454, 455, 456, + 457, 458, 0, 459, 460, 461, 462, 463, 464, 0, + 0, 0, 0, 0, 0, 465, 466, 0, 467, 0, + 0, 468, 0, 0, 0, 469, 470, 471, 0, 0, + 0, 472, 0, 0, 473, 474, 0, 475, 476, 477, + 478, 479, 480, 0, 0, 481, 482, 483, 484, 0, + 485, 486, 0, 0, 487, 488, 489, 490, 0, 0, + 491, 492, 0, 493, 494, 495, 496, 0, 0, 0, + 0, 0, 497, 498, 499, 0, 0, 0, 500, 501, + 502, 503, 0, 504, 505, 0, 506, 507, 0, 508, + 509, 0, 0, 510, 0, 0, 511, 0, 512, 0, + 513, 514, 0, 0, 0, 0, 0, 0, 515, 0, + 0, 516, 0, 0, 0, 517, 518, 519, 520, 521, + 522, 523, 0, 0, 0, 0, 0, 0, 524, 525, + 0, 526, 527, 528, 0, 159, 529, 160, 161, 162, + 163, 164, 165, 0, 0, 166, 0, 0, 0, 167, + 0, 0, 168, 0, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 0, 178, 0, 0, 0, 179, 0, + 0, 0, 180, 0, 0, 181, 182, 183, 0, 184, + 0, 185, 186, 0, 0, 187, 0, 0, 188, 189, + 0, 190, 191, 0, 192, 193, 0, 194, 195, 196, + 197, 198, 199, 0, 200, 201, 202, 203, 204, 205, + 206, 0, 207, 208, 209, 210, 211, 212, 213, 214, + 0, 215, 216, 0, 217, 218, 219, 220, 221, 0, + 222, 0, 0, 223, 0, 0, 224, 0, 225, 0, + 0, 226, 0, 227, 0, 0, 0, 228, 229, 230, + 0, 0, 231, 0, 0, 0, 0, 232, 233, 0, + 0, 0, 0, 234, 0, 235, 0, 0, 0, 0, + 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, + 0, 242, 0, 0, 243, 244, 245, 0, 0, 0, + 246, 0, 247, 248, 0, 249, 250, 251, 0, 252, + 253, 0, 254, 255, 256, 257, 258, 259, 260, 0, + 0, 261, 262, 263, 264, 0, 0, 265, 266, 0, + 267, 2000, 269, 0, 0, 270, 0, 0, 0, 271, + 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, + 279, 280, 281, 0, 282, 0, 0, 283, 284, 285, + 0, 286, 0, 0, 0, 287, 288, 0, 0, 0, + 289, 290, 291, 292, 293, 0, 0, 0, 294, 295, + 296, 0, 0, 297, 0, 0, 0, 0, 298, 299, + 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, + 0, 0, 0, 305, 0, 0, 306, 307, 308, 0, + 0, 309, 0, 0, 310, 311, 0, 0, 0, 0, + 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, + 0, 0, 0, 0, 0, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, + 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, + 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, + 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, + 366, 2001, 368, 369, 0, 0, 0, 370, 371, 0, + 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, + 378, 379, 0, 380, 381, 0, 0, 0, 0, 0, + 0, 0, 0, 382, 383, 384, 0, 0, 385, 0, + 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 0, 0, 397, 398, 399, 0, 400, 0, + 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, + 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, + 0, 0, 415, 416, 417, 418, 419, 0, 420, 421, + 0, 422, 423, 424, 0, 0, 425, 0, 426, 0, + 427, 428, 0, 429, 430, 0, 431, 0, 432, 0, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 0, 445, 446, 0, 0, 0, 447, + 448, 449, 450, 0, 0, 0, 451, 0, 0, 0, + 452, 0, 453, 454, 455, 456, 457, 458, 0, 459, + 460, 461, 462, 463, 464, 0, 0, 0, 0, 0, + 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, + 0, 469, 470, 471, 0, 0, 0, 472, 0, 0, + 473, 474, 0, 475, 476, 477, 478, 479, 480, 0, + 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, + 487, 488, 489, 490, 0, 0, 491, 492, 0, 493, + 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, + 499, 0, 0, 0, 500, 501, 502, 503, 0, 504, + 505, 0, 506, 507, 0, 508, 509, 0, 0, 510, + 0, 0, 511, 0, 512, 0, 513, 514, 0, 0, + 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, + 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, + 0, 0, 0, 0, 524, 525, 0, 526, 527, 528, + 0, 159, 529, 160, 161, 162, 163, 164, 165, 0, + 0, 166, 0, 0, 0, 167, 0, 0, 0, 0, + 169, 170, 171, 172, 173, 174, 175, 176, 0, 0, + 923, 0, 0, 0, 179, 0, 0, 0, 180, 0, + 0, 181, 182, 183, 0, 184, 0, 0, 0, 0, + 0, 187, 7, 0, 188, 189, 0, 190, 0, 0, + 0, 0, 0, 194, 195, 196, 924, 198, 199, 0, + 200, 201, 0, 0, 0, 0, 0, 0, 207, 0, + 209, 0, 211, 212, 213, 214, 0, 215, 216, 0, + 217, 218, 219, 0, 221, 0, 222, 0, 0, 223, + 0, 0, 224, 0, 225, 0, 0, 226, 0, 227, + 0, 0, 0, 228, 229, 230, 0, 0, 231, 0, + 0, 0, 0, 232, 0, 0, 0, 0, 0, 234, + 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, + 239, 240, 241, 0, 0, 0, 0, 0, 0, 0, + 243, 244, 245, 0, -338, -338, 246, 0, -338, 248, + 0, 249, 250, 251, 0, 252, 253, 0, 254, 255, + 256, 257, 258, 0, 0, 0, 0, 261, 262, 263, + 264, 0, 0, 265, 266, 925, 267, 268, 269, 0, + 0, 0, 0, 0, 0, 0, 272, 0, 273, 0, + 274, 0, 275, 276, 277, 278, 279, 0, 281, 0, + 282, 0, 0, 0, 284, 285, 0, 0, 0, 0, + 0, 0, 288, 0, 0, 0, 289, 290, 291, 292, + 293, 26, 0, 0, 294, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 298, 0, 0, 0, 0, 300, + 0, 301, 302, 0, 303, 304, 926, 0, 0, 305, + 0, 0, 0, 307, 308, 0, 0, 309, 927, 0, + 310, 311, 0, 0, 0, 0, 0, 312, 313, 0, + 314, 0, 315, 0, 316, 317, 0, 0, 0, 0, + 32, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, + 335, 336, 337, 0, 338, 339, 340, 341, 0, 342, + 343, 344, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 0, 0, 351, 352, 0, 353, 0, 354, + 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 0, 0, 365, 0, 0, 366, 367, 368, 369, + 0, 0, 0, 0, 371, 0, 0, 0, 372, 0, + 373, 374, 375, 0, 376, 377, 378, 928, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 383, 384, 0, 0, 0, 0, 386, 0, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 0, 0, 0, + 0, 398, 399, 0, 400, 0, 401, 402, 403, 404, + 405, 0, 406, 407, 408, 0, 0, 409, 0, 0, + 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, + 417, 418, 419, 0, 420, 0, 0, 422, 0, 424, + 41, 0, 425, 0, 0, 0, 427, 0, 0, 429, + 430, 0, 431, 929, 432, 0, 0, 433, 0, 435, + 436, 437, 438, 439, 440, 441, 0, 443, 444, 0, + 445, 0, 0, 0, 0, 447, 448, 449, 0, 0, + 0, 0, 451, 0, 0, 0, 0, 0, 0, 454, + 0, 0, 457, 458, 0, 459, 0, 461, 0, 463, + 464, 0, 0, 0, 0, 0, 0, 465, 466, 0, + 467, 0, 0, 468, 0, 0, 0, 469, 0, 471, + 0, 0, 0, 472, 0, 0, 0, 474, 0, 475, + 476, 477, 478, 479, 480, 0, 0, 481, 482, 483, + 484, 0, 485, 486, 0, 0, 487, 488, 489, 490, + 0, 0, 491, 492, 0, 493, 494, 495, 496, 0, + 0, 0, 0, 0, 497, 498, 499, 0, 0, 0, + 0, 501, 502, 503, 0, 504, 505, 0, 506, 507, + 0, 0, 0, 0, 0, 510, 0, 0, 511, 0, + 0, 0, 513, 514, 0, 0, 0, 0, 0, 0, + 515, 0, 0, 516, 0, 0, 0, 517, 518, 519, + 520, 521, 522, 523, 0, 0, 60, 0, 0, 0, + 524, 0, 0, 526, 0, 528, 0, 159, 529, 160, + 161, 162, 163, 164, 165, 0, 0, 166, 0, 0, + 0, 167, 0, 0, 0, 0, 169, 170, 171, 172, + 173, 174, 175, 176, 0, 0, 923, 0, 0, 0, + 179, 0, 0, 0, 180, 0, 0, 181, 182, 183, + 0, 184, 0, 0, 0, 0, 0, 187, 7, 0, + 188, 189, 0, 190, 0, 0, 0, 0, 0, 194, + 195, 196, 924, 198, 199, 0, 200, 201, 0, 0, + 0, 0, 0, 0, 207, 0, 209, 0, 211, 212, + 213, 214, 0, 215, 216, 0, 217, 218, 219, 0, + 221, 0, 222, 0, 0, 223, 0, 0, 224, 0, + 225, 0, 0, 226, 0, 227, 0, 0, 0, 228, + 229, 230, 0, 0, 231, 0, 0, 0, 0, 232, + 0, 0, 0, 0, 0, 234, 0, 235, 0, 0, + 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, + 0, 0, 0, 0, 0, 0, 243, 244, 245, 0, + -358, 0, 246, 0, -358, 248, 0, 249, 250, 251, + 0, 252, 253, 0, 254, 255, 256, 257, 258, 0, + 0, 0, 0, 261, 262, 263, 264, 0, 0, 265, + 266, 925, 267, 268, 269, 0, 0, 0, 0, 0, + 0, 0, 272, 0, 273, 0, 274, 0, 275, 276, + 277, 278, 279, 0, 281, 0, 282, 0, 0, 0, + 284, 285, 0, 0, 0, 0, 0, 0, 288, 0, + 0, 0, 289, 290, 291, 292, 293, 26, 0, 0, + 294, 295, 296, 0, 0, 297, 0, 0, 0, 0, + 298, 0, 0, 0, 0, 300, 0, 301, 302, 0, + 303, 304, 926, 0, 0, 305, 0, 0, 0, 307, + 308, 0, 0, 309, 927, 0, 310, 311, 0, 0, + 0, 0, 0, 312, 313, 0, 314, 0, 315, 0, + 316, 317, 0, 0, 0, 0, 32, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 0, 334, 335, 336, 337, 0, + 338, 339, 340, 341, 0, 342, 343, 344, 0, 0, + 0, 0, 345, 346, 347, 348, 349, 350, 0, 0, + 351, 352, 0, 353, 0, 354, 0, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 0, 0, 365, + 0, 0, 366, 367, 368, 369, 0, 0, 0, 0, + 371, 0, 0, 0, 372, 0, 373, 374, 375, 0, + 376, 377, 378, 928, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 383, 384, 0, 0, + 0, 0, 386, 0, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 0, 0, 0, 0, 398, 399, 0, + 400, 0, 401, 402, 403, 404, 405, 0, 406, 407, + 408, 0, 0, 409, 0, 0, 0, 410, 411, 412, + 413, 414, 0, 0, 415, 416, 417, 418, 419, 0, + 420, 0, 0, 422, 0, 424, 41, 0, 425, 0, + 0, 0, 427, 0, 0, 429, 430, 0, 431, 929, + 432, 0, 0, 433, 0, 435, 436, 437, 438, 439, + 440, 441, 0, 443, 444, 0, 445, 0, 0, 0, + 0, 447, 448, 449, 0, 0, 0, 0, 451, 0, + 0, 0, 0, 0, 0, 454, 0, 0, 457, 458, + 0, 459, 0, 461, 0, 463, 464, 0, 0, 0, + 0, 0, 0, 465, 466, 0, 467, 0, 0, 468, + 0, 0, 0, 469, 0, 471, 0, 0, 0, 472, + 0, 0, 0, 474, 0, 475, 476, 477, 478, 479, + 480, 0, 0, 481, 482, 483, 484, 0, 485, 486, + 0, 0, 487, 488, 489, 490, 0, 0, 491, 492, + 0, 493, 494, 495, 496, 0, 0, 0, 0, 0, + 497, 498, 499, 0, 0, 0, 0, 501, 502, 503, + 0, 504, 505, 0, 506, 507, 0, 0, 0, 0, + 0, 510, 0, 0, 511, 0, 0, 0, 513, 514, + 0, 0, 0, 0, 0, 0, 515, 0, 0, 516, + 0, 0, 0, 517, 518, 519, 520, 521, 522, 523, + -358, 0, 60, 0, 0, 0, 524, 0, 0, 526, + 0, 528, 0, 159, 529, 160, 161, 162, 163, 164, + 165, 0, 0, 166, 0, 0, 0, 167, 0, 0, + 0, 0, 169, 170, 171, 172, 173, 174, 175, 176, + 0, 0, 923, 0, 0, 0, 179, 0, 0, 0, + 180, 0, 0, 181, 182, 183, 0, 184, 0, 0, + 0, 0, 0, 187, 7, 0, 188, 189, 0, 190, + 0, 0, 0, 0, 0, 194, 195, 196, 924, 198, + 199, 0, 200, 201, 0, 0, 0, 0, 0, 0, + 207, 0, 209, 0, 211, 212, 213, 214, 0, 215, + 216, 0, 217, 218, 219, 0, 221, 0, 222, 0, + 0, 223, 0, 0, 224, 0, 225, 0, 0, 226, + 0, 227, 0, 0, 0, 228, 229, 230, 0, 0, + 231, 0, 0, 0, 0, 232, 0, 0, 0, 0, + 0, 234, 0, 235, 0, 0, 0, 0, 236, 0, + 237, 238, 239, 240, 241, 0, 0, 0, 0, 0, + 0, 0, 243, 244, 245, 0, -355, 0, 246, 0, + -355, 248, 0, 249, 250, 251, 0, 252, 253, 0, + 254, 255, 256, 257, 258, 0, 0, 0, 0, 261, + 262, 263, 264, 0, 0, 265, 266, 925, 267, 268, + 269, 0, 0, 0, 0, 0, 0, 0, 272, 0, + 273, 0, 274, 0, 275, 276, 277, 278, 279, 0, + 281, 0, 282, 0, 0, 0, 284, 285, 0, 0, + 0, 0, 0, 0, 288, 0, 0, 0, 289, 290, + 291, 292, 293, 26, 0, 0, 294, 295, 296, 0, + 0, 297, 0, 0, 0, 0, 298, 0, 0, 0, + 0, 300, 0, 301, 302, 0, 303, 304, 926, 0, + 0, 305, 0, 0, 0, 307, 308, 0, 0, 309, + 927, 0, 310, 311, 0, 0, 0, 0, 0, 312, + 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, + 0, 0, 32, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, + 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, + 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, + 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, + 368, 369, 0, 0, 0, 0, 371, 0, 0, 0, + 372, 0, 373, 374, 375, 0, 376, 377, 378, 928, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 383, 384, 0, 0, 0, 0, 386, 0, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 0, + 0, 0, 0, 398, 399, 0, 400, 0, 401, 402, + 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, + 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, + 415, 416, 417, 418, 419, 0, 420, 0, 0, 422, + 0, 424, 41, 0, 425, 0, 0, 0, 427, 0, + 0, 429, 430, 0, 431, 929, 432, 0, 0, 433, + 0, 435, 436, 437, 438, 439, 440, 441, 0, 443, + 444, 0, 445, 0, 0, 0, 0, 447, 448, 449, + 0, 0, 0, 0, 451, 0, 0, 0, 0, 0, + 0, 454, 0, 0, 457, 458, 0, 459, 0, 461, + 0, 463, 464, 0, 0, 0, 0, 0, 0, 465, + 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, + 0, 471, 0, 0, 0, 472, 0, 0, 0, 474, + 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, + 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, + 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, + 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, + 0, 0, 0, 501, 502, 503, 0, 504, 505, 0, + 506, 507, 0, 0, 0, 0, 0, 510, 0, 0, + 511, 0, 0, 0, 513, 514, 0, 0, 0, 0, + 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, + 518, 519, 520, 521, 522, 523, -355, 0, 60, 0, + 0, 0, 524, 0, 0, 526, 0, 528, 0, 159, + 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, + 0, 0, 0, 167, 0, 0, 0, 0, 169, 170, + 171, 172, 173, 174, 175, 176, 0, 0, 923, 0, + 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, + 182, 183, 0, 184, 0, 0, 0, 0, 0, 187, + 7, 0, 188, 189, 0, 190, 0, 0, 0, 0, + 0, 194, 195, 196, 924, 198, 199, 0, 200, 201, + 0, 0, 0, 0, 0, 0, 207, 0, 209, 0, + 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, + 219, 0, 221, 0, 222, 0, 0, 223, 0, 0, + 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, + 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, + 0, 232, 0, 0, 0, 0, 0, 234, 0, 235, + 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, + 241, 0, 0, 0, 0, 0, 0, 0, 243, 244, + 245, 0, 0, 0, 246, 0, 1439, 248, 0, 249, + 250, 251, 0, 252, 253, 0, 254, 255, 256, 257, + 258, 0, 0, 0, 0, 261, 262, 263, 264, 0, + 0, 265, 266, 925, 267, 268, 269, 0, 0, 0, + 0, 0, 0, 0, 272, 0, 273, 0, 274, 0, + 275, 276, 277, 278, 279, 0, 281, 0, 282, 0, + 0, 0, 284, 285, 0, 0, 0, 0, 0, 0, + 288, 0, 0, 0, 289, 290, 291, 292, 293, 26, + 0, 0, 294, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 298, 0, 0, 0, 0, 300, 0, 301, + 302, 0, 303, 304, 926, 0, 0, 305, 0, 0, + 0, 307, 308, 0, 0, 309, 927, 0, 310, 311, + 0, 0, 0, 0, 0, 312, 313, 0, 314, 0, + 315, 0, 316, 317, 0, 0, 0, 0, 32, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, + 337, 0, 338, 339, 340, 341, 0, 342, 343, 344, + 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, + 0, 0, 351, 352, 0, 353, 0, 354, 0, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 0, + 0, 365, 0, 0, 366, 367, 368, 369, 0, 0, + 0, 0, 371, 0, 0, 0, 372, 0, 373, 374, + 375, 0, 376, 377, 378, 928, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 383, 384, + 0, 0, 0, 0, 386, 0, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 0, 0, 0, 0, 398, + 399, 0, 400, 0, 401, 402, 403, 404, 405, 0, + 406, 407, 408, 0, 0, 409, 0, 0, 0, 410, + 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, + 419, 0, 420, 0, 0, 422, 0, 424, 41, 0, + 425, 0, 0, 0, 427, 0, 0, 429, 430, 0, + 431, 929, 432, 0, 0, 433, 0, 435, 436, 437, + 438, 439, 440, 441, 0, 443, 444, 0, 445, 0, + 0, 0, 0, 447, 448, 449, 0, 0, 0, 0, + 451, 0, 0, 0, 0, 0, 0, 454, 0, 0, + 457, 458, 0, 459, 0, 461, 0, 463, 464, 0, + 0, 0, 0, 0, 0, 465, 466, 0, 467, 0, + 0, 468, 0, 0, 0, 469, 0, 471, 0, 0, + 0, 472, 0, 0, 0, 474, 0, 475, 476, 477, + 478, 479, 480, 0, 0, 481, 482, 483, 484, 0, + 485, 486, 0, 0, 487, 488, 489, 490, 0, 0, + 491, 492, 0, 493, 494, 495, 496, 0, 0, 0, + 0, 0, 497, 498, 499, 0, 0, 0, 0, 501, + 502, 503, 0, 504, 505, 0, 506, 507, 0, 0, + 0, 0, 0, 510, 0, 0, 511, 0, 0, 0, + 513, 514, 0, 0, 0, 0, 0, 0, 515, 0, + 0, 516, 0, 0, 0, 517, 518, 519, 520, 521, + 522, 523, 0, 0, 60, 0, 0, 0, 524, 0, + 0, 526, 0, 528, 0, 159, 529, 160, 161, 162, + 163, 164, 165, 0, 0, 166, 0, 0, 0, 167, + 0, 0, 0, 0, 169, 170, 171, 172, 173, 174, + 175, 176, 0, 0, 923, 0, 0, 0, 179, 0, + 0, 0, 180, 0, 0, 181, 182, 183, 0, 184, + 0, 0, 0, 0, 0, 187, 7, 0, 188, 189, + 0, 190, 0, 0, 0, 0, 0, 194, 195, 196, + 924, 198, 199, 0, 200, 201, 0, 0, 0, 0, + 0, 0, 207, 0, 209, 0, 211, 212, 213, 214, + 0, 215, 216, 0, 217, 218, 219, 0, 221, 0, + 222, 0, 0, 223, 0, 0, 224, 0, 225, 0, + 0, 226, 0, 227, 0, 0, 0, 228, 229, 230, + 0, 0, 231, 0, 0, 0, 0, 232, 0, 0, + 0, 0, 0, 234, 0, 235, 0, 0, 0, 0, + 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, + 0, 0, 0, 0, 243, 244, 245, 0, 0, 0, + 246, 0, -360, 248, 0, 249, 250, 251, 0, 252, + 253, 0, 254, 255, 256, 257, 258, 0, 0, 0, + 0, 261, 262, 263, 264, 0, 0, 265, 266, 925, + 267, 268, 269, 0, 0, 0, 0, 0, 0, 0, + 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, + 279, 0, 281, 0, 282, 0, 0, 0, 284, 285, + 0, 0, 0, 0, 0, 0, 288, 0, 0, 0, + 289, 290, 291, 292, 293, 26, 0, 0, 294, 295, + 296, 0, 0, 297, 0, 0, 0, 0, 298, 0, + 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, + 926, 0, 0, 305, 0, 0, 0, 307, 308, 0, + 0, 309, 927, 0, 310, 311, 0, 0, 0, 0, + 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, + 0, 0, 0, 0, 32, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, + 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, + 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, + 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, + 366, 367, 368, 369, 0, 0, 0, 0, 371, 0, + 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, + 378, 928, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 383, 384, 0, 0, 0, 0, + 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 0, 0, 0, 0, 398, 399, 0, 400, 0, + 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, + 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, + 0, 0, 415, 416, 417, 418, 419, 0, 420, 0, + 0, 422, 0, 424, 41, 0, 425, 0, 0, 0, + 427, 0, 0, 429, 430, 0, 431, 929, 432, 0, + 0, 433, 0, 435, 436, 437, 438, 439, 440, 441, + 0, 443, 444, 0, 445, 0, 0, 0, 0, 447, + 448, 449, 0, 0, 0, 0, 451, 0, 0, 0, + 0, 0, 0, 454, 0, 0, 457, 458, 0, 459, + 0, 461, 0, 463, 464, 0, 0, 0, 0, 0, + 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, + 0, 469, 0, 471, 0, 0, 0, 472, 0, 0, + 0, 474, 0, 475, 476, 477, 478, 479, 480, 0, + 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, + 487, 488, 489, 490, 0, 0, 491, 492, 0, 493, + 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, + 499, 0, 0, 0, 0, 501, 502, 503, 0, 504, + 505, 0, 506, 507, 0, 0, 0, 0, 0, 510, + 0, 0, 511, 0, 0, 0, 513, 514, 0, 0, + 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, + 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, + 60, 0, 0, 0, 524, 0, 0, 526, 0, 528, + 0, 159, 529, 160, 161, 162, 163, 164, 165, 0, + 0, 166, 0, 0, 0, 167, 0, 0, 0, 0, + 169, 170, 171, 172, 173, 174, 175, 176, 0, 0, + 923, 0, 0, 0, 179, 0, 0, 0, 180, 0, + 0, 181, 182, 183, 0, 184, 0, 0, 0, 0, + 0, 187, 7, 0, 188, 189, 0, 190, 0, 0, + 0, 0, 0, 194, 195, 196, 924, 198, 199, 0, + 200, 201, 0, 0, 0, 0, 0, 0, 207, 0, + 209, 0, 211, 212, 213, 214, 0, 215, 216, 0, + 217, 218, 219, 0, 221, 0, 222, 0, 0, 223, + 0, 0, 224, 0, 225, 0, 0, 226, 0, 227, + 0, 0, 0, 228, 229, 230, 0, 0, 231, 0, + 0, 0, 0, 232, 0, 0, 0, 0, 0, 234, + 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, + 239, 240, 241, 0, 0, 0, 0, 0, 0, 0, + 243, 244, 245, 0, 0, 0, 246, 0, 3157, 248, + 0, 249, 250, 251, 0, 252, 253, 0, 254, 255, + 256, 257, 258, 0, 0, 0, 0, 261, 262, 263, + 264, 0, 0, 265, 266, 925, 267, 268, 269, 0, + 0, 0, 0, 0, 0, 0, 272, 0, 273, 0, + 274, 0, 275, 276, 277, 278, 279, 0, 281, 0, + 282, 0, 0, 0, 284, 285, 0, 0, 0, 0, + 0, 0, 288, 0, 0, 0, 289, 290, 291, 292, + 293, 26, 0, 0, 294, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 298, 0, 0, 0, 0, 300, + 0, 301, 302, 0, 303, 304, 926, 0, 0, 305, + 0, 0, 0, 307, 308, 0, 0, 309, 927, 0, + 310, 311, 0, 0, 0, 0, 0, 312, 313, 0, + 314, 0, 315, 0, 316, 317, 0, 0, 0, 0, + 32, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, + 335, 336, 337, 0, 338, 339, 340, 341, 0, 342, + 343, 344, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 0, 0, 351, 352, 0, 353, 0, 354, + 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 0, 0, 365, 0, 0, 366, 367, 368, 369, + 0, 0, 0, 0, 371, 0, 0, 0, 372, 0, + 373, 374, 375, 0, 376, 377, 378, 928, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 383, 384, 0, 0, 0, 0, 386, 0, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 0, 0, 0, + 0, 398, 399, 0, 400, 0, 401, 402, 403, 404, + 405, 0, 406, 407, 408, 0, 0, 409, 0, 0, + 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, + 417, 418, 419, 0, 420, 0, 0, 422, 0, 424, + 41, 0, 425, 0, 0, 0, 427, 0, 0, 429, + 430, 0, 431, 929, 432, 0, 0, 433, 0, 435, + 436, 437, 438, 439, 440, 441, 0, 443, 444, 0, + 445, 0, 0, 0, 0, 447, 448, 449, 0, 0, + 0, 0, 451, 0, 0, 0, 0, 0, 0, 454, + 0, 0, 457, 458, 0, 459, 0, 461, 0, 463, + 464, 0, 0, 0, 0, 0, 0, 465, 466, 0, + 467, 0, 0, 468, 0, 0, 0, 469, 0, 471, + 0, 0, 0, 472, 0, 0, 0, 474, 0, 475, + 476, 477, 478, 479, 480, 0, 0, 481, 482, 483, + 484, 0, 485, 486, 0, 0, 487, 488, 489, 490, + 0, 0, 491, 492, 0, 493, 494, 495, 496, 0, + 0, 0, 0, 0, 497, 498, 499, 0, 0, 0, + 0, 501, 502, 503, 0, 504, 505, 0, 506, 507, + 0, 0, 0, 0, 0, 510, 0, 0, 511, 0, + 0, 0, 513, 514, 0, 0, 0, 0, 0, 0, + 515, 0, 0, 516, 0, 0, 0, 517, 518, 519, + 520, 521, 522, 523, 0, 0, 60, 0, 0, 0, + 524, 0, 0, 526, 0, 528, 0, 159, 529, 160, + 161, 162, 163, 164, 165, 0, 0, 166, 0, 0, + 0, 167, 0, 0, 0, 0, 169, 170, 171, 172, + 173, 174, 175, 176, 0, 0, 923, 0, 0, 0, + 179, 0, 0, 0, 180, 0, 0, 181, 182, 183, + 0, 184, 0, 0, 0, 0, 0, 187, 7, 0, + 188, 189, 0, 190, 0, 0, 0, 0, 0, 194, + 195, 196, 924, 198, 199, 0, 200, 201, 0, 0, + 0, 0, 0, 0, 207, 0, 209, 0, 211, 212, + 213, 214, 0, 215, 216, 0, 217, 218, 219, 0, + 221, 0, 222, 0, 0, 223, 0, 0, 224, 0, + 225, 0, 0, 226, 0, 227, 0, 0, 0, 228, + 229, 230, 0, 0, 231, 0, 0, 0, 0, 232, + 0, 0, 0, 0, 0, 234, 0, 235, 0, 0, + 0, 0, 236, 0, 237, 238, 239, 240, 241, 0, + 0, 0, 0, 0, 0, 0, 243, 244, 245, 0, + 0, 0, 246, 0, 3304, 248, 0, 249, 250, 251, + 0, 252, 253, 0, 254, 255, 256, 257, 258, 0, + 0, 0, 0, 261, 262, 263, 264, 0, 0, 265, + 266, 925, 267, 268, 269, 0, 0, 0, 0, 0, + 0, 0, 272, 0, 273, 0, 274, 0, 275, 276, + 277, 278, 279, 0, 281, 0, 282, 0, 0, 0, + 284, 285, 0, 0, 0, 0, 0, 0, 288, 0, + 0, 0, 289, 290, 291, 292, 293, 26, 0, 0, + 294, 295, 296, 0, 0, 297, 0, 0, 0, 0, + 298, 0, 0, 0, 0, 300, 0, 301, 302, 0, + 303, 304, 926, 0, 0, 305, 0, 0, 0, 307, + 308, 0, 0, 309, 927, 0, 310, 311, 0, 0, + 0, 0, 0, 312, 313, 0, 314, 0, 315, 0, + 316, 317, 0, 0, 0, 0, 32, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 0, 334, 335, 336, 337, 0, + 338, 339, 340, 341, 0, 342, 343, 344, 0, 0, + 0, 0, 345, 346, 347, 348, 349, 350, 0, 0, + 351, 352, 0, 353, 0, 354, 0, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 0, 0, 365, + 0, 0, 366, 367, 368, 369, 0, 0, 0, 0, + 371, 0, 0, 0, 372, 0, 373, 374, 375, 0, + 376, 377, 378, 928, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 383, 384, 0, 0, + 0, 0, 386, 0, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 0, 0, 0, 0, 398, 399, 0, + 400, 0, 401, 402, 403, 404, 405, 0, 406, 407, + 408, 0, 0, 409, 0, 0, 0, 410, 411, 412, + 413, 414, 0, 0, 415, 416, 417, 418, 419, 0, + 420, 0, 0, 422, 0, 424, 41, 0, 425, 0, + 0, 0, 427, 0, 0, 429, 430, 0, 431, 929, + 432, 0, 0, 433, 0, 435, 436, 437, 438, 439, + 440, 441, 0, 443, 444, 0, 445, 0, 0, 0, + 0, 447, 448, 449, 0, 0, 0, 0, 451, 0, + 0, 0, 0, 0, 0, 454, 0, 0, 457, 458, + 0, 459, 0, 461, 0, 463, 464, 0, 0, 0, + 0, 0, 0, 465, 466, 0, 467, 0, 0, 468, + 0, 0, 0, 469, 0, 471, 0, 0, 0, 472, + 0, 0, 0, 474, 0, 475, 476, 477, 478, 479, + 480, 0, 0, 481, 482, 483, 484, 0, 485, 486, + 0, 0, 487, 488, 489, 490, 0, 0, 491, 492, + 0, 493, 494, 495, 496, 0, 0, 0, 0, 0, + 497, 498, 499, 0, 0, 0, 0, 501, 502, 503, + 0, 504, 505, 0, 506, 507, 0, 0, 0, 0, + 0, 510, 0, 0, 511, 0, 0, 0, 513, 514, + 0, 0, 0, 0, 0, 0, 515, 0, 0, 516, + 0, 0, 0, 517, 518, 519, 520, 521, 522, 523, + 0, 0, 60, 0, 0, 0, 524, 0, 0, 526, + 0, 528, 0, 159, 529, 160, 161, 162, 163, 164, + 165, 0, 0, 166, 0, 0, 0, 167, 0, 0, + 0, 0, 169, 170, 171, 172, 173, 174, 175, 176, + 0, 0, 923, 0, 0, 0, 179, 0, 0, 0, + 180, 0, 0, 181, 182, 183, 0, 184, 0, 0, + 0, 0, 0, 187, 7, 0, 188, 189, 0, 190, + 0, 0, 0, 0, 0, 194, 195, 196, 924, 198, + 199, 0, 200, 201, 0, 0, 0, 0, 0, 0, + 207, 0, 209, 0, 211, 212, 213, 214, 0, 215, + 216, 0, 217, 218, 219, 0, 221, 0, 222, 0, + 0, 223, 0, 0, 224, 0, 225, 0, 0, 226, + 0, 227, 0, 0, 0, 228, 229, 230, 0, 0, + 231, 0, 0, 0, 0, 232, 0, 0, 0, 0, + 0, 234, 0, 235, 0, 0, 0, 0, 236, 0, + 237, 238, 239, 240, 241, 0, 0, 0, 0, 0, + 0, 0, 243, 244, 245, 0, 0, 0, 246, 0, + -342, 248, 0, 249, 250, 251, 0, 252, 253, 0, + 254, 255, 256, 257, 258, 0, 0, 0, 0, 261, + 262, 263, 264, 0, 0, 265, 266, 925, 267, 268, + 269, 0, 0, 0, 0, 0, 0, 0, 272, 0, + 273, 0, 274, 0, 275, 276, 277, 278, 279, 0, + 281, 0, 282, 0, 0, 0, 284, 285, 0, 0, + 0, 0, 0, 0, 288, 0, 0, 0, 289, 290, + 291, 292, 293, 26, 0, 0, 294, 295, 296, 0, + 0, 297, 0, 0, 0, 0, 298, 0, 0, 0, + 0, 300, 0, 301, 302, 0, 303, 304, 926, 0, + 0, 305, 0, 0, 0, 307, 308, 0, 0, 309, + 927, 0, 310, 311, 0, 0, 0, 0, 0, 312, + 313, 0, 314, 0, 315, 0, 316, 317, 0, 0, + 0, 0, 32, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 0, 334, 335, 336, 337, 0, 338, 339, 340, 341, + 0, 342, 343, 344, 0, 0, 0, 0, 345, 346, + 347, 348, 349, 350, 0, 0, 351, 352, 0, 353, + 0, 354, 0, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 0, 0, 365, 0, 0, 366, 367, + 368, 369, 0, 0, 0, 0, 371, 0, 0, 0, + 372, 0, 373, 374, 375, 0, 376, 377, 378, 928, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 383, 384, 0, 0, 0, 0, 386, 0, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 0, + 0, 0, 0, 398, 399, 0, 400, 0, 401, 402, + 403, 404, 405, 0, 406, 407, 408, 0, 0, 409, + 0, 0, 0, 410, 411, 412, 413, 414, 0, 0, + 415, 416, 417, 418, 419, 0, 420, 0, 0, 422, + 0, 424, 41, 0, 425, 0, 0, 0, 427, 0, + 0, 429, 430, 0, 431, 929, 432, 0, 0, 433, + 0, 435, 436, 437, 438, 439, 440, 441, 0, 443, + 444, 0, 445, 0, 0, 0, 0, 447, 448, 449, + 0, 0, 0, 0, 451, 0, 0, 0, 0, 0, + 0, 454, 0, 0, 457, 458, 0, 459, 0, 461, + 0, 463, 464, 0, 0, 0, 0, 0, 0, 465, + 466, 0, 467, 0, 0, 468, 0, 0, 0, 469, + 0, 471, 0, 0, 0, 472, 0, 0, 0, 474, + 0, 475, 476, 477, 478, 479, 480, 0, 0, 481, + 482, 483, 484, 0, 485, 486, 0, 0, 487, 488, + 489, 490, 0, 0, 491, 492, 0, 493, 494, 495, + 496, 0, 0, 0, 0, 0, 497, 498, 499, 0, + 0, 0, 0, 501, 502, 503, 0, 504, 505, 0, + 506, 507, 0, 0, 0, 0, 0, 510, 0, 0, + 511, 0, 0, 0, 513, 514, 0, 0, 0, 0, + 0, 0, 515, 0, 0, 516, 0, 0, 0, 517, + 518, 519, 520, 521, 522, 523, 0, 0, 60, 0, + 0, 0, 524, 0, 0, 526, 0, 528, 0, 159, + 529, 160, 161, 162, 163, 164, 165, 0, 0, 166, + 0, 0, 0, 167, 0, 0, 0, 0, 169, 170, + 171, 172, 173, 174, 175, 176, 0, 0, 923, 0, + 0, 0, 179, 0, 0, 0, 180, 0, 0, 181, + 182, 183, 0, 184, 0, 0, 0, 0, 0, 187, + 7, 0, 188, 189, 0, 190, 0, 0, 0, 0, + 0, 194, 195, 196, 924, 198, 199, 0, 200, 201, + 0, 0, 0, 0, 0, 0, 207, 0, 209, 0, + 211, 212, 213, 214, 0, 215, 216, 0, 217, 218, + 219, 0, 221, 0, 222, 0, 0, 223, 0, 0, + 224, 0, 225, 0, 0, 226, 0, 227, 0, 0, + 0, 228, 229, 230, 0, 0, 231, 0, 0, 0, + 0, 232, 0, 0, 0, 0, 0, 234, 0, 235, + 0, 0, 0, 0, 236, 0, 237, 238, 239, 240, + 241, 0, 0, 0, 0, 0, 0, 0, 243, 244, + 245, 0, 0, 0, 246, 0, 0, 248, 0, 249, + 250, 251, 0, 252, 253, 0, 254, 255, 256, 257, + 258, 0, 0, 0, 0, 261, 262, 263, 264, 0, + 0, 265, 266, 925, 267, 268, 269, 0, 0, 0, + 0, 0, 0, 0, 272, 0, 273, 0, 274, 0, + 275, 276, 277, 278, 279, 0, 281, 0, 282, 0, + 0, 0, 284, 285, 0, 0, 0, 0, 0, 0, + 288, 0, 0, 0, 289, 290, 291, 292, 293, 26, + 0, 0, 294, 295, 296, 0, 0, 297, 0, 0, + 0, 0, 298, 0, 0, 0, 0, 300, 0, 301, + 302, 0, 303, 304, 926, 0, 0, 305, 0, 0, + 0, 307, 308, 0, 0, 309, 927, 0, 310, 311, + 0, 0, 0, 0, 0, 312, 313, 0, 314, 0, + 315, 0, 316, 317, 0, 0, 0, 0, 32, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, + 337, 0, 338, 339, 340, 341, 0, 342, 343, 344, + 0, 0, 0, 0, 345, 346, 347, 348, 349, 350, + 0, 0, 351, 352, 0, 353, 0, 354, 0, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 0, + 0, 365, 0, 0, 366, 367, 368, 369, 0, 0, + 0, 0, 371, 0, 0, 0, 372, 0, 373, 374, + 375, 0, 376, 377, 378, 928, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 383, 384, + 0, 0, 0, 0, 386, 0, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 0, 0, 0, 0, 398, + 399, 0, 400, 0, 401, 402, 403, 404, 405, 0, + 406, 407, 408, 0, 0, 409, 0, 0, 0, 410, + 411, 412, 413, 414, 0, 0, 415, 416, 417, 418, + 419, 0, 420, 0, 0, 422, 0, 424, 41, 0, + 425, 0, 0, 0, 427, 0, 0, 429, 430, 0, + 431, 929, 432, 0, 0, 433, 0, 435, 436, 437, + 438, 439, 440, 441, 0, 443, 444, 0, 445, 0, + 0, 0, 0, 447, 448, 449, 0, 0, 0, 0, + 451, 0, 0, 0, 0, 0, 0, 454, 0, 0, + 457, 458, 0, 459, 0, 461, 0, 463, 464, 0, + 0, 0, 0, 0, 0, 465, 466, 0, 467, 0, + 0, 468, 0, 0, 0, 469, 0, 471, 0, 0, + 0, 472, 0, 0, 0, 474, 0, 475, 476, 477, + 478, 479, 480, 0, 0, 481, 482, 483, 484, 0, + 485, 486, 0, 0, 487, 488, 489, 490, 0, 0, + 491, 492, 0, 493, 494, 495, 496, 0, 0, 0, + 0, 0, 497, 498, 499, 0, 0, 0, 0, 501, + 502, 503, 0, 504, 505, 0, 506, 507, 0, 0, + 0, 0, 0, 510, 0, 0, 511, 0, 0, 0, + 513, 514, 0, 0, 0, 0, 0, 0, 515, 0, + 0, 516, 0, 0, 0, 517, 518, 519, 520, 521, + 522, 523, 0, 0, 60, 0, 0, 0, 524, 0, + 0, 526, 0, 528, 0, 159, 529, 160, 161, 162, + 163, 164, 165, 0, 0, 166, 0, 0, 0, 167, + 0, 0, 0, 0, 169, 170, 171, 172, 173, 174, + 175, 176, 0, 0, 923, 0, 0, 0, 179, 0, + 0, 0, 180, 0, 0, 181, 182, 183, 0, 184, + 0, 0, 0, 0, 0, 187, 7, 0, 188, 189, + 0, 190, 0, 0, 0, 0, 0, 194, 195, 196, + 924, 198, 199, 0, 200, 201, 0, 0, 0, 0, + 0, 0, 207, 0, 209, 0, 211, 212, 213, 214, + 0, 215, 216, 0, 217, 218, 219, 0, 221, 0, + 222, 0, 0, 223, 0, 0, 224, 0, 225, 0, + 0, 226, 0, 227, 0, 0, 0, 228, 229, 230, + 0, 0, 231, 0, 0, 0, 0, 232, 0, 0, + 0, 0, 0, 234, 0, 235, 0, 0, 0, 0, + 236, 0, 237, 238, 239, 240, 241, 0, 0, 0, + 0, 0, 0, 0, 243, 244, 245, 0, 0, 0, + 246, 0, 0, 248, 0, 249, 250, 251, 0, 252, + 253, 0, 254, 255, 256, 257, 258, 0, 0, 0, + 0, 261, 262, 263, 264, 0, 0, 265, 266, 925, + 267, 268, 269, 0, 0, 0, 0, 0, 0, 0, + 272, 0, 273, 0, 274, 0, 275, 276, 277, 278, + 279, 0, 281, 0, 282, 0, 0, 0, 284, 285, + 0, 0, 0, 0, 0, 0, 288, 0, 0, 0, + 289, 290, 291, 292, 293, 26, 0, 0, 294, 295, + 296, 0, 0, 297, 0, 0, 0, 0, 298, 0, + 0, 0, 0, 300, 0, 301, 302, 0, 303, 304, + 926, 0, 0, 305, 0, 0, 0, 307, 308, 0, + 0, 309, 927, 0, 310, 311, 0, 0, 0, 0, + 0, 312, 313, 0, 314, 0, 315, 0, 316, 317, + 0, 0, 0, 0, 32, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 0, 334, 335, 336, 337, 0, 338, 339, + 340, 341, 0, 342, 343, 344, 0, 0, 0, 0, + 345, 346, 347, 348, 349, 350, 0, 0, 351, 352, + 0, 353, 0, 354, 0, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 0, 0, 365, 0, 0, + 366, 367, 368, 369, 0, 0, 0, 0, 371, 0, + 0, 0, 372, 0, 373, 374, 375, 0, 376, 377, + 378, 928, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 383, 384, 0, 0, 0, 0, + 386, 0, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 0, 0, 0, 0, 398, 399, 0, 400, 0, + 401, 402, 403, 404, 405, 0, 406, 407, 408, 0, + 0, 409, 0, 0, 0, 410, 411, 412, 413, 414, + 0, 0, 415, 416, 417, 418, 419, 0, 420, 0, + 0, 422, 0, 424, 41, 0, 425, 0, 0, 0, + 427, 0, 0, 429, 430, 0, 431, 929, 432, 0, + 0, 433, 0, 435, 436, 437, 438, 439, 440, 441, + 0, 443, 444, 0, 445, 0, 0, 0, 0, 447, + 448, 449, 0, 0, 0, 0, 451, 0, 0, 0, + 0, 0, 0, 454, 0, 0, 457, 458, 0, 459, + 0, 461, 0, 463, 464, 0, 0, 0, 0, 0, + 0, 465, 466, 0, 467, 0, 0, 468, 0, 0, + 0, 469, 0, 471, 0, 0, 0, 472, 0, 0, + 0, 474, 0, 475, 476, 477, 478, 479, 480, 0, + 0, 481, 482, 483, 484, 0, 485, 486, 0, 0, + 487, 488, 489, 490, 0, 0, 491, 492, 0, 493, + 494, 495, 496, 0, 0, 0, 0, 0, 497, 498, + 499, 0, 0, 0, 0, 501, 502, 503, 0, 504, + 505, 0, 506, 507, 0, 0, 0, 0, 0, 510, + 0, 0, 1466, 0, 0, 0, 513, 514, 0, 0, + 0, 0, 0, 0, 515, 0, 0, 516, 0, 0, + 0, 517, 518, 519, 520, 521, 522, 523, 0, 0, + 60, 0, 0, 0, 524, 0, 0, 526, 0, 528, + 0, 159, 529, 160, 161, 162, 163, 164, 165, 0, + 0, 166, 0, 0, 0, 167, 0, 0, 0, 0, + 169, 170, 171, 172, 173, 174, 175, 176, 0, 0, + 0, 0, 0, 0, 179, 0, 0, 0, 180, 0, + 0, 181, 182, 183, 0, 184, 0, 0, 0, 0, + 0, 187, 0, 0, 188, 189, 0, 190, 0, 0, + 0, 0, 0, 194, 195, 196, 0, 198, 199, 0, + 200, 201, 0, 0, 0, 0, 0, 0, 207, 0, + 209, 0, 211, 212, 213, 214, 0, 215, 216, 0, + 217, 218, 219, 0, 221, 0, 222, 0, 0, 223, + 0, 0, 224, 0, 225, 0, 0, 226, 0, 227, + 0, 0, 0, 228, 229, 230, 0, 0, 231, 0, + 0, 0, 0, 232, 0, 0, 0, 0, 0, 234, + 0, 235, 0, 0, 0, 0, 236, 0, 237, 238, + 239, 240, 241, 0, 0, 0, 0, 0, 0, 0, + 243, 244, 245, 0, 0, 0, 246, 0, 0, 248, + 0, 249, 250, 251, 0, 252, 253, 0, 254, 255, + 256, 257, 258, 0, 0, 0, 0, 261, 262, 263, + 264, 0, 0, 265, 266, 0, 267, 268, 269, 0, + 0, 0, 0, 0, 0, 0, 272, 0, 273, 0, + 274, 0, 275, 276, 277, 278, 279, 0, 281, 0, + 282, 0, 0, 0, 284, 285, 0, 0, 0, 0, + 0, 0, 288, 0, 0, 0, 289, 290, 291, 292, + 293, 0, 0, 0, 294, 295, 296, 0, 0, 297, + 0, 0, 0, 0, 298, 0, 0, 0, 0, 300, + 0, 301, 302, 0, 303, 304, 0, 0, 0, 305, + 0, 0, 0, 307, 308, 0, 0, 309, 0, 0, + 310, 311, 0, 0, 0, 0, 0, 312, 313, 0, + 314, 0, 315, 0, 316, 317, 0, 0, 0, 0, + 0, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, + 335, 336, 337, 0, 338, 339, 340, 341, 0, 342, + 343, 344, 0, 0, 0, 0, 345, 346, 347, 348, + 349, 350, 0, 0, 351, 352, 0, 353, 0, 354, + 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 0, 0, 365, 0, 0, 366, 367, 368, 369, + 0, 0, 0, 0, 371, 0, 0, 0, 372, 0, + 373, 374, 375, 0, 376, 377, 378, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 383, 384, 0, 0, 0, 0, 386, 0, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 0, 0, 0, + 0, 398, 399, 0, 400, 0, 401, 402, 403, 404, + 405, 0, 406, 407, 408, 0, 0, 409, 0, 0, + 0, 410, 411, 412, 413, 414, 0, 0, 415, 416, + 417, 418, 419, 0, 420, 0, 0, 422, 0, 424, + 0, 0, 425, 0, 0, 0, 427, 0, 0, 429, + 430, 0, 431, 0, 432, 0, 0, 433, 0, 435, + 436, 437, 438, 439, 440, 441, 0, 443, 444, 0, + 445, 0, 0, 0, 0, 447, 448, 449, 0, 0, + 0, 0, 451, 0, 0, 0, 0, 0, 0, 454, + 0, 0, 457, 458, 0, 459, 0, 461, 0, 463, + 464, 0, 0, 0, 0, 0, 0, 465, 466, 0, + 467, 0, 0, 468, 0, 0, 0, 469, 0, 471, + 0, 0, 0, 472, 0, 0, 0, 474, 0, 475, + 476, 477, 478, 479, 480, 0, 0, 481, 482, 483, + 484, 0, 485, 486, 0, 0, 487, 488, 489, 490, + 0, 0, 491, 492, 0, 493, 494, 495, 496, 0, + 0, 0, 0, 0, 497, 498, 499, 0, 0, 0, + 0, 501, 502, 503, 0, 504, 505, 0, 506, 507, + 0, 0, 0, 0, 0, 510, 0, 0, 511, 0, + 0, 0, 513, 514, 0, 0, 0, 0, 0, 0, + 515, 0, 0, 516, 0, 0, 0, 517, 518, 519, + 520, 521, 522, 523, 0, 0, 0, 0, 0, 0, + 524, 0, 0, 526, 0, 528, 0, 0, 529 +}; + +static const yytype_int16 yycheck[] = +{ + 6, 3, 143, 609, 151, 632, 1116, 608, 609, 24, + 930, 986, 21, 641, 20, 1285, 644, 1213, 24, 1506, + 1232, 1035, 608, 1285, 33, 592, 6, 1379, 1013, 1014, + 36, 40, 1738, 140, 4, 547, 0, 661, 44, 1024, + 1507, 47, 962, 1057, 1185, 1256, 52, 2264, 661, 2107, + 2108, 549, 550, 59, 1507, 553, 554, 555, 2264, 863, + 558, 559, 560, 766, 1033, 1379, 1547, 582, 2361, 45, + 1427, 718, 2502, 1307, 566, 926, 927, 592, 3070, 2589, + 2373, 1315, 1120, 1450, 2786, 1709, 3244, 1707, 1120, 1058, + 566, 2854, 1685, 1643, 109, 2003, 959, 1077, 2969, 3084, + 2714, 3576, 1430, 109, 1351, 1316, 1317, 3290, 600, 1320, + 1321, 1322, 1323, 1967, 1325, 1326, 1327, 1328, 1329, 1330, + 1331, 1332, 700, 1620, 600, 703, 3111, 1222, 1675, 135, + 2463, 137, 1576, 139, 140, 141, 2264, 612, 151, 2262, + 615, 1734, 2112, 2374, 3113, 146, 2061, 151, 151, 2752, + 2262, 151, 1596, 2629, 2754, 2720, 3856, 137, 2758, 139, + 1604, 1605, 2638, 3245, 2694, 3443, 13, 2337, 2337, 2769, + 3442, 13, 1152, 2731, 3103, 822, 823, 824, 3909, 3368, + 18, 2781, 17, 18, 20, 2743, 2744, 834, 3715, 3376, + 2895, 2896, 3538, 2743, 2744, 20, 2901, 37, 2903, 50, + 27, 22, 75, 20, 18, 27, 17, 18, 116, 3555, + 17, 18, 21, 164, 2337, 83, 37, 136, 2327, 31, + 13, 1106, 1107, 17, 18, 2337, 67, 39, 84, 13, + 51, 2075, 132, 22, 132, 2459, 2868, 17, 18, 63, + 20, 62, 63, 33, 4140, 17, 18, 1059, 3182, 17, + 18, 111, 201, 17, 18, 198, 2101, 2898, 198, 34, + 204, 22, 27, 49, 164, 1150, 164, 1191, 1192, 1193, + 198, 87, 54, 62, 63, 66, 37, 152, 277, 3657, + 326, 17, 18, 129, 1208, 73, 237, 72, 54, 196, + 51, 4349, 17, 18, 17, 18, 70, 218, 46, 132, + 2254, 62, 63, 2861, 2862, 204, 17, 18, 12, 405, + 371, 2861, 2862, 332, 118, 3661, 67, 1241, 83, 212, + 1244, 73, 379, 17, 18, 59, 164, 3213, 247, 138, + 237, 164, 132, 3943, 17, 18, 471, 3223, 150, 164, + 151, 1265, 1266, 89, 166, 1269, 183, 193, 39, 432, + 381, 387, 9, 17, 18, 17, 18, 486, 237, 437, + 404, 83, 1286, 1287, 170, 24, 20, 495, 237, 867, + 706, 13, 13, 844, 39, 2244, 222, 3852, 408, 17, + 18, 17, 18, 3352, 153, 408, 372, 288, 565, 284, + 13, 284, 17, 18, 22, 13, 446, 556, 565, 597, + 559, 166, 4692, 17, 18, 4695, 197, 201, 609, 37, + 13, 926, 927, 158, 201, 930, 243, 3057, 259, 184, + 172, 243, 530, 51, 4155, 3935, 136, 631, 9, 201, + 586, 136, 144, 219, 62, 63, 37, 241, 1685, 565, + 72, 565, 4139, 584, 17, 18, 292, 962, 160, 241, + 2747, 4148, 33, 609, 11, 659, 564, 658, 659, 566, + 658, 4161, 63, 622, 571, 201, 634, 254, 313, 3109, + 17, 18, 75, 198, 369, 419, 3063, 527, 243, 162, + 657, 1109, 512, 1111, 1112, 1113, 1114, 1734, 389, 512, + 657, 1354, 478, 600, 321, 275, 2635, 17, 18, 321, + 20, 17, 18, 974, 455, 147, 147, 367, 259, 69, + 232, 380, 234, 1623, 592, 4025, 175, 645, 1221, 294, + 419, 565, 363, 859, 147, 371, 4816, 623, 657, 147, + 665, 222, 223, 1236, 191, 1398, 455, 1522, 164, 545, + 664, 263, 247, 1347, 563, 21, 368, 3220, 631, 295, + 556, 386, 495, 3931, 389, 1540, 321, 222, 223, 3227, + 566, 567, 3077, 3078, 3079, 571, 536, 486, 574, 4179, + 370, 590, 679, 3241, 3242, 386, 455, 1052, 389, 636, + 17, 18, 588, 287, 66, 3253, 196, 17, 18, 650, + 511, 428, 386, 1171, 600, 389, 1163, 362, 491, 4657, + 388, 1570, 608, 368, 1573, 575, 386, 355, 1577, 389, + 1579, 657, 618, 589, 386, 559, 3545, 389, 386, 494, + 3549, 389, 386, 659, 2747, 389, 417, 237, 4103, 2110, + 629, 1494, 638, 367, 665, 2747, 388, 1675, 1607, 1608, + 1609, 295, 612, 1675, 3515, 615, 506, 204, 1163, 619, + 386, 2244, 278, 389, 201, 661, 557, 663, 432, 468, + 559, 386, 138, 386, 389, 481, 389, 3177, 3602, 2262, + 3615, 1534, 1319, 679, 689, 386, 1379, 2805, 389, 454, + 462, 75, 3553, 689, 603, 691, 1198, 1199, 529, 1336, + 1937, 631, 386, 479, 700, 389, 462, 703, 2868, 2868, + 706, 608, 645, 386, 1915, 546, 389, 713, 2552, 2061, + 659, 504, 663, 1225, 622, 1926, 3348, 486, 1929, 541, + 504, 1233, 386, 1235, 386, 389, 4622, 389, 540, 3615, + 598, 659, 3290, 589, 2327, 1247, 1248, 1249, 657, 2183, + 1720, 3627, 588, 1255, 2337, 2868, 2970, 2061, 386, 561, + 386, 389, 537, 389, 2863, 862, 2868, 3643, 3644, 576, + 766, 386, 576, 663, 389, 663, 17, 18, 17, 18, + 621, 583, 386, 609, 595, 389, 541, 1355, 432, 1664, + 631, 2689, 1406, 2628, 657, 578, 576, 3974, 4134, 3347, + 1602, 2745, 616, 631, 1714, 546, 637, 3347, 619, 17, + 18, 4532, 624, 4534, 4535, 640, 595, 598, 620, 4336, + 657, 4157, 658, 386, 1909, 657, 389, 657, 4007, 625, + 645, 827, 659, 829, 1748, 663, 3528, 662, 645, 640, + 663, 833, 659, 640, 595, 639, 657, 659, 663, 386, + 2036, 650, 389, 4115, 4122, 609, 640, 2344, 854, 855, + 856, 3933, 858, 859, 860, 630, 862, 1349, 864, 624, + 640, 4133, 419, 2732, 870, 659, 386, 1445, 640, 389, + 386, 1495, 640, 389, 565, 855, 640, 659, 183, 659, + 860, 1685, 1495, 628, 864, 861, 658, 1465, 657, 865, + 658, 659, 661, 603, 659, 659, 1371, 3882, 603, 136, + 565, 907, 17, 18, 640, 537, 1013, 922, 1015, 631, + 1834, 1018, 1019, 3210, 1838, 640, 922, 640, 924, 4650, + 4651, 923, 928, 4654, 61, 3894, 4272, 1034, 1556, 640, + 1734, 2551, 2990, 658, 2640, 658, 659, 3524, 1862, 3612, + 17, 18, 3871, 3872, 504, 960, 640, 658, 659, 386, + 1574, 966, 389, 959, 960, 3641, 386, 640, 440, 389, + 966, 1574, 3101, 3102, 658, 1106, 1107, 595, 1115, 526, + 3535, 2521, 3640, 2881, 4674, 2883, 640, 3922, 640, 35, + 3925, 3926, 636, 953, 377, 91, 3044, 615, 616, 183, + 377, 645, 468, 375, 658, 659, 658, 2244, 608, 202, + 1475, 1007, 640, 629, 640, 277, 402, 1013, 37, 1015, + 247, 3521, 1018, 1019, 4745, 640, 3531, 1645, 1646, 1643, + 658, 659, 658, 659, 581, 261, 640, 421, 1034, 1657, + 17, 18, 1524, 658, 659, 146, 3922, 663, 379, 3925, + 3926, 129, 4742, 3573, 658, 659, 183, 4623, 1524, 377, + 187, 3937, 17, 18, 226, 3760, 54, 869, 17, 18, + 2968, 198, 486, 3280, 3769, 622, 161, 640, 1696, 3545, + 186, 1077, 3637, 3549, 3280, 83, 171, 377, 1679, 4064, + 2327, 466, 1052, 457, 1054, 658, 659, 3210, 3691, 377, + 2337, 4130, 3692, 640, 17, 18, 1102, 278, 3210, 1101, + 377, 280, 1115, 657, 377, 17, 18, 1108, 148, 108, + 1116, 1115, 1115, 4082, 13, 1115, 201, 245, 154, 133, + 640, 3762, 198, 428, 640, 1140, 254, 1103, 1104, 1832, + 17, 18, 258, 2118, 1140, 386, 148, 386, 389, 2732, + 389, 119, 658, 1149, 122, 2769, 1152, 2010, 3379, 961, + 1642, 480, 3280, 164, 2747, 3009, 2703, 2624, 3073, 2626, + 2627, 3131, 556, 27, 2178, 1171, 1181, 258, 386, 1149, + 2208, 389, 4518, 2626, 2627, 1181, 2208, 130, 3348, 3348, + 279, 2044, 2045, 282, 401, 289, 580, 533, 2399, 237, + 2204, 1298, 355, 330, 368, 17, 18, 400, 254, 1714, + 2169, 2568, 559, 640, 292, 2346, 387, 3540, 963, 27, + 640, 287, 4687, 2182, 377, 1221, 2185, 2186, 455, 83, + 331, 277, 659, 4168, 232, 3348, 234, 463, 1335, 659, + 1236, 2559, 449, 657, 428, 295, 3348, 4583, 313, 253, + 2474, 13, 1349, 134, 115, 349, 2690, 295, 147, 486, + 17, 18, 4828, 3958, 370, 263, 3961, 17, 18, 17, + 18, 657, 2840, 3949, 392, 657, 659, 278, 2480, 2481, + 2863, 386, 659, 1380, 389, 2868, 361, 659, 278, 1285, + 665, 1928, 4168, 371, 313, 659, 3991, 3992, 3993, 2269, + 385, 428, 1298, 565, 3999, 636, 475, 2225, 2226, 252, + 503, 4006, 607, 174, 344, 27, 432, 1309, 4050, 386, + 17, 18, 389, 486, 2242, 3956, 3957, 17, 18, 2589, + 184, 427, 3963, 2251, 2252, 3966, 3967, 1082, 204, 1335, + 429, 659, 344, 204, 1340, 17, 18, 17, 18, 17, + 18, 432, 3983, 1349, 17, 18, 1453, 12, 1354, 1355, + 17, 18, 427, 2564, 659, 391, 3997, 629, 2061, 659, + 4001, 4002, 4003, 4004, 4005, 537, 603, 0, 486, 367, + 1948, 659, 432, 1379, 1380, 147, 17, 18, 2473, 243, + 428, 4564, 659, 2880, 90, 441, 659, 387, 2483, 640, + 6, 640, 1398, 565, 2322, 2323, 2324, 2325, 4660, 386, + 1406, 1371, 389, 1418, 295, 1411, 112, 1413, 659, 3029, + 659, 2973, 1418, 607, 17, 18, 597, 1524, 4601, 4602, + 657, 386, 640, 4898, 389, 243, 2696, 386, 1434, 504, + 389, 486, 486, 537, 2696, 17, 18, 17, 18, 1445, + 2244, 659, 659, 3351, 60, 129, 609, 1453, 132, 1419, + 624, 17, 18, 1468, 4493, 164, 4495, 321, 4641, 1465, + 4445, 645, 1468, 386, 462, 133, 389, 583, 133, 564, + 2048, 3021, 3022, 3023, 386, 17, 18, 389, 1134, 1135, + 278, 434, 1957, 599, 657, 2732, 55, 4229, 1494, 1495, + 4232, 3431, 1498, 1377, 2141, 3435, 494, 66, 362, 386, + 588, 1507, 389, 321, 368, 1475, 1647, 17, 18, 193, + 3940, 1517, 17, 18, 17, 18, 17, 18, 1524, 1525, + 545, 243, 659, 2327, 1180, 640, 243, 4290, 1534, 2543, + 658, 556, 3094, 2337, 4526, 1642, 152, 414, 222, 657, + 1546, 1547, 134, 419, 659, 1560, 2132, 1562, 419, 4707, + 174, 1557, 1558, 1559, 1560, 1561, 1562, 4171, 1665, 4173, + 586, 4520, 495, 640, 386, 1571, 1572, 389, 1574, 376, + 2062, 4442, 1578, 4835, 4836, 1682, 636, 1557, 1558, 1559, + 201, 1561, 659, 2211, 1599, 253, 2062, 2215, 2216, 387, + 543, 569, 1572, 1599, 572, 3219, 3220, 404, 1578, 321, + 4363, 4364, 657, 657, 191, 215, 661, 1577, 292, 21, + 650, 651, 652, 653, 654, 655, 2863, 3210, 629, 386, + 46, 2868, 389, 3090, 502, 495, 386, 651, 386, 389, + 251, 389, 224, 2200, 658, 2498, 1642, 1643, 219, 665, + 652, 653, 654, 655, 367, 105, 368, 3225, 17, 18, + 526, 368, 663, 640, 1669, 4165, 17, 18, 133, 1665, + 1666, 1667, 1668, 1669, 2860, 2703, 4368, 3575, 1552, 1553, + 4629, 2703, 659, 3251, 3252, 640, 1682, 541, 586, 386, + 267, 640, 389, 264, 2669, 2200, 386, 371, 559, 389, + 1705, 537, 129, 565, 659, 364, 365, 129, 1704, 1705, + 659, 645, 292, 295, 386, 581, 386, 389, 386, 389, + 581, 389, 645, 386, 1720, 284, 389, 640, 1688, 386, + 651, 3073, 389, 601, 447, 166, 138, 658, 640, 155, + 17, 18, 665, 738, 739, 1741, 659, 1743, 17, 18, + 4354, 2882, 17, 18, 2607, 386, 622, 659, 389, 365, + 3107, 622, 2986, 640, 215, 3348, 4049, 665, 565, 3073, + 624, 193, 17, 18, 2056, 643, 387, 83, 241, 17, + 18, 617, 659, 17, 18, 645, 645, 2697, 17, 18, + 367, 371, 631, 386, 244, 657, 389, 25, 3058, 657, + 2653, 264, 1933, 17, 18, 665, 3058, 665, 17, 18, + 261, 261, 243, 657, 386, 665, 386, 389, 813, 389, + 659, 665, 232, 273, 234, 431, 13, 433, 640, 541, + 386, 17, 18, 389, 541, 2753, 1832, 1833, 2756, 2757, + 2477, 2759, 432, 2818, 2762, 2763, 4346, 659, 2766, 495, + 17, 18, 1949, 2771, 386, 17, 18, 389, 2776, 2777, + 2778, 2779, 2780, 453, 3050, 292, 2784, 2785, 2370, 2787, + 292, 17, 18, 2375, 628, 2793, 2794, 2795, 2796, 874, + 3490, 2799, 2800, 640, 2802, 198, 386, 2389, 201, 389, + 640, 386, 640, 386, 389, 386, 389, 1893, 389, 489, + 2031, 219, 659, 17, 18, 355, 18, 2521, 215, 659, + 2524, 659, 624, 455, 588, 254, 2826, 624, 17, 18, + 235, 2423, 17, 18, 17, 18, 232, 377, 234, 17, + 18, 1936, 136, 17, 18, 274, 387, 368, 2732, 1935, + 1936, 17, 18, 640, 371, 631, 264, 235, 2866, 371, + 640, 186, 1948, 1949, 215, 17, 18, 263, 20, 142, + 147, 381, 659, 17, 18, 2062, 1962, 115, 640, 659, + 640, 1967, 640, 659, 287, 568, 1972, 640, 50, 1975, + 2077, 1986, 1987, 640, 1989, 251, 658, 2544, 2490, 659, + 1986, 1987, 3277, 1989, 2608, 3255, 659, 1957, 3612, 645, + 199, 201, 659, 3255, 2561, 2608, 614, 44, 2013, 640, + 17, 18, 2017, 2495, 2010, 52, 4564, 2013, 2115, 665, + 470, 2017, 3307, 4627, 4628, 17, 18, 386, 659, 2495, + 389, 556, 17, 18, 559, 386, 494, 224, 389, 2544, + 295, 2046, 2047, 247, 505, 17, 18, 640, 2044, 2045, + 2046, 2047, 2048, 4601, 4602, 2560, 2561, 556, 17, 18, + 559, 505, 2067, 2068, 2069, 2061, 2062, 245, 640, 2863, + 640, 2067, 2068, 2069, 2868, 658, 254, 225, 3692, 486, + 495, 2077, 2042, 2674, 640, 284, 235, 659, 663, 659, + 17, 18, 542, 4641, 492, 2100, 2092, 3568, 2674, 17, + 18, 13, 241, 659, 2100, 3070, 658, 659, 640, 386, + 541, 3348, 389, 241, 2110, 616, 3026, 386, 619, 2115, + 389, 386, 241, 622, 389, 559, 658, 1122, 609, 364, + 365, 17, 18, 45, 665, 370, 2132, 17, 18, 3143, + 640, 386, 17, 18, 389, 640, 559, 640, 386, 640, + 604, 389, 386, 3355, 526, 389, 2152, 386, 658, 556, + 389, 588, 559, 658, 174, 658, 588, 658, 17, 18, + 369, 2453, 386, 657, 4746, 389, 6, 386, 659, 2184, + 389, 3156, 3384, 3385, 665, 158, 98, 2147, 2184, 2149, + 3149, 103, 2697, 624, 3541, 3036, 3037, 3038, 3039, 3052, + 386, 576, 2168, 389, 129, 3407, 659, 17, 18, 606, + 105, 17, 18, 129, 392, 17, 18, 2213, 2214, 386, + 657, 2217, 389, 665, 386, 657, 4798, 389, 659, 4801, + 645, 779, 632, 633, 17, 18, 17, 18, 657, 3425, + 386, 17, 18, 389, 2214, 393, 17, 18, 1069, 20, + 665, 455, 657, 801, 1075, 1076, 404, 17, 18, 659, + 34, 4833, 2267, 411, 2361, 3525, 814, 815, 193, 2229, + 657, 2267, 386, 2269, 2831, 389, 2373, 193, 2238, 2239, + 586, 640, 486, 201, 658, 659, 657, 386, 129, 640, + 389, 386, 657, 386, 389, 486, 389, 222, 386, 658, + 657, 389, 386, 609, 657, 389, 222, 658, 657, 486, + 386, 85, 657, 389, 3574, 657, 3234, 494, 609, 62, + 63, 2826, 3574, 657, 386, 81, 2831, 389, 657, 3247, + 73, 12, 386, 520, 521, 389, 523, 1399, 525, 3624, + 1402, 657, 2338, 1405, 256, 2341, 168, 657, 583, 244, + 474, 179, 193, 626, 627, 542, 629, 556, 631, 657, + 559, 657, 510, 640, 599, 2361, 261, 292, 659, 2466, + 657, 640, 657, 3658, 665, 640, 292, 2373, 273, 386, + 3073, 658, 389, 205, 3669, 17, 18, 3672, 162, 658, + 658, 659, 565, 658, 386, 640, 541, 389, 2495, 603, + 2497, 386, 640, 3313, 389, 657, 640, 3021, 3022, 3023, + 657, 640, 179, 658, 386, 4463, 2698, 389, 657, 331, + 658, 657, 613, 614, 658, 657, 640, 386, 244, 658, + 389, 640, 4639, 557, 115, 257, 613, 614, 562, 658, + 659, 197, 4638, 609, 658, 261, 371, 269, 3634, 658, + 657, 292, 133, 657, 640, 371, 2738, 273, 606, 386, + 355, 657, 389, 3077, 3078, 3079, 657, 83, 386, 657, + 2466, 389, 658, 640, 3077, 3078, 3079, 657, 640, 2981, + 657, 657, 606, 395, 568, 241, 658, 659, 658, 659, + 3081, 658, 657, 174, 640, 2491, 658, 657, 622, 2495, + 386, 2497, 2498, 389, 657, 18, 386, 83, 264, 389, + 657, 386, 658, 4339, 389, 658, 659, 4343, 418, 2616, + 657, 3026, 657, 204, 657, 2521, 640, 657, 2524, 474, + 371, 3036, 3037, 3038, 3039, 657, 358, 386, 61, 657, + 389, 640, 657, 3518, 658, 640, 3160, 640, 658, 659, + 166, 657, 640, 3557, 3348, 2837, 640, 3160, 384, 658, + 2842, 568, 556, 658, 640, 658, 3570, 2563, 2850, 2851, + 658, 658, 659, 377, 2856, 470, 386, 657, 640, 389, + 386, 4038, 658, 389, 386, 576, 640, 389, 81, 658, + 659, 3851, 657, 2589, 657, 4038, 3214, 2593, 657, 3851, + 3218, 129, 514, 386, 658, 386, 389, 288, 389, 18, + 386, 2607, 2608, 389, 3745, 386, 13, 657, 389, 657, + 2616, 657, 2719, 2720, 658, 659, 386, 243, 2624, 389, + 2626, 2627, 37, 640, 657, 148, 658, 659, 658, 659, + 414, 553, 3233, 299, 300, 401, 58, 542, 640, 658, + 659, 2647, 129, 2649, 470, 640, 68, 2653, 63, 315, + 183, 417, 436, 588, 187, 193, 658, 243, 640, 657, + 82, 657, 588, 658, 657, 198, 658, 659, 2674, 657, + 3780, 640, 94, 95, 96, 3945, 658, 2647, 4514, 213, + 658, 659, 657, 3945, 222, 4521, 20, 2651, 472, 658, + 2696, 113, 658, 659, 197, 4319, 4320, 658, 659, 657, + 2706, 2716, 2717, 640, 119, 2711, 193, 122, 62, 63, + 2716, 2717, 640, 2719, 2720, 130, 542, 657, 35, 658, + 659, 658, 377, 658, 66, 158, 159, 657, 419, 148, + 4788, 2711, 3038, 3039, 149, 222, 362, 588, 241, 81, + 147, 3239, 368, 657, 640, 232, 657, 234, 532, 657, + 640, 93, 658, 659, 292, 640, 4462, 662, 658, 659, + 66, 264, 658, 657, 2734, 2735, 2736, 2737, 658, 2739, + 2740, 105, 659, 658, 657, 81, 362, 657, 444, 445, + 657, 640, 368, 657, 318, 319, 657, 93, 657, 323, + 324, 325, 2798, 297, 657, 299, 300, 330, 3313, 658, + 148, 492, 4014, 658, 659, 292, 162, 2813, 658, 659, + 657, 315, 438, 645, 646, 647, 657, 224, 657, 2825, + 640, 344, 657, 2829, 640, 237, 4178, 657, 640, 657, + 164, 148, 657, 371, 657, 526, 512, 252, 658, 4326, + 52, 4899, 658, 658, 127, 663, 658, 640, 289, 640, + 52, 2992, 438, 3762, 640, 197, 666, 129, 659, 640, + 132, 203, 196, 384, 198, 658, 557, 658, 2838, 2839, + 640, 2841, 658, 2843, 2844, 2845, 2846, 2847, 2848, 2849, + 377, 215, 2852, 3395, 371, 2855, 220, 201, 658, 2859, + 480, 197, 377, 148, 597, 428, 20, 203, 50, 241, + 658, 659, 278, 237, 28, 1273, 1274, 3531, 201, 3016, + 244, 333, 4748, 4749, 417, 541, 652, 251, 3531, 658, + 659, 193, 264, 658, 659, 344, 494, 261, 665, 351, + 505, 622, 173, 129, 3226, 241, 3228, 254, 3450, 273, + 444, 445, 357, 3235, 278, 658, 659, 230, 657, 73, + 222, 658, 659, 287, 198, 541, 537, 3249, 264, 83, + 277, 658, 659, 556, 3256, 3257, 3567, 593, 658, 659, + 512, 129, 658, 659, 497, 498, 3083, 3269, 3270, 3271, + 518, 3567, 537, 3275, 3276, 289, 3614, 658, 659, 3617, + 3618, 658, 659, 658, 659, 165, 344, 193, 624, 254, + 658, 659, 92, 3009, 198, 3011, 659, 593, 132, 659, + 3016, 658, 659, 3028, 3020, 3021, 3022, 3023, 658, 659, + 292, 355, 3028, 3315, 3316, 3317, 222, 344, 378, 3035, + 658, 659, 552, 659, 658, 193, 658, 659, 624, 658, + 659, 164, 464, 377, 4396, 3051, 3052, 364, 365, 132, + 588, 334, 3058, 387, 3963, 338, 118, 3966, 3967, 401, + 482, 664, 345, 6, 222, 3973, 3974, 3073, 383, 3977, + 117, 3077, 3078, 3079, 3983, 417, 4, 3083, 497, 498, + 658, 659, 485, 207, 3090, 419, 4297, 502, 3996, 344, + 622, 4201, 4001, 254, 4002, 659, 292, 4584, 401, 371, + 59, 588, 658, 659, 658, 659, 4216, 162, 232, 3115, + 234, 417, 83, 520, 521, 522, 523, 524, 525, 447, + 91, 665, 544, 659, 441, 648, 649, 650, 651, 652, + 653, 654, 655, 73, 292, 542, 470, 3244, 63, 561, + 264, 658, 659, 426, 3436, 3115, 1987, 118, 1989, 497, + 498, 4059, 4348, 13, 3160, 3483, 3484, 572, 3173, 3165, + 494, 3176, 658, 3455, 658, 659, 628, 3173, 658, 659, + 3176, 3177, 658, 515, 147, 371, 658, 659, 658, 659, + 497, 498, 658, 659, 4104, 3165, 601, 658, 659, 658, + 659, 4461, 658, 659, 119, 166, 513, 122, 10, 4461, + 659, 484, 658, 659, 39, 130, 658, 3213, 542, 515, + 658, 659, 665, 371, 658, 3224, 3222, 3223, 658, 129, + 665, 3230, 132, 3229, 149, 657, 2067, 2068, 2069, 648, + 649, 650, 651, 652, 653, 654, 655, 277, 3244, 3245, + 364, 365, 497, 498, 3250, 3254, 370, 658, 659, 3255, + 3265, 3260, 665, 377, 3826, 3827, 598, 3266, 3267, 3265, + 377, 3231, 3232, 597, 4278, 3832, 166, 664, 4464, 194, + 241, 3277, 289, 289, 608, 609, 289, 289, 3284, 3285, + 14, 52, 289, 193, 3290, 289, 659, 122, 659, 3259, + 645, 3919, 598, 417, 129, 629, 129, 631, 556, 132, + 4208, 3307, 650, 651, 652, 653, 654, 655, 657, 4217, + 231, 645, 222, 235, 284, 659, 588, 3832, 4226, 201, + 3290, 402, 294, 4231, 658, 659, 663, 252, 662, 663, + 659, 648, 649, 650, 651, 652, 653, 654, 655, 4259, + 3346, 576, 129, 626, 3350, 132, 659, 576, 666, 320, + 401, 186, 576, 645, 659, 198, 629, 659, 193, 642, + 193, 603, 254, 115, 659, 665, 490, 73, 339, 191, + 104, 659, 659, 4483, 4484, 537, 4486, 254, 148, 255, + 554, 652, 292, 205, 188, 198, 537, 222, 223, 222, + 659, 362, 588, 648, 649, 650, 651, 652, 653, 654, + 655, 173, 136, 509, 406, 179, 193, 4603, 204, 174, + 143, 657, 20, 405, 659, 658, 4686, 56, 152, 659, + 86, 628, 88, 83, 4686, 4410, 604, 608, 3535, 354, + 588, 659, 357, 201, 652, 222, 658, 97, 3444, 4549, + 174, 658, 658, 658, 178, 267, 3452, 269, 658, 4202, + 4203, 203, 658, 658, 658, 201, 190, 292, 659, 292, + 651, 371, 4215, 658, 4031, 657, 132, 657, 4664, 4222, + 658, 148, 658, 658, 598, 658, 597, 659, 658, 213, + 4233, 4234, 3452, 659, 495, 658, 658, 655, 657, 241, + 156, 657, 657, 137, 658, 565, 659, 105, 3504, 659, + 659, 4611, 565, 4613, 4614, 292, 4426, 241, 565, 434, + 576, 233, 4432, 247, 233, 242, 4031, 659, 657, 3525, + 3526, 356, 251, 3529, 548, 3531, 192, 12, 657, 3535, + 3637, 366, 4517, 13, 213, 370, 371, 201, 371, 361, + 659, 177, 565, 4471, 4472, 475, 659, 4475, 4476, 4477, + 4478, 4526, 215, 287, 3560, 28, 164, 496, 665, 657, + 198, 3567, 3568, 4774, 198, 657, 275, 658, 3574, 665, + 541, 659, 659, 3579, 344, 201, 665, 254, 3593, 665, + 427, 659, 602, 4511, 371, 494, 557, 3593, 659, 4104, + 198, 198, 659, 377, 416, 377, 353, 526, 485, 3608, + 73, 148, 3572, 526, 4589, 4875, 266, 215, 526, 3615, + 83, 526, 220, 4875, 526, 105, 4886, 3619, 3624, 377, + 4890, 3627, 198, 131, 4886, 4895, 657, 568, 4890, 659, + 645, 3637, 4843, 4895, 288, 3641, 244, 3643, 3644, 645, + 4548, 604, 4550, 251, 645, 645, 105, 572, 645, 645, + 645, 3657, 3658, 261, 645, 645, 645, 645, 645, 132, + 645, 645, 645, 3669, 645, 273, 3672, 344, 3638, 645, + 278, 4599, 4600, 609, 162, 250, 601, 3647, 588, 287, + 4608, 645, 342, 645, 3699, 645, 420, 645, 645, 645, + 3696, 665, 658, 3699, 250, 4301, 665, 658, 3704, 7, + 486, 576, 576, 3709, 658, 115, 440, 367, 658, 658, + 3716, 658, 658, 658, 448, 659, 658, 665, 3724, 471, + 576, 645, 456, 636, 659, 3731, 645, 497, 498, 395, + 565, 665, 83, 659, 569, 284, 3716, 572, 50, 89, + 492, 4033, 645, 4035, 4259, 4037, 97, 355, 583, 657, + 17, 18, 486, 588, 244, 588, 591, 4867, 657, 232, + 657, 234, 576, 515, 174, 499, 500, 657, 384, 377, + 430, 261, 645, 439, 201, 201, 201, 177, 659, 387, + 659, 390, 261, 273, 261, 244, 50, 220, 341, 4081, + 141, 264, 565, 4085, 204, 4422, 565, 344, 258, 3906, + 432, 588, 261, 371, 659, 335, 4726, 559, 7, 657, + 562, 419, 197, 377, 273, 650, 651, 551, 118, 118, + 497, 498, 81, 645, 646, 647, 576, 401, 401, 401, + 143, 241, 262, 557, 262, 3841, 401, 557, 143, 58, + 3846, 401, 50, 401, 403, 3851, 598, 581, 450, 68, + 401, 401, 663, 3823, 606, 401, 123, 124, 125, 126, + 127, 215, 470, 82, 657, 355, 526, 657, 657, 603, + 665, 605, 657, 652, 4480, 94, 95, 96, 288, 649, + 650, 651, 652, 653, 654, 655, 494, 377, 252, 252, + 657, 364, 365, 657, 113, 658, 355, 370, 658, 658, + 3906, 657, 3908, 3909, 377, 658, 657, 3913, 4893, 658, + 39, 4426, 659, 432, 659, 266, 3922, 4432, 658, 3925, + 3926, 665, 658, 658, 652, 3931, 384, 3933, 4848, 377, + 3900, 3937, 657, 237, 542, 658, 279, 401, 659, 3945, + 454, 350, 4049, 3949, 417, 3951, 659, 658, 665, 201, + 497, 498, 261, 4873, 261, 387, 658, 658, 432, 645, + 227, 228, 229, 230, 659, 659, 466, 657, 4109, 630, + 118, 648, 649, 650, 651, 652, 653, 654, 655, 401, + 470, 235, 264, 264, 665, 28, 657, 30, 576, 597, + 217, 342, 659, 122, 663, 4287, 4288, 4289, 50, 658, + 129, 609, 659, 658, 414, 657, 488, 658, 631, 419, + 658, 470, 275, 364, 365, 4021, 367, 490, 468, 62, + 63, 629, 65, 631, 182, 287, 213, 565, 155, 271, + 73, 659, 4038, 658, 658, 486, 261, 645, 659, 261, + 83, 512, 377, 4049, 635, 657, 657, 657, 91, 4019, + 658, 659, 542, 658, 662, 663, 659, 186, 658, 264, + 264, 471, 659, 659, 193, 631, 658, 334, 657, 336, + 337, 338, 20, 415, 377, 118, 377, 83, 345, 430, + 240, 198, 492, 542, 198, 198, 278, 4688, 658, 132, + 568, 658, 135, 222, 223, 658, 658, 658, 371, 63, + 252, 648, 649, 650, 651, 652, 653, 654, 655, 341, + 658, 4258, 266, 658, 333, 658, 658, 427, 658, 386, + 659, 18, 389, 166, 4130, 598, 384, 631, 251, 4135, + 657, 659, 351, 4139, 658, 75, 665, 609, 658, 609, + 657, 419, 4148, 659, 481, 657, 20, 557, 658, 4155, + 179, 132, 562, 609, 132, 559, 657, 413, 657, 426, + 657, 87, 4168, 292, 504, 151, 132, 665, 37, 371, + 4185, 581, 659, 341, 181, 526, 144, 658, 4187, 4185, + 264, 565, 565, 565, 559, 280, 251, 4193, 657, 232, + 613, 234, 609, 609, 4335, 658, 606, 659, 241, 377, + 383, 658, 657, 528, 619, 248, 317, 619, 177, 475, + 465, 4726, 622, 658, 658, 4821, 483, 484, 659, 64, + 263, 4223, 384, 603, 547, 50, 50, 356, 161, 4235, + 50, 4237, 466, 657, 371, 251, 657, 657, 657, 657, + 15, 370, 371, 657, 4250, 377, 603, 132, 4250, 264, + 20, 264, 370, 645, 631, 531, 200, 177, 657, 143, + 143, 567, 166, 482, 28, 50, 30, 50, 50, 198, + 657, 657, 398, 366, 371, 614, 657, 320, 548, 658, + 658, 4296, 658, 657, 657, 657, 657, 4394, 163, 659, + 4296, 658, 657, 4299, 287, 12, 339, 658, 62, 63, + 66, 65, 547, 384, 657, 66, 6, 50, 657, 73, + 50, 657, 12, 657, 14, 141, 198, 658, 151, 83, + 5, 659, 377, 377, 658, 544, 658, 91, 28, 603, + 30, 384, 440, 4848, 4340, 384, 136, 582, 659, 475, + 658, 233, 561, 4635, 658, 157, 264, 592, 50, 477, + 237, 394, 371, 396, 118, 657, 494, 2651, 4873, 626, + 60, 404, 659, 934, 609, 65, 4037, 2504, 132, 2857, + 4033, 135, 1054, 640, 641, 642, 4508, 4035, 623, 3206, + 4153, 1107, 4625, 83, 4506, 4795, 4791, 4333, 4394, 1131, + 4578, 91, 4027, 52, 610, 1972, 2060, 3009, 3833, 695, + 2289, 101, 166, 1179, 4406, 3036, 2560, 1691, 1937, 4524, + 2562, 2561, 4345, 2812, 3667, 2264, 3046, 3845, 118, 3051, + 3504, 1450, 4428, 4429, 4594, 4395, 4297, 4690, 3848, 4843, + 4782, 4821, 132, 476, 2208, 135, 565, 4480, 4162, 2805, + 569, 3284, 3913, 572, 144, 3287, 4668, 4856, 2813, 694, + 3376, 3703, 152, 3974, 583, 4461, 4381, 4007, 4406, 588, + 160, 4688, 591, 4394, 4046, 2719, 166, 2956, 232, 3432, + 234, 3435, 3427, 718, 4797, 84, 84, 241, 723, 4748, + 4621, 4749, 4169, 4521, 248, 4630, 4514, 4493, 4340, 4495, + 4216, 534, 535, 536, 2812, 3280, 196, 4604, 541, 263, + 1081, 1144, 1616, 4191, 2693, 2583, 2269, 4682, 1731, 3932, + 3028, 2046, 1705, 277, 557, 2551, 761, 560, 3491, 2612, + 1098, 650, 651, 991, 2460, 4421, 4532, 4668, 4534, 4535, + 2106, 3452, 232, 778, 234, 4541, 579, 1004, 2369, 4666, + 4510, 241, 2992, 2365, 1236, 2634, 3543, 2639, 248, 4786, + 2974, 4498, 4322, 3731, 597, 4787, 320, 3807, 4564, 1208, + 2484, 3945, 3437, 263, 1636, 3090, 4137, 1636, 3276, 4449, + 4790, 3083, 4578, 4136, 4136, 339, 4578, 822, 823, 824, + 825, 2338, 84, 1468, 1418, 2545, 3851, 287, 4594, 834, + 3520, 2588, 3519, 3574, 4564, 4686, 621, 1741, 4604, 714, + 4707, 609, 2687, 109, 1115, 2179, 609, 2180, 1960, 4624, + 1565, 3951, 4085, 1476, 3494, 4841, 659, 4307, 4624, 4859, + 320, 4895, 811, 4490, 869, 4890, 1517, 4597, 4598, 4396, + 394, 3525, 396, 2672, 608, 4641, 1890, 608, 3567, 339, + 404, 2665, 2135, 343, 4650, 4651, 2664, 2017, 4654, 4790, + 1496, 600, 150, 4794, 978, 4285, 1642, 2607, 2524, 4292, + 1408, 3011, 601, 3292, 1107, 910, 985, 1644, 645, 645, + 645, 4641, 1107, 4780, -1, -1, 4682, -1, 1107, -1, + 4686, 926, 927, -1, -1, 930, -1, 387, -1, -1, + -1, -1, -1, -1, 394, -1, 396, -1, -1, -1, + -1, 4707, -1, -1, 404, 950, -1, -1, -1, -1, + -1, -1, 476, -1, -1, -1, -1, 962, 37, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4698, 4699, + -1, -1, -1, -1, -1, -1, -1, -1, 236, 4745, + 238, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 450, -1, -1, -1, -1, 4896, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 534, 535, 536, -1, 4780, 4882, 476, 541, -1, -1, + 4786, 4787, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 557, -1, -1, 560, -1, 296, -1, + 298, 299, 300, 301, 302, -1, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 579, 314, 315, 316, -1, + -1, 140, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 597, 534, 535, 536, -1, -1, -1, + -1, 541, -1, -1, -1, -1, -1, 166, -1, -1, + 169, -1, -1, -1, -1, -1, -1, 557, -1, -1, + 560, -1, -1, -1, -1, -1, -1, -1, -1, 4875, + -1, -1, -1, -1, -1, -1, 4882, -1, -1, 579, + 4886, -1, -1, 4853, 4890, -1, -1, 206, -1, 4895, + -1, -1, -1, 657, -1, -1, -1, 597, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 226, -1, -1, + -1, -1, -1, 232, 1159, 234, -1, 1162, 1163, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 123, 124, 125, 126, 127, -1, -1, -1, + -1, -1, 1187, 1188, -1, -1, 444, 445, -1, -1, + -1, 1196, 1197, 1198, 1199, 1200, 1201, 1202, 1203, 1204, + 1205, 1206, 1207, -1, -1, -1, -1, -1, -1, -1, + 289, 1216, 1217, -1, 1219, 1220, -1, -1, -1, 1224, + 1225, -1, -1, 1228, 1229, 1230, 1231, -1, 1233, 1234, + 1235, -1, -1, -1, 313, -1, -1, 1242, 1243, -1, + 1245, 1246, 1247, 1248, 1249, -1, -1, 1252, 1253, 1254, + 1255, 1256, 1257, 1258, 1259, 1260, 1261, 1262, -1, 1264, + -1, -1, 1267, 1268, -1, -1, -1, 1272, -1, -1, + -1, 1276, 1277, 1278, -1, -1, 227, 228, 229, 230, + -1, 6, -1, 1288, 1289, 1290, -1, 12, -1, 14, + -1, 16, 1297, -1, -1, -1, -1, -1, -1, 1304, + 1305, 1306, 1307, 28, -1, 30, -1, -1, -1, -1, + 1315, 1316, 1317, -1, 1319, 1320, 1321, 1322, 1323, -1, + 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, -1, -1, + -1, 1336, 1337, -1, -1, 60, -1, -1, -1, 418, + 65, 66, -1, -1, -1, -1, 71, -1, 427, -1, + -1, -1, -1, -1, -1, -1, -1, 37, 83, -1, + -1, -1, -1, 442, -1, -1, 91, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 101, -1, -1, -1, + -1, 460, -1, 334, -1, 336, 337, 338, -1, -1, + -1, -1, -1, 118, 345, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 132, -1, -1, + 135, -1, -1, -1, -1, -1, -1, 1422, -1, 144, + 145, -1, -1, -1, -1, 504, -1, 152, 507, -1, + -1, -1, -1, 1438, -1, 160, -1, -1, -1, 164, + -1, 166, -1, -1, -1, -1, -1, -1, -1, -1, + 623, 176, -1, -1, -1, -1, -1, -1, 537, -1, + 140, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 196, -1, -1, -1, 426, -1, 556, -1, -1, + 559, -1, -1, -1, -1, -1, 166, -1, -1, 169, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 232, -1, 234, + -1, -1, 1517, -1, 239, -1, 241, -1, -1, -1, + -1, 694, -1, 248, -1, -1, 206, 1532, -1, 36, + 37, -1, 483, 484, -1, 42, -1, 44, 263, 46, + 47, -1, -1, -1, 1549, -1, 226, -1, -1, -1, + 723, -1, 232, -1, 234, -1, 63, -1, -1, -1, + -1, -1, 287, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 761, -1, + -1, -1, -1, -1, -1, 320, -1, -1, -1, -1, + -1, 1606, -1, -1, -1, 778, -1, -1, -1, 289, + -1, -1, 119, -1, 339, 122, -1, -1, 343, -1, + -1, -1, -1, 130, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 313, -1, -1, -1, -1, -1, -1, + -1, -1, 149, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 825, -1, -1, -1, -1, 382, -1, -1, + 167, -1, 387, -1, -1, -1, -1, -1, -1, 394, + -1, 396, -1, -1, -1, 626, 401, -1, -1, 404, + -1, -1, -1, -1, -1, 192, -1, 194, -1, -1, + 641, 642, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 208, 209, -1, -1, -1, -1, -1, -1, 1714, + 435, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 449, 450, 451, 452, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 910, 418, -1, + -1, -1, -1, -1, -1, 252, -1, 427, -1, 1754, + -1, 476, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 442, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 281, -1, -1, 950, -1, -1, + 460, -1, -1, 290, 291, -1, 293, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 534, + 535, 536, -1, -1, -1, -1, 541, -1, -1, -1, + 327, 328, 329, -1, 504, -1, -1, 507, -1, -1, + -1, -1, 557, -1, -1, 560, -1, -1, -1, 346, + 347, 348, -1, -1, -1, -1, -1, 354, -1, -1, + 357, -1, -1, -1, 579, -1, -1, 537, -1, 584, + -1, -1, -1, 1868, 1869, 1870, 373, 374, -1, -1, + -1, -1, 597, -1, -1, -1, -1, -1, 1883, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 409, 410, 1909, -1, -1, -1, -1, -1, + 1915, -1, -1, 1918, -1, 1920, -1, -1, -1, -1, + -1, 1926, -1, 1928, 1929, -1, -1, 434, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 663, -1, + -1, -1, -1, -1, -1, 28, -1, 30, -1, -1, + -1, -1, -1, -1, -1, 1960, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, + 63, -1, 65, 490, -1, -1, 1159, 494, -1, 1162, + 73, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 83, 508, -1, -1, -1, -1, -1, -1, 91, -1, + -1, -1, -1, -1, 1187, 1188, -1, -1, -1, -1, + -1, -1, -1, 1196, 1197, -1, -1, 1200, 1201, 1202, + 1203, 1204, 1205, 1206, 1207, 118, 2041, -1, -1, -1, + -1, -1, -1, 1216, 1217, 2050, 1219, 1220, -1, 132, + -1, 1224, 135, -1, -1, 1228, 1229, 1230, 1231, 566, + -1, 1234, 569, -1, -1, 572, 573, 574, 575, 1242, + 1243, -1, 1245, 1246, 2079, -1, -1, -1, -1, 1252, + 1253, 1254, -1, 166, 1257, 1258, 1259, 1260, 1261, 1262, + -1, 1264, -1, -1, 1267, 1268, -1, -1, 13, 1272, + -1, -1, -1, 1276, 1277, 1278, -1, 2112, 615, 616, + -1, 26, -1, -1, -1, 1288, 1289, 1290, -1, -1, + -1, -1, 37, 38, 1297, -1, -1, -1, 2133, -1, + -1, 1304, 1305, 1306, -1, 642, 2141, -1, -1, -1, + -1, -1, -1, -1, -1, 2150, -1, 62, 63, 232, + -1, 234, -1, -1, -1, -1, -1, -1, 241, 74, + -1, -1, -1, -1, 1337, 248, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 263, -1, -1, -1, -1, 100, -1, 102, -1, 104, + -1, -1, -1, -1, -1, 2200, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 138, 139, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 320, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1422, + 165, 166, -1, -1, -1, 170, 339, -1, 173, 2264, + -1, -1, -1, -1, -1, 1438, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2285, -1, -1, -1, -1, -1, -1, 202, -1, 204, + -1, -1, -1, -1, -1, -1, -1, 212, -1, 214, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 394, -1, 396, -1, -1, -1, 232, -1, 234, + -1, 404, -1, -1, -1, 240, 241, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2347, -1, 1517, -1, 2351, 262, -1, -1, + -1, 2356, 2357, -1, -1, -1, -1, -1, -1, 1532, + 2365, -1, 2367, -1, 2369, 2370, 2371, 2372, -1, 284, + 2375, -1, -1, -1, -1, -1, 1549, -1, -1, -1, + 2385, 2386, -1, 2388, 2389, -1, 2391, 2392, 2393, 2394, + -1, 2396, -1, 476, 2399, -1, -1, -1, 313, -1, + -1, -1, -1, 2408, -1, -1, -1, -1, -1, -1, + 2415, -1, 2417, -1, 2419, 2420, -1, 2422, 2423, -1, + -1, -1, 2427, 2428, 2429, -1, -1, -1, 2433, 2434, + 2435, -1, 2437, 1606, 2439, -1, 2441, -1, 2443, -1, + 2445, -1, 28, -1, 30, 2450, -1, -1, -1, -1, + -1, 534, 535, 536, -1, -1, -1, -1, 541, -1, + -1, -1, 2467, -1, -1, -1, 381, -1, -1, 2474, + -1, -1, 2477, -1, 557, -1, -1, 560, 2483, 65, + -1, 2486, -1, -1, -1, 2490, -1, -1, -1, -1, + -1, -1, 407, -1, -1, -1, 579, 83, -1, -1, + -1, -1, -1, 418, 419, 91, -1, 422, 423, -1, + -1, -1, -1, -1, 597, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 443, -1, + -1, -1, 118, -1, -1, -1, -1, -1, -1, 2544, + -1, -1, -1, -1, -1, -1, 132, -1, -1, 135, + -1, -1, -1, -1, -1, 2560, 2561, 2562, -1, 2564, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 491, -1, -1, -1, + 166, 1754, -1, -1, -1, -1, -1, -1, -1, 504, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 537, -1, -1, -1, 541, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2642, -1, -1, + -1, -1, -1, -1, 559, -1, 232, -1, 234, -1, + -1, -1, -1, -1, -1, 241, -1, -1, -1, -1, + -1, -1, 248, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 263, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2697, -1, -1, 1868, 1869, 1870, -1, -1, + -1, -1, 617, -1, -1, -1, -1, -1, -1, -1, + 625, -1, -1, 2718, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2731, -1, -1, -1, + -1, -1, -1, -1, 320, -1, 1909, -1, 2743, 2744, + -1, -1, -1, -1, -1, 1918, -1, 1920, -1, -1, + -1, -1, -1, 339, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2805, -1, -1, -1, -1, -1, -1, -1, 394, -1, + 396, -1, -1, -1, -1, -1, -1, -1, 404, -1, + -1, 2826, -1, -1, -1, -1, 2831, 2832, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2861, 2862, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2041, -1, + -1, -1, -1, -1, -1, -1, -1, 2050, -1, -1, + -1, 2886, -1, -1, -1, 2890, -1, -1, -1, -1, + 476, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2079, -1, -1, -1, + -1, -1, 2917, 2918, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2938, -1, -1, -1, -1, -1, 2112, + -1, -1, 2947, -1, 2949, -1, 2951, -1, 534, 535, + 536, -1, -1, -1, -1, 541, -1, -1, -1, -1, + 2133, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 557, -1, -1, 560, -1, 2981, 2150, -1, -1, + -1, 2986, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 579, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 597, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3026, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3036, 3037, 3038, 3039, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 3084, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3111, -1, -1, -1, + -1, -1, 2285, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3131, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2347, -1, -1, 3182, 2351, -1, + -1, -1, -1, 2356, 2357, -1, -1, -1, -1, -1, + -1, -1, 2365, -1, 2367, -1, 2369, -1, 2371, 2372, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2385, 2386, -1, 2388, -1, -1, 2391, 2392, + 2393, 2394, -1, 2396, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2408, -1, -1, -1, -1, + -1, -1, 2415, -1, 2417, -1, 2419, 2420, -1, 2422, + -1, -1, -1, -1, 2427, 2428, 2429, -1, -1, -1, + 2433, 2434, 2435, -1, 2437, -1, 2439, -1, 2441, -1, + 2443, -1, 2445, -1, -1, 3280, -1, 2450, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2467, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3313, -1, + 2483, -1, -1, 2486, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3347, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3358, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 14, -1, 16, -1, -1, -1, -1, + -1, -1, -1, 3388, -1, -1, -1, 3392, 3393, 2562, + 3395, -1, -1, 34, -1, -1, -1, 38, -1, 3404, + -1, -1, -1, -1, 3409, -1, -1, 3412, -1, 3414, + 3415, 52, 53, -1, -1, 56, -1, -1, -1, 60, + -1, -1, -1, -1, 65, 66, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 85, 3450, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 104, -1, -1, -1, -1, -1, 2642, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3485, -1, -1, -1, -1, -1, -1, 128, -1, -1, + -1, -1, -1, -1, -1, 136, -1, 138, 139, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 151, 152, -1, -1, 3519, -1, -1, -1, -1, -1, + -1, -1, -1, 164, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 178, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3556, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 211, 3576, 213, -1, -1, -1, 217, -1, -1, -1, + 221, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 235, -1, -1, 3602, -1, -1, + -1, -1, -1, -1, -1, -1, 247, -1, 249, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 265, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 283, -1, -1, -1, 287, -1, -1, -1, + -1, -1, -1, 294, -1, -1, -1, -1, -1, 2832, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3713, 3714, + -1, -1, -1, 2886, -1, -1, -1, 2890, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 382, -1, -1, 2917, 2918, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 399, -1, + 401, -1, -1, -1, -1, 2938, -1, -1, -1, -1, + -1, -1, -1, 414, 2947, -1, 2949, -1, 2951, -1, + -1, -1, -1, -1, 425, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 447, -1, -1, 450, + -1, 452, -1, 454, 455, -1, -1, 458, 459, -1, + -1, -1, -1, -1, -1, -1, -1, 3832, 469, -1, + -1, 472, -1, -1, -1, -1, -1, -1, -1, 480, + -1, -1, -1, -1, -1, 486, -1, 3852, -1, -1, + -1, -1, -1, 494, -1, -1, -1, -1, 499, 500, + 501, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3875, -1, -1, -1, -1, -1, -1, 3882, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 532, -1, -1, -1, -1, -1, -1, -1, 540, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3084, -1, 3918, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 14, -1, 16, -1, -1, 3111, -1, + -1, -1, -1, 584, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 34, -1, 596, -1, 38, 3131, 600, + -1, -1, 603, -1, -1, -1, -1, 608, -1, -1, + -1, 52, 53, -1, -1, 56, -1, -1, -1, 60, + -1, -1, -1, -1, 65, 66, -1, -1, -1, 630, + -1, -1, -1, -1, -1, -1, -1, 638, -1, -1, + -1, -1, -1, 644, 85, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 657, -1, -1, -1, + -1, -1, -1, 104, -1, -1, 4031, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 128, -1, -1, + -1, -1, -1, -1, -1, 136, -1, 138, 139, 4064, + -1, -1, -1, 4068, -1, -1, -1, -1, -1, -1, + 151, 152, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 178, 4103, 4104, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 211, -1, 213, -1, -1, -1, 217, -1, -1, -1, + 221, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 235, -1, -1, 4162, -1, -1, + -1, -1, -1, -1, -1, -1, 247, -1, 249, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 265, 3358, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 283, -1, -1, -1, 287, -1, -1, -1, + -1, -1, -1, 294, -1, 3388, -1, -1, 4223, 3392, + 3393, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3404, -1, -1, -1, -1, 3409, -1, -1, 3412, + -1, 3414, 3415, -1, -1, -1, -1, 4252, -1, -1, + -1, -1, -1, -1, 4259, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4297, -1, -1, -1, -1, -1, -1, -1, + -1, 382, -1, -1, -1, -1, -1, 4312, -1, 4314, + -1, -1, 3485, -1, -1, -1, -1, -1, 399, -1, + 401, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 414, 4339, -1, -1, -1, 4343, -1, + -1, -1, -1, -1, 425, -1, 3519, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 447, -1, -1, 450, + -1, 452, -1, 454, 455, -1, -1, 458, 459, -1, + -1, -1, -1, 3556, -1, -1, -1, -1, 469, -1, + -1, 472, -1, -1, -1, -1, -1, -1, -1, 480, + -1, 4406, -1, 3576, -1, 486, -1, -1, -1, -1, + -1, -1, -1, 494, -1, -1, -1, -1, 499, 500, + 501, 4426, -1, -1, -1, -1, -1, 4432, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4445, -1, 14, -1, 16, -1, -1, -1, -1, -1, + -1, 532, -1, -1, -1, -1, -1, -1, -1, 540, + -1, -1, -1, -1, -1, -1, 38, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 52, 53, -1, -1, -1, -1, -1, -1, 60, -1, + -1, -1, -1, 65, 66, -1, -1, -1, -1, -1, + -1, -1, -1, 584, 4509, -1, -1, -1, -1, 4514, + -1, -1, -1, 85, -1, 596, 4521, -1, -1, 600, + -1, -1, 603, -1, -1, -1, -1, 608, -1, -1, + -1, -1, 104, -1, -1, -1, -1, -1, -1, -1, + 3713, 3714, -1, -1, -1, -1, -1, -1, -1, 630, + -1, -1, -1, -1, -1, -1, 128, 638, -1, -1, + -1, -1, -1, 644, 136, 4570, 138, 139, -1, -1, + -1, -1, -1, -1, -1, -1, 657, -1, -1, 151, + 152, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 178, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, 4630, -1, -1, -1, -1, + -1, 4636, -1, -1, -1, -1, -1, -1, -1, 211, + -1, 213, -1, -1, -1, 217, -1, -1, -1, 221, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4679, 247, -1, 249, -1, 3852, + -1, -1, 4687, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 265, -1, -1, -1, -1, -1, -1, + -1, -1, 3875, -1, -1, -1, -1, -1, -1, 3882, + -1, 283, -1, 4718, -1, 287, -1, -1, -1, -1, + -1, 4726, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4746, -1, 4748, 4749, 3918, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 4774, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4798, -1, -1, 4801, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 382, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 399, 4833, 401, + -1, -1, -1, -1, -1, -1, -1, -1, 4843, -1, + -1, -1, 414, 4848, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 425, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4873, -1, + -1, -1, -1, -1, -1, 447, -1, -1, 450, -1, + 452, -1, -1, 455, -1, -1, 458, 459, -1, -1, + -1, 4064, -1, 4898, -1, 4068, -1, 469, -1, -1, + 472, -1, -1, -1, -1, -1, -1, -1, 480, -1, + -1, -1, -1, -1, 486, -1, -1, -1, -1, -1, + -1, -1, 494, -1, -1, -1, -1, 499, 500, 501, + 4103, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 532, -1, -1, -1, -1, -1, -1, -1, 540, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 584, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 596, -1, -1, -1, 600, -1, + -1, 603, -1, -1, -1, -1, 608, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 638, -1, -1, -1, + -1, -1, 644, -1, -1, -1, -1, -1, -1, 4252, + -1, -1, -1, -1, -1, 657, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 4312, + -1, 4314, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4445, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4570, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4679, -1, -1, -1, + -1, -1, -1, -1, 4687, 5, -1, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, - -1, -1, 22, 664, 24, 25, 26, 27, 28, 29, - 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, - -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, - -1, 51, 52, -1, -1, 55, -1, -1, 58, 59, - -1, 61, 62, -1, 64, 65, -1, 67, 68, 69, + -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, 34, 4718, -1, 37, 38, 39, + 40, 41, 42, 43, -1, 45, 46, 47, 48, 49, + -1, 51, 52, -1, -1, 55, 56, 57, 58, 59, + -1, 61, 62, 63, 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, -1, - 100, -1, -1, 103, -1, -1, 106, -1, 108, -1, - -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, - -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, - -1, -1, -1, 133, -1, 135, -1, -1, -1, 139, - -1, 141, 142, 143, 144, 145, -1, -1, -1, -1, - 150, -1, -1, 153, 154, 155, -1, -1, -1, 159, - -1, 161, 162, -1, 164, 165, 166, -1, 168, 169, - -1, 171, 172, 173, 174, 175, 176, 177, -1, -1, - 180, 181, 182, 183, -1, -1, 186, 187, -1, 189, - 190, 191, -1, -1, 194, -1, -1, -1, 198, 199, - -1, 201, -1, 203, -1, 205, 206, 207, 208, 209, - 210, 211, -1, 213, -1, -1, 216, 217, 218, -1, - 220, -1, -1, -1, 224, 225, -1, -1, -1, 229, - 230, 231, 232, 233, -1, -1, -1, 237, 238, 239, - -1, -1, 242, -1, -1, -1, -1, 247, 248, -1, - -1, -1, 252, -1, 254, 255, -1, 257, 258, -1, - -1, -1, 262, -1, -1, 265, 266, 267, -1, -1, - 270, -1, -1, 273, 274, -1, -1, -1, -1, -1, - 280, 281, -1, 283, -1, 285, -1, 287, 288, -1, - -1, -1, -1, -1, -1, 295, 296, 297, 298, 299, + 100, 101, 102, 103, -1, -1, 106, 107, 108, 109, + 110, 111, -1, 113, 114, 115, -1, 117, 118, 119, + 120, 121, 122, -1, -1, -1, -1, 127, 128, 129, + -1, -1, 132, 133, -1, 135, -1, -1, -1, -1, + 140, -1, 142, 143, 144, 145, 146, -1, -1, -1, + -1, 151, -1, -1, 154, 155, 156, -1, -1, -1, + 160, -1, 162, 163, -1, 165, 166, 167, -1, 169, + 170, -1, 172, 173, 174, 175, 176, 177, 178, 179, + -1, 181, 182, 183, 184, 185, 186, 187, 188, -1, + 190, 191, 192, 193, -1, 195, -1, -1, -1, 199, + 200, -1, 202, -1, 204, -1, 206, 207, 208, 209, + 210, 211, 212, -1, 214, 4898, 216, 217, 218, 219, + -1, 221, 222, 223, -1, 225, 226, -1, -1, -1, + 230, 231, 232, 233, 234, 235, -1, -1, 238, 239, + 240, -1, -1, 243, -1, -1, -1, 247, 248, 249, + 250, -1, -1, 253, -1, 255, 256, -1, 258, 259, + -1, -1, -1, 263, -1, -1, 266, 267, 268, -1, + 270, 271, -1, 273, 274, 275, -1, -1, -1, -1, + -1, 281, 282, -1, 284, -1, 286, -1, 288, 289, + -1, -1, 292, -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, -1, 312, 313, 314, 315, -1, 317, 318, 319, - 320, -1, 322, 323, 324, -1, -1, -1, -1, 329, - 330, 331, 332, 333, 334, -1, -1, 337, 338, -1, - 340, -1, 342, -1, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, -1, -1, 356, -1, -1, 359, - 360, 361, 362, -1, -1, -1, 366, 367, -1, -1, - -1, 371, -1, 373, 374, 375, -1, 377, 378, 379, - 380, -1, 382, 383, -1, -1, -1, -1, -1, -1, - -1, -1, 392, 393, 394, -1, -1, 397, -1, 399, - -1, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, -1, -1, 413, 414, 415, -1, 417, -1, 419, - 420, 421, 422, 423, -1, 425, 426, 427, -1, -1, - 430, -1, -1, -1, 434, 435, 436, 437, 438, -1, - -1, 441, 442, 443, 444, 445, -1, 447, 448, -1, - 450, 451, 452, -1, -1, 455, -1, 457, -1, 459, - 460, -1, 462, 463, -1, 465, -1, 467, -1, -1, + 310, 311, -1, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, -1, -1, -1, -1, + 330, 331, 332, 333, 334, 335, -1, -1, 338, 339, + 340, 341, -1, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, -1, 356, 357, -1, -1, + 360, 361, 362, 363, 364, 365, 366, 367, 368, -1, + 370, 371, 372, -1, 374, 375, 376, -1, 378, 379, + 380, 381, -1, 383, 384, -1, -1, -1, -1, -1, + -1, -1, -1, 393, 394, 395, -1, 397, 398, -1, + 400, -1, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, -1, 414, 415, 416, -1, 418, -1, + 420, 421, 422, 423, 424, -1, 426, 427, 428, -1, + -1, 431, -1, -1, -1, 435, 436, 437, 438, 439, + -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, + -1, 451, 452, 453, 454, 455, 456, -1, 458, -1, + 460, 461, -1, 463, 464, -1, 466, -1, 468, -1, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, - 480, 481, -1, 483, 484, -1, -1, -1, 488, 489, - 490, 491, -1, -1, -1, 495, -1, -1, -1, 499, - -1, 501, 502, 503, 504, 505, 506, -1, 508, 509, - 510, 511, 512, 513, -1, -1, -1, -1, -1, -1, - 520, 521, -1, 523, -1, -1, 526, -1, -1, -1, - 530, 531, 532, -1, -1, -1, 536, -1, -1, 539, - 540, -1, 542, 543, 544, 545, 546, 547, -1, -1, - 550, 551, 552, 553, -1, 555, 556, -1, -1, 559, - 560, 561, 562, -1, -1, 565, 566, -1, 568, 569, - 570, 571, -1, -1, -1, -1, -1, 577, 578, 579, - -1, -1, -1, 583, 584, 585, 586, -1, 588, 589, - -1, 591, 592, -1, 594, 595, -1, -1, 598, -1, - -1, 601, -1, 603, -1, 605, 606, -1, -1, -1, - -1, -1, -1, 613, -1, -1, 616, -1, -1, -1, - 620, 621, 622, 623, 624, 625, 626, -1, -1, -1, - -1, -1, -1, 633, 634, -1, 636, 637, 638, -1, - -1, 641, -1, -1, -1, -1, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, 664, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, - -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, -1, -1, 58, - 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, -1, -1, 103, -1, -1, 106, -1, 108, - -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, - 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, - -1, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, -1, - -1, 180, 181, 182, 183, -1, -1, 186, 187, -1, - 189, 190, 191, -1, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, -1, 216, 217, 218, - -1, 220, -1, -1, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, -1, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, -1, 247, 248, - -1, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, -1, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, -1, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, -1, 317, 318, - 319, 320, -1, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - -1, 340, -1, 342, -1, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, -1, 356, -1, -1, - 359, 360, 361, 362, -1, -1, -1, 366, 367, -1, - -1, -1, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, -1, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, -1, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, -1, -1, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - -1, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, -1, -1, - 539, 540, -1, 542, 543, 544, 545, 546, 547, -1, - -1, 550, 551, 552, 553, -1, 555, 556, -1, -1, - 559, 560, 561, 562, -1, -1, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, -1, -1, 583, 584, 585, 586, -1, 588, - 589, -1, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - -1, -1, -1, -1, 613, -1, -1, 616, -1, -1, - -1, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, 663, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, - -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, -1, -1, 58, - 59, -1, 61, 62, -1, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, -1, -1, 103, -1, -1, 106, -1, 108, - -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, - 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, - -1, -1, -1, -1, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, -1, - -1, 180, 181, 182, 183, -1, -1, 186, 187, -1, - 189, 190, 191, -1, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, -1, 216, 217, 218, - -1, 220, -1, -1, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, -1, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, -1, 247, 248, - -1, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, -1, 273, 274, 275, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, -1, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, -1, 317, 318, - 319, 320, -1, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - -1, 340, -1, 342, -1, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, -1, 356, -1, -1, - 359, 360, 361, 362, -1, -1, -1, 366, 367, -1, - -1, -1, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, -1, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, -1, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, -1, -1, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - -1, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, -1, -1, - 539, 540, -1, 542, 543, 544, 545, 546, 547, -1, - -1, 550, 551, 552, 553, -1, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, -1, -1, 583, 584, 585, 586, -1, 588, - 589, -1, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - -1, -1, -1, -1, 613, -1, -1, 616, -1, -1, - -1, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, 663, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, - -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, -1, -1, 58, - 59, -1, 61, 62, -1, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, -1, -1, 103, -1, -1, 106, -1, 108, - -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, - 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, - -1, -1, -1, -1, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, -1, - -1, 180, 181, 182, 183, -1, -1, 186, 187, -1, - 189, 190, 191, -1, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, -1, 216, 217, 218, - -1, 220, -1, -1, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, -1, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, -1, 247, 248, - -1, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, -1, 273, 274, 275, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, -1, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, -1, 317, 318, - 319, 320, -1, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - -1, 340, -1, 342, -1, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, -1, 356, -1, -1, - 359, 360, 361, 362, -1, -1, -1, 366, 367, -1, - -1, -1, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, -1, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, -1, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, -1, -1, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - -1, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, -1, -1, - 539, 540, -1, 542, 543, 544, 545, 546, 547, -1, - -1, 550, 551, 552, 553, -1, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, -1, -1, 583, 584, 585, 586, -1, 588, - 589, -1, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - -1, -1, -1, -1, 613, -1, -1, 616, -1, -1, - -1, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, 663, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, - -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, -1, -1, 58, - 59, -1, 61, 62, -1, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, -1, -1, 103, -1, -1, 106, -1, 108, - -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, - 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, - -1, -1, -1, -1, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, -1, - -1, 180, 181, 182, 183, -1, -1, 186, 187, -1, - 189, 190, 191, -1, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, -1, 216, 217, 218, - -1, 220, -1, -1, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, -1, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, -1, 247, 248, - -1, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, -1, 273, 274, 275, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, -1, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, -1, 317, 318, - 319, 320, -1, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - -1, 340, -1, 342, -1, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, -1, 356, -1, -1, - 359, 360, 361, 362, -1, -1, -1, 366, 367, -1, - -1, -1, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, -1, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, -1, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, -1, -1, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - -1, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, -1, -1, - 539, 540, -1, 542, 543, 544, 545, 546, 547, -1, - -1, 550, 551, 552, 553, -1, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, -1, -1, 583, 584, 585, 586, -1, 588, - 589, -1, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - -1, -1, -1, -1, 613, -1, -1, 616, -1, -1, - -1, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, 663, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, - -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, -1, -1, 58, - 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, -1, -1, 103, -1, -1, 106, -1, 108, - -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, - 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, - -1, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, -1, - -1, 180, 181, 182, 183, -1, -1, 186, 187, -1, - 189, 190, 191, -1, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, -1, 216, 217, 218, - -1, 220, -1, -1, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, -1, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, -1, 247, 248, - -1, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, -1, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, -1, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, -1, 317, 318, - 319, 320, -1, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - -1, 340, -1, 342, -1, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, -1, 356, -1, -1, - 359, 360, 361, 362, -1, -1, -1, 366, 367, -1, - -1, -1, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, -1, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, -1, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, -1, -1, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - -1, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, -1, -1, - 539, 540, -1, 542, 543, 544, 545, 546, 547, -1, - -1, 550, 551, 552, 553, -1, 555, 556, -1, -1, - 559, 560, 561, 562, -1, -1, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, -1, -1, 583, 584, 585, 586, -1, 588, - 589, -1, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - -1, -1, -1, -1, 613, -1, -1, 616, -1, -1, - -1, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, 663, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, - -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, -1, -1, 58, - 59, -1, 61, 62, -1, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, -1, -1, 103, -1, -1, 106, -1, 108, - -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, - 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, - -1, -1, -1, -1, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, -1, - -1, 180, 181, 182, 183, -1, -1, 186, 187, -1, - 189, 190, 191, -1, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, -1, 216, 217, 218, - -1, 220, -1, -1, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, -1, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, -1, 247, 248, - -1, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, -1, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, -1, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, -1, 317, 318, - 319, 320, -1, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - -1, 340, -1, 342, -1, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, -1, 356, -1, -1, - 359, 360, 361, 362, -1, -1, -1, 366, 367, -1, - -1, -1, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, -1, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, -1, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, -1, -1, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - -1, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, -1, -1, - 539, 540, -1, 542, 543, 544, 545, 546, 547, -1, - -1, 550, 551, 552, 553, -1, 555, 556, -1, -1, - 559, 560, 561, 562, -1, -1, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, -1, -1, 583, 584, 585, 586, -1, 588, - 589, -1, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - -1, -1, -1, -1, 613, -1, -1, 616, -1, -1, - -1, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, 22, 663, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, - -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, -1, -1, 58, - 59, -1, 61, 62, -1, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, -1, -1, 103, -1, -1, 106, -1, 108, - -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, - 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, - -1, -1, -1, -1, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, -1, - -1, 180, 181, 182, 183, -1, -1, 186, 187, -1, - 189, 190, 191, -1, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, -1, 216, 217, 218, - -1, 220, -1, -1, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, -1, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, -1, 247, 248, - -1, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, -1, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, -1, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, -1, 317, 318, - 319, 320, -1, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - -1, 340, -1, 342, -1, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, -1, 356, -1, -1, - 359, 360, 361, 362, -1, -1, -1, 366, 367, -1, - -1, -1, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, -1, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, -1, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, -1, -1, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - -1, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, -1, -1, - 539, 540, -1, 542, 543, 544, 545, 546, 547, -1, - -1, 550, 551, 552, 553, -1, 555, 556, -1, -1, - 559, 560, 561, 562, -1, -1, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, -1, -1, 583, 584, 585, 586, -1, 588, - 589, -1, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - -1, -1, -1, -1, 613, -1, -1, 616, -1, -1, - -1, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, -1, -1, 5, -1, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, -1, -1, 663, 24, 25, 26, 27, 28, - 29, 30, 31, -1, -1, 34, -1, -1, -1, 38, - -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, - 49, -1, -1, -1, -1, -1, 55, 56, -1, 58, - 59, -1, 61, -1, -1, -1, -1, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, -1, -1, -1, - -1, -1, -1, 82, -1, 84, -1, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, -1, 98, - -1, 100, -1, -1, 103, -1, -1, 106, -1, 108, - -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, - 119, -1, -1, 122, -1, -1, -1, -1, 127, -1, - -1, -1, -1, -1, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, -1, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, -1, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, -1, -1, -1, - -1, 180, 181, 182, 183, -1, -1, 186, 187, 188, - 189, 190, 191, -1, -1, -1, -1, -1, -1, -1, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, -1, 211, -1, 213, -1, -1, -1, 217, 218, - -1, -1, -1, -1, -1, -1, 225, -1, -1, -1, - 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, -1, 247, -1, - -1, -1, -1, 252, -1, 254, 255, -1, 257, 258, - 259, -1, -1, 262, -1, -1, -1, 266, 267, -1, - -1, 270, 271, -1, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, -1, -1, 293, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, -1, 317, 318, - 319, 320, -1, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - -1, 340, -1, 342, -1, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, -1, 356, -1, -1, - 359, 360, 361, 362, -1, -1, -1, -1, 367, -1, - -1, -1, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 393, 394, -1, -1, -1, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, -1, -1, -1, -1, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, -1, - -1, 450, -1, 452, 453, -1, 455, -1, -1, -1, - 459, -1, -1, 462, 463, -1, 465, 466, 467, -1, - -1, 470, -1, 472, 473, 474, 475, 476, 477, 478, - -1, 480, 481, -1, 483, -1, -1, -1, -1, 488, - 489, 490, -1, -1, -1, -1, 495, -1, -1, -1, - -1, -1, -1, 502, -1, -1, 505, 506, -1, 508, - -1, 510, -1, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, -1, 532, -1, -1, -1, 536, -1, -1, - -1, 540, -1, 542, 543, 544, 545, 546, 547, -1, - -1, 550, 551, 552, 553, -1, 555, 556, -1, -1, - 559, 560, 561, 562, -1, -1, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, -1, -1, -1, 584, 585, 586, -1, 588, - 589, -1, 591, 592, -1, -1, -1, -1, -1, 598, - -1, -1, 601, -1, -1, -1, 605, 606, -1, -1, - -1, -1, -1, -1, 613, -1, -1, 616, -1, -1, - -1, 620, 621, 622, 623, 624, 625, 626, -1, -1, - 629, -1, -1, -1, 633, -1, -1, 636, -1, 638, - -1, 5, 641, 7, 8, 9, 10, 11, 12, -1, - -1, 15, -1, -1, -1, 19, -1, -1, 22, 658, - 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, - 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, - -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, - -1, 55, -1, -1, 58, 59, -1, 61, 62, -1, - 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, - 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, - 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, - 94, 95, 96, 97, 98, -1, 100, -1, -1, 103, - -1, -1, 106, -1, 108, 109, -1, 111, -1, 113, - -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, - -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, - -1, 135, -1, -1, -1, 139, -1, 141, 142, 143, - 144, 145, -1, -1, -1, -1, 150, -1, -1, 153, - 154, 155, -1, -1, -1, 159, -1, 161, 162, -1, - 164, 165, 166, -1, 168, 169, -1, 171, 172, 173, - 174, 175, 176, 177, -1, -1, 180, 181, 182, 183, - -1, -1, 186, 187, -1, 189, 190, 191, -1, -1, - 194, -1, -1, -1, 198, 199, -1, 201, -1, 203, - -1, 205, 206, 207, 208, 209, 210, 211, -1, 213, - -1, -1, 216, 217, 218, -1, 220, -1, -1, -1, - 224, 225, -1, -1, -1, 229, 230, 231, 232, 233, - -1, -1, -1, 237, 238, 239, -1, -1, 242, -1, - -1, -1, -1, 247, 248, -1, -1, -1, 252, -1, - 254, 255, -1, 257, 258, -1, -1, -1, 262, -1, - -1, 265, 266, 267, -1, -1, 270, -1, -1, 273, - 274, 275, -1, -1, -1, -1, 280, 281, -1, 283, - -1, 285, -1, 287, 288, -1, -1, -1, -1, -1, - -1, 295, 296, 297, 298, 299, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, -1, 312, 313, - 314, 315, -1, 317, 318, 319, 320, -1, 322, 323, - 324, -1, -1, -1, -1, 329, 330, 331, 332, 333, - 334, -1, -1, 337, 338, -1, 340, -1, 342, -1, - 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, - -1, -1, 356, -1, -1, 359, 360, 361, 362, -1, - -1, -1, 366, 367, -1, -1, -1, 371, -1, 373, - 374, 375, -1, 377, 378, 379, 380, -1, 382, 383, - -1, -1, -1, -1, -1, -1, -1, -1, 392, 393, - 394, -1, -1, 397, -1, 399, -1, 401, 402, 403, - 404, 405, 406, 407, 408, 409, 410, -1, -1, 413, - 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, - -1, 425, 426, 427, -1, -1, 430, -1, -1, -1, - 434, 435, 436, 437, 438, -1, -1, 441, 442, 443, - 444, 445, -1, 447, 448, -1, 450, 451, 452, -1, - -1, 455, -1, 457, -1, 459, 460, -1, 462, 463, - -1, 465, -1, 467, -1, -1, 470, 471, 472, 473, - 474, 475, 476, 477, 478, 479, 480, 481, -1, 483, - 484, -1, -1, -1, 488, 489, 490, 491, -1, -1, - -1, 495, -1, -1, -1, 499, -1, 501, 502, 503, - 504, 505, 506, -1, 508, 509, 510, 511, 512, 513, - -1, -1, -1, -1, -1, -1, 520, 521, -1, 523, - -1, -1, 526, -1, -1, -1, 530, 531, 532, -1, - -1, -1, 536, -1, -1, 539, 540, -1, 542, 543, - 544, 545, 546, 547, -1, -1, 550, 551, 552, 553, - -1, 555, 556, -1, -1, 559, 560, 561, 562, -1, - 564, 565, 566, -1, 568, 569, 570, 571, -1, -1, - -1, -1, -1, 577, 578, 579, -1, -1, -1, 583, - 584, 585, 586, -1, 588, 589, -1, 591, 592, -1, - 594, 595, -1, -1, 598, -1, -1, 601, -1, 603, - -1, 605, 606, -1, -1, -1, -1, -1, -1, 613, - -1, -1, 616, -1, -1, -1, 620, 621, 622, 623, - 624, 625, 626, -1, -1, -1, -1, -1, -1, 633, - 634, -1, 636, 637, 638, -1, 5, 641, 7, 8, - 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, - 19, -1, 656, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, - -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, -1, -1, 58, - 59, -1, 61, 62, -1, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, -1, -1, 103, -1, -1, 106, -1, 108, - -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, - 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, - -1, -1, -1, -1, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, -1, - -1, 180, 181, 182, 183, -1, -1, 186, 187, -1, - 189, 190, 191, -1, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, -1, 216, 217, 218, - -1, 220, -1, -1, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, -1, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, -1, 247, 248, - -1, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, -1, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, -1, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, -1, 317, 318, - 319, 320, -1, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - -1, 340, -1, 342, -1, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, -1, 356, -1, -1, - 359, 360, 361, 362, -1, -1, -1, 366, 367, -1, - -1, -1, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, -1, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, -1, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, -1, -1, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - -1, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, -1, -1, - 539, 540, -1, 542, 543, 544, 545, 546, 547, -1, - -1, 550, 551, 552, 553, -1, 555, 556, -1, -1, - 559, 560, 561, 562, -1, -1, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, -1, -1, 583, 584, 585, 586, -1, 588, - 589, -1, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - -1, -1, -1, -1, 613, -1, -1, 616, -1, -1, - -1, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, 5, 641, 7, 8, 9, 10, 11, 12, -1, - -1, 15, 651, -1, -1, 19, -1, -1, 22, -1, - 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, - 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, - -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, - -1, 55, -1, -1, 58, 59, -1, 61, 62, -1, - 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, - 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, - 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, - 94, 95, 96, 97, 98, -1, 100, -1, -1, 103, - -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, - -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, - -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, - -1, 135, -1, -1, -1, 139, -1, 141, 142, 143, - 144, 145, -1, -1, -1, -1, 150, -1, -1, 153, - 154, 155, -1, -1, -1, 159, -1, 161, 162, -1, - 164, 165, 166, -1, 168, 169, -1, 171, 172, 173, - 174, 175, 176, 177, -1, -1, 180, 181, 182, 183, - -1, -1, 186, 187, -1, 189, 190, 191, -1, -1, - 194, -1, -1, -1, 198, 199, -1, 201, -1, 203, - -1, 205, 206, 207, 208, 209, 210, 211, -1, 213, - -1, -1, 216, 217, 218, -1, 220, -1, -1, -1, - 224, 225, -1, -1, -1, 229, 230, 231, 232, 233, - -1, -1, -1, 237, 238, 239, -1, -1, 242, -1, - -1, -1, -1, 247, 248, -1, -1, -1, 252, -1, - 254, 255, -1, 257, 258, -1, -1, -1, 262, -1, - -1, 265, 266, 267, -1, -1, 270, -1, -1, 273, - 274, -1, -1, -1, -1, -1, 280, 281, -1, 283, - -1, 285, -1, 287, 288, -1, -1, -1, -1, -1, - -1, 295, 296, 297, 298, 299, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, -1, 312, 313, - 314, 315, -1, 317, 318, 319, 320, -1, 322, 323, - 324, -1, -1, -1, -1, 329, 330, 331, 332, 333, - 334, -1, -1, 337, 338, -1, 340, -1, 342, -1, - 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, - -1, -1, 356, -1, -1, 359, 360, 361, 362, -1, - -1, -1, 366, 367, -1, -1, -1, 371, -1, 373, - 374, 375, -1, 377, 378, 379, 380, -1, 382, 383, - -1, -1, -1, -1, -1, -1, -1, -1, 392, 393, - 394, -1, -1, 397, -1, 399, -1, 401, 402, 403, - 404, 405, 406, 407, 408, 409, 410, -1, -1, 413, - 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, - -1, 425, 426, 427, -1, -1, 430, -1, -1, -1, - 434, 435, 436, 437, 438, -1, -1, 441, 442, 443, - 444, 445, -1, 447, 448, -1, 450, 451, 452, -1, - -1, 455, -1, 457, -1, 459, 460, -1, 462, 463, - -1, 465, -1, 467, -1, -1, 470, 471, 472, 473, - 474, 475, 476, 477, 478, 479, 480, 481, -1, 483, - 484, -1, -1, -1, 488, 489, 490, 491, -1, -1, - -1, 495, -1, -1, -1, 499, -1, 501, 502, 503, - 504, 505, 506, -1, 508, 509, 510, 511, 512, 513, - -1, -1, -1, -1, -1, -1, 520, 521, -1, 523, - -1, -1, 526, -1, -1, -1, 530, 531, 532, -1, - -1, -1, 536, -1, -1, 539, 540, -1, 542, 543, - 544, 545, 546, 547, -1, -1, 550, 551, 552, 553, - -1, 555, 556, -1, -1, 559, 560, 561, 562, -1, - -1, 565, 566, -1, 568, 569, 570, 571, -1, -1, - -1, -1, -1, 577, 578, 579, -1, -1, -1, 583, - 584, 585, 586, -1, 588, 589, -1, 591, 592, -1, - 594, 595, -1, -1, 598, -1, -1, 601, -1, 603, - -1, 605, 606, -1, -1, -1, -1, -1, -1, 613, - -1, -1, 616, -1, -1, -1, 620, 621, 622, 623, - 624, 625, 626, -1, -1, -1, -1, -1, -1, 633, - 634, -1, 636, 637, 638, -1, 5, 641, 7, 8, - 9, 10, 11, 12, -1, -1, 15, 651, -1, -1, - 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, - 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, - -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, -1, -1, 58, - 59, -1, 61, 62, -1, 64, 65, -1, 67, 68, - 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, - 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, - 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, -1, -1, 103, -1, -1, 106, -1, 108, - -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, - 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, - -1, -1, -1, -1, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, -1, - -1, 180, 181, 182, 183, -1, -1, 186, 187, -1, - 189, 190, 191, -1, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, -1, 216, 217, 218, - -1, 220, -1, -1, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, -1, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, -1, 247, 248, - -1, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, -1, 273, 274, -1, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, -1, -1, -1, -1, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, -1, 317, 318, - 319, 320, -1, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - -1, 340, -1, 342, -1, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, -1, 356, -1, -1, - 359, 360, 361, 362, -1, -1, -1, 366, 367, -1, - -1, -1, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, -1, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, -1, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, -1, -1, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, - -1, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, -1, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, -1, -1, - 539, 540, -1, 542, 543, 544, 545, 546, 547, -1, - -1, 550, 551, 552, 553, -1, 555, 556, -1, -1, - 559, 560, 561, 562, -1, -1, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, -1, -1, 583, 584, 585, 586, -1, 588, - 589, -1, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - -1, -1, -1, -1, 613, -1, -1, 616, -1, -1, - -1, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, 5, 641, 7, 8, 9, 10, 11, 12, -1, - -1, 15, 651, -1, -1, 19, -1, -1, 22, -1, - 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, - 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, - -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, - -1, 55, -1, -1, 58, 59, -1, 61, 62, -1, - 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, - 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, - 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, - 94, 95, 96, 97, 98, -1, 100, -1, -1, 103, - -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, - -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, - -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, - -1, 135, -1, -1, -1, 139, -1, 141, 142, 143, - 144, 145, -1, -1, -1, -1, 150, -1, -1, 153, - 154, 155, -1, -1, -1, 159, -1, 161, 162, -1, - 164, 165, 166, -1, 168, 169, -1, 171, 172, 173, - 174, 175, 176, 177, -1, -1, 180, 181, 182, 183, - -1, -1, 186, 187, -1, 189, 190, 191, -1, -1, - 194, -1, -1, -1, 198, 199, -1, 201, -1, 203, - -1, 205, 206, 207, 208, 209, 210, 211, -1, 213, - -1, -1, 216, 217, 218, -1, 220, -1, -1, -1, - 224, 225, -1, -1, -1, 229, 230, 231, 232, 233, - -1, -1, -1, 237, 238, 239, -1, -1, 242, -1, - -1, -1, -1, 247, 248, -1, -1, -1, 252, -1, - 254, 255, -1, 257, 258, -1, -1, -1, 262, -1, - -1, 265, 266, 267, -1, -1, 270, -1, -1, 273, - 274, -1, -1, -1, -1, -1, 280, 281, -1, 283, - -1, 285, -1, 287, 288, -1, -1, -1, -1, -1, - -1, 295, 296, 297, 298, 299, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, -1, 312, 313, - 314, 315, -1, 317, 318, 319, 320, -1, 322, 323, - 324, -1, -1, -1, -1, 329, 330, 331, 332, 333, - 334, -1, -1, 337, 338, -1, 340, -1, 342, -1, - 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, - -1, -1, 356, -1, -1, 359, 360, 361, 362, -1, - -1, -1, 366, 367, -1, -1, -1, 371, -1, 373, - 374, 375, -1, 377, 378, 379, 380, -1, 382, 383, - -1, -1, -1, -1, -1, -1, -1, -1, 392, 393, - 394, -1, -1, 397, -1, 399, -1, 401, 402, 403, - 404, 405, 406, 407, 408, 409, 410, -1, -1, 413, - 414, 415, -1, 417, -1, 419, 420, 421, 422, 423, - -1, 425, 426, 427, -1, -1, 430, -1, -1, -1, - 434, 435, 436, 437, 438, -1, -1, 441, 442, 443, - 444, 445, -1, 447, 448, -1, 450, 451, 452, -1, - -1, 455, -1, 457, -1, 459, 460, -1, 462, 463, - -1, 465, -1, 467, -1, -1, 470, 471, 472, 473, - 474, 475, 476, 477, 478, 479, 480, 481, -1, 483, - 484, -1, -1, -1, 488, 489, 490, 491, -1, -1, - -1, 495, -1, -1, -1, 499, -1, 501, 502, 503, - 504, 505, 506, -1, 508, 509, 510, 511, 512, 513, - -1, -1, -1, -1, -1, -1, 520, 521, -1, 523, - -1, -1, 526, -1, -1, -1, 530, 531, 532, -1, - -1, -1, 536, -1, -1, 539, 540, -1, 542, 543, - 544, 545, 546, 547, -1, -1, 550, 551, 552, 553, - -1, 555, 556, -1, -1, 559, 560, 561, 562, -1, - -1, 565, 566, -1, 568, 569, 570, 571, -1, -1, - -1, -1, -1, 577, 578, 579, -1, -1, -1, 583, - 584, 585, 586, -1, 588, 589, -1, 591, 592, -1, - 594, 595, -1, -1, 598, -1, -1, 601, -1, 603, - -1, 605, 606, -1, -1, -1, -1, -1, -1, 613, - -1, -1, 616, -1, -1, -1, 620, 621, 622, 623, - 624, 625, 626, -1, -1, -1, -1, -1, -1, 633, - 634, -1, 636, 637, 638, -1, 5, 641, 7, 8, - 9, 10, 11, 12, -1, -1, 15, 651, -1, -1, + 480, 481, 482, -1, 484, 485, -1, -1, -1, 489, + 490, 491, 492, -1, -1, -1, 496, -1, -1, -1, + 500, -1, 502, 503, 504, 505, 506, 507, -1, 509, + 510, 511, 512, 513, 514, -1, -1, -1, -1, -1, + -1, 521, 522, -1, 524, -1, -1, 527, -1, -1, + -1, 531, 532, 533, -1, -1, -1, 537, 538, 539, + 540, 541, -1, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, -1, -1, + 560, 561, 562, 563, -1, 565, 566, 567, -1, 569, + 570, 571, 572, -1, -1, -1, -1, 577, 578, 579, + 580, -1, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, -1, 595, 596, -1, -1, 599, + -1, -1, 602, -1, 604, -1, 606, 607, -1, -1, + 610, 611, 612, 613, 614, -1, -1, 617, 618, -1, + 620, 621, 622, 623, 624, 625, 626, 627, -1, -1, + -1, -1, -1, -1, 634, 635, -1, 637, 638, 639, + -1, -1, 642, -1, -1, -1, -1, -1, -1, -1, + 650, 651, -1, -1, -1, -1, 656, 657, -1, -1, + 660, 661, -1, -1, 664, 665, 5, -1, 7, 8, + 9, 10, 11, 12, 13, -1, 15, -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, -1, 37, 38, - -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, - 49, -1, 51, 52, -1, -1, 55, -1, -1, 58, - 59, -1, 61, 62, -1, 64, 65, -1, 67, 68, + 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, + 49, -1, 51, 52, -1, -1, 55, 56, 57, 58, + 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, - -1, 100, -1, -1, 103, -1, -1, 106, -1, 108, - -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, - 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, - -1, -1, -1, 132, 133, -1, 135, -1, -1, -1, - 139, -1, 141, 142, 143, 144, 145, -1, -1, -1, - -1, 150, -1, -1, 153, 154, 155, -1, -1, -1, - 159, -1, 161, 162, -1, 164, 165, 166, -1, 168, - 169, -1, 171, 172, 173, 174, 175, 176, 177, -1, - -1, 180, 181, 182, 183, -1, -1, 186, 187, -1, - 189, 190, 191, -1, -1, 194, -1, -1, -1, 198, - 199, -1, 201, -1, 203, -1, 205, 206, 207, 208, - 209, 210, 211, -1, 213, -1, -1, 216, 217, 218, - -1, 220, -1, -1, -1, 224, 225, -1, -1, -1, - 229, 230, 231, 232, 233, -1, -1, -1, 237, 238, - 239, -1, -1, 242, -1, -1, -1, -1, 247, 248, - -1, -1, -1, 252, -1, 254, 255, -1, 257, 258, - -1, -1, -1, 262, -1, -1, 265, 266, 267, -1, - -1, 270, -1, -1, 273, 274, 275, -1, -1, -1, - -1, 280, 281, -1, 283, -1, 285, -1, 287, 288, - -1, -1, -1, -1, -1, -1, 295, 296, 297, 298, + -1, 100, 101, 102, 103, -1, -1, 106, 107, 108, + 109, 110, 111, -1, 113, 114, 115, -1, 117, 118, + 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, + 129, -1, -1, 132, 133, -1, 135, -1, -1, -1, + -1, 140, -1, 142, 143, 144, 145, 146, -1, -1, + -1, -1, 151, -1, -1, 154, 155, 156, -1, -1, + -1, 160, -1, 162, 163, -1, 165, 166, 167, -1, + 169, 170, -1, 172, 173, 174, 175, 176, 177, 178, + 179, -1, 181, 182, 183, 184, 185, 186, 187, 188, + -1, 190, 191, 192, 193, -1, 195, -1, -1, -1, + 199, 200, -1, 202, -1, 204, -1, 206, 207, 208, + 209, 210, 211, 212, -1, 214, -1, 216, 217, 218, + 219, -1, 221, 222, 223, -1, 225, 226, -1, -1, + -1, 230, 231, 232, 233, 234, 235, -1, -1, 238, + 239, 240, -1, -1, 243, -1, -1, -1, 247, 248, + 249, 250, -1, -1, 253, -1, 255, 256, -1, 258, + 259, -1, -1, -1, 263, -1, -1, 266, 267, 268, + -1, -1, 271, -1, 273, 274, 275, -1, -1, -1, + -1, -1, 281, 282, -1, 284, -1, 286, -1, 288, + 289, -1, -1, 292, -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, - 309, 310, -1, 312, 313, 314, 315, -1, 317, 318, - 319, 320, -1, 322, 323, 324, -1, -1, -1, -1, - 329, 330, 331, 332, 333, 334, -1, -1, 337, 338, - -1, 340, -1, 342, -1, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, -1, -1, 356, -1, -1, - 359, 360, 361, 362, -1, -1, -1, 366, 367, -1, - -1, -1, 371, -1, 373, 374, 375, -1, 377, 378, - 379, 380, -1, 382, 383, -1, -1, -1, -1, -1, - -1, -1, -1, 392, 393, 394, -1, -1, 397, -1, - 399, -1, 401, 402, 403, 404, 405, 406, 407, 408, - 409, 410, -1, -1, 413, 414, 415, -1, 417, -1, - 419, 420, 421, 422, 423, -1, 425, 426, 427, -1, - -1, 430, -1, -1, -1, 434, 435, 436, 437, 438, - -1, -1, 441, 442, 443, 444, 445, -1, 447, 448, - -1, 450, 451, 452, -1, -1, 455, -1, 457, -1, - 459, 460, -1, 462, 463, -1, 465, -1, 467, -1, + 309, 310, 311, -1, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, -1, -1, -1, + -1, 330, 331, 332, 333, 334, 335, -1, -1, 338, + 339, 340, 341, -1, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, -1, 356, 357, -1, + -1, 360, 361, 362, 363, 364, 365, 366, 367, 368, + -1, 370, 371, 372, -1, 374, 375, 376, 377, 378, + 379, 380, 381, -1, 383, 384, -1, -1, -1, -1, + -1, -1, -1, -1, 393, 394, 395, -1, 397, 398, + -1, 400, -1, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, -1, 414, 415, 416, -1, 418, + -1, 420, 421, 422, 423, 424, -1, 426, 427, 428, + -1, -1, 431, -1, -1, -1, 435, 436, 437, 438, + 439, -1, -1, 442, 443, 444, 445, 446, -1, 448, + 449, -1, 451, 452, 453, 454, 455, 456, -1, 458, + -1, 460, 461, -1, 463, 464, -1, 466, -1, 468, -1, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, -1, 483, 484, -1, -1, -1, 488, - 489, 490, 491, -1, -1, 494, 495, -1, -1, -1, - 499, -1, 501, 502, 503, 504, 505, 506, -1, 508, - 509, 510, 511, 512, 513, -1, -1, -1, -1, -1, - -1, 520, 521, -1, 523, -1, -1, 526, -1, -1, - -1, 530, 531, 532, -1, -1, -1, 536, -1, -1, - 539, 540, -1, 542, 543, 544, 545, 546, 547, -1, - -1, 550, 551, 552, 553, -1, 555, 556, -1, -1, - 559, 560, 561, 562, -1, 564, 565, 566, -1, 568, - 569, 570, 571, -1, -1, -1, -1, -1, 577, 578, - 579, -1, -1, -1, 583, 584, 585, 586, -1, 588, - 589, -1, 591, 592, -1, 594, 595, -1, -1, 598, - -1, -1, 601, -1, 603, -1, 605, 606, -1, -1, - -1, -1, -1, -1, 613, -1, -1, 616, -1, -1, - -1, 620, 621, 622, 623, 624, 625, 626, -1, -1, - -1, -1, -1, -1, 633, 634, -1, 636, 637, 638, - -1, -1, 641, -1, 5, 644, 7, 8, 9, 10, - 11, 12, 13, 14, 15, -1, -1, -1, 19, -1, - -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, - 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, - 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, - -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, 97, 98, -1, 100, - -1, -1, 103, 104, -1, 106, -1, 108, -1, 110, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, - -1, -1, 133, -1, 135, 136, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, 150, - 151, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, 176, 177, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, -1, -1, 194, -1, -1, -1, 198, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, 210, - 211, 212, 213, -1, -1, 216, 217, 218, -1, 220, - -1, -1, -1, 224, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, 240, - -1, 242, -1, -1, -1, 246, 247, 248, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, 265, 266, 267, -1, -1, 270, - -1, -1, 273, 274, 275, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, 286, 287, 288, -1, -1, - -1, -1, -1, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, 366, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, 382, 383, -1, -1, -1, -1, -1, -1, -1, - -1, 392, 393, 394, -1, -1, 397, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - -1, -1, 413, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, 439, -1, - 441, 442, 443, 444, 445, -1, 447, 448, -1, 450, - 451, 452, -1, -1, 455, -1, 457, -1, 459, 460, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, -1, 483, 484, 485, -1, -1, 488, 489, 490, - 491, -1, -1, -1, 495, -1, -1, 498, 499, -1, - 501, 502, 503, 504, 505, 506, -1, 508, 509, 510, - 511, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - 531, 532, -1, -1, -1, 536, -1, -1, 539, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, 564, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, 580, - -1, -1, 583, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, 594, 595, -1, -1, 598, -1, -1, - 601, 602, 603, 604, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, 634, -1, 636, 637, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, 13, 14, 15, - -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, - 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, - -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, - 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, - -1, -1, 58, 59, -1, 61, 62, -1, 64, 65, - -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, - 76, 77, 78, 79, 80, -1, 82, 83, 84, 85, - 86, 87, 88, 89, -1, 91, 92, -1, 94, 95, - 96, 97, 98, -1, 100, -1, -1, 103, 104, -1, - 106, -1, 108, -1, 110, 111, -1, 113, -1, -1, - -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, - -1, 127, 128, -1, -1, -1, -1, 133, -1, 135, - 136, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, 151, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, -1, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, 212, 213, -1, -1, - 216, 217, 218, -1, 220, -1, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, 240, -1, 242, -1, -1, -1, - 246, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, 275, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - 286, 287, 288, -1, -1, -1, -1, -1, -1, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, 439, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, 485, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, 498, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, 564, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, 580, -1, -1, 583, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, 602, 603, 604, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, - 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, - 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, - -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, 97, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, 128, 129, -1, - -1, -1, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, 150, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, 176, 177, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, 192, -1, 194, -1, -1, -1, 198, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, 210, - 211, -1, 213, -1, -1, 216, 217, 218, -1, 220, - 221, -1, -1, 224, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, 248, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, 265, 266, 267, -1, -1, 270, - -1, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - 291, -1, -1, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, 363, 364, -1, 366, 367, -1, -1, 370, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, 382, 383, -1, -1, -1, -1, -1, -1, -1, - -1, 392, 393, 394, -1, -1, 397, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - -1, -1, 413, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, 448, -1, 450, - 451, 452, -1, -1, 455, -1, 457, -1, 459, 460, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, -1, 483, 484, -1, -1, -1, 488, 489, 490, - 491, -1, -1, -1, 495, -1, -1, -1, 499, -1, - 501, 502, 503, 504, 505, 506, -1, 508, 509, 510, - 511, 512, 513, -1, -1, 516, 517, 518, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - 531, 532, -1, -1, -1, 536, -1, -1, 539, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, -1, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, 583, 584, 585, 586, 587, 588, 589, -1, - 591, 592, -1, 594, 595, -1, -1, 598, -1, -1, - 601, -1, 603, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, 634, -1, 636, 637, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, + 479, 480, 481, 482, -1, 484, 485, -1, -1, -1, + 489, 490, 491, 492, -1, -1, -1, 496, -1, -1, + -1, 500, -1, 502, 503, 504, 505, 506, 507, -1, + 509, 510, 511, 512, 513, 514, -1, -1, -1, -1, + -1, -1, 521, 522, -1, 524, -1, -1, 527, -1, + -1, -1, 531, 532, 533, -1, -1, -1, 537, 538, + 539, 540, 541, -1, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, -1, + -1, 560, 561, 562, 563, -1, 565, 566, 567, -1, + 569, 570, 571, 572, -1, -1, -1, -1, -1, 578, + 579, 580, -1, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, -1, 595, 596, -1, -1, + 599, -1, -1, 602, -1, 604, -1, 606, 607, -1, + -1, 610, 611, 612, 613, 614, -1, -1, 617, 618, + -1, 620, 621, 622, 623, 624, 625, 626, 627, -1, + -1, -1, -1, -1, -1, 634, 635, -1, 637, 638, + 639, -1, -1, 642, -1, -1, -1, -1, -1, -1, + -1, 650, 651, -1, -1, -1, -1, 656, 657, -1, + -1, 660, 661, -1, -1, 664, 665, 5, -1, 7, + 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, + -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, 34, -1, -1, 37, + 38, 39, 40, 41, 42, 43, -1, 45, 46, 47, + -1, 49, -1, 51, 52, -1, -1, 55, 56, 57, + 58, 59, -1, 61, 62, 63, 64, 65, -1, 67, + 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, + 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, + 88, 89, -1, 91, 92, -1, 94, 95, 96, 97, + 98, -1, 100, 101, 102, 103, -1, -1, 106, 107, + 108, 109, 110, 111, -1, 113, 114, 115, -1, 117, + 118, 119, 120, 121, 122, -1, -1, -1, -1, 127, + 128, 129, -1, -1, 132, 133, -1, 135, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, 146, -1, + -1, -1, -1, 151, -1, -1, 154, 155, 156, -1, + -1, -1, 160, -1, 162, 163, -1, 165, 166, 167, + -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, + 178, 179, -1, 181, 182, 183, 184, 185, 186, 187, + 188, -1, 190, 191, 192, 193, -1, 195, -1, -1, + -1, 199, 200, 201, 202, -1, 204, -1, 206, 207, + 208, 209, 210, 211, 212, -1, 214, -1, 216, 217, + 218, 219, -1, 221, 222, 223, -1, 225, 226, -1, + -1, -1, 230, 231, 232, 233, 234, 235, -1, -1, + 238, 239, 240, -1, -1, 243, -1, -1, -1, 247, + 248, 249, 250, -1, -1, 253, -1, 255, 256, -1, + 258, 259, -1, -1, -1, 263, -1, -1, 266, 267, + 268, -1, -1, 271, -1, 273, 274, 275, -1, -1, + -1, -1, -1, 281, 282, -1, 284, -1, 286, -1, + 288, 289, -1, -1, 292, -1, -1, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, -1, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, -1, -1, + -1, -1, 330, 331, 332, 333, 334, 335, -1, -1, + 338, 339, 340, 341, -1, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, -1, 356, 357, + -1, -1, 360, 361, 362, 363, 364, 365, 366, 367, + 368, -1, 370, 371, 372, -1, 374, 375, 376, -1, + 378, 379, 380, 381, -1, 383, 384, -1, -1, -1, + -1, -1, -1, -1, -1, 393, 394, 395, -1, 397, + 398, -1, 400, -1, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, -1, 414, 415, 416, -1, + 418, -1, 420, 421, 422, 423, 424, -1, 426, 427, + 428, -1, -1, 431, -1, -1, -1, 435, 436, 437, + 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, + 448, 449, -1, 451, 452, 453, 454, 455, 456, -1, + 458, -1, 460, 461, -1, 463, 464, -1, 466, -1, + 468, -1, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, -1, 484, 485, -1, -1, + -1, 489, 490, 491, 492, -1, -1, -1, 496, -1, + -1, -1, 500, -1, 502, 503, 504, 505, 506, 507, + -1, 509, 510, 511, 512, 513, 514, -1, -1, -1, + -1, -1, -1, 521, 522, -1, 524, -1, -1, 527, + -1, -1, -1, 531, 532, 533, -1, -1, -1, 537, + 538, 539, 540, 541, -1, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + -1, -1, 560, 561, 562, 563, -1, 565, 566, 567, + -1, 569, 570, 571, 572, -1, -1, -1, -1, -1, + 578, 579, 580, -1, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, -1, 595, 596, -1, + -1, 599, -1, -1, 602, -1, 604, -1, 606, 607, + -1, -1, 610, 611, 612, 613, 614, -1, -1, 617, + 618, -1, 620, 621, 622, 623, 624, 625, 626, 627, + -1, -1, -1, -1, -1, -1, 634, 635, -1, 637, + 638, 639, -1, -1, 642, -1, -1, -1, -1, -1, + -1, -1, 650, 651, -1, -1, -1, -1, 656, 657, + -1, -1, 660, 661, -1, -1, 664, 665, 5, -1, + 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, + -1, -1, 19, -1, -1, 22, -1, 24, 25, 26, + 27, 28, 29, 30, 31, 32, -1, 34, -1, -1, + 37, 38, 39, 40, 41, 42, 43, -1, 45, 46, + 47, -1, 49, -1, 51, 52, -1, -1, 55, 56, + 57, 58, 59, -1, 61, 62, 63, 64, 65, -1, + 67, 68, 69, 70, 71, 72, -1, 74, 75, 76, + 77, 78, 79, 80, -1, 82, 83, 84, 85, 86, + 87, 88, 89, -1, 91, 92, -1, 94, 95, 96, + 97, 98, -1, 100, 101, 102, 103, -1, -1, 106, + 107, 108, 109, 110, 111, -1, 113, 114, 115, -1, + 117, 118, 119, 120, 121, 122, -1, -1, -1, -1, + 127, 128, 129, -1, -1, 132, 133, -1, 135, -1, + -1, -1, -1, 140, -1, 142, 143, 144, 145, 146, + -1, -1, -1, -1, 151, -1, -1, 154, 155, 156, + -1, -1, -1, 160, -1, 162, 163, -1, 165, 166, + 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, + 177, 178, 179, -1, 181, 182, 183, 184, 185, 186, + 187, 188, -1, 190, 191, 192, 193, -1, 195, -1, + -1, -1, 199, 200, 201, 202, -1, 204, -1, 206, + 207, 208, 209, 210, 211, 212, -1, 214, -1, 216, + 217, 218, 219, -1, 221, 222, 223, -1, 225, 226, + -1, -1, -1, 230, 231, 232, 233, 234, 235, -1, + -1, 238, 239, 240, -1, -1, 243, -1, -1, -1, + 247, 248, 249, 250, -1, -1, 253, -1, 255, 256, + -1, 258, 259, -1, -1, -1, 263, -1, -1, 266, + 267, 268, -1, -1, 271, -1, 273, 274, 275, -1, + -1, -1, -1, -1, 281, 282, -1, 284, -1, 286, + -1, 288, 289, -1, -1, 292, -1, -1, -1, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, -1, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, -1, + -1, -1, -1, 330, 331, 332, 333, 334, 335, -1, + -1, 338, 339, 340, 341, -1, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, -1, 356, + 357, -1, -1, 360, 361, 362, 363, 364, 365, 366, + 367, 368, -1, 370, 371, 372, -1, 374, 375, 376, + -1, 378, 379, 380, 381, -1, 383, 384, -1, -1, + -1, -1, -1, -1, -1, -1, 393, 394, 395, -1, + 397, 398, -1, 400, -1, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, -1, 414, 415, 416, + -1, 418, -1, 420, 421, 422, 423, 424, -1, 426, + 427, 428, -1, -1, 431, -1, -1, -1, 435, 436, + 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, + -1, 448, 449, -1, 451, 452, 453, 454, 455, 456, + -1, 458, -1, 460, 461, -1, 463, 464, -1, 466, + -1, 468, -1, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, -1, 484, 485, -1, + -1, -1, 489, 490, 491, 492, -1, -1, -1, 496, + -1, -1, -1, 500, -1, 502, 503, 504, 505, 506, + 507, -1, 509, 510, 511, 512, 513, 514, -1, -1, + -1, -1, -1, -1, 521, 522, -1, 524, -1, -1, + 527, -1, -1, -1, 531, 532, 533, -1, -1, -1, + 537, 538, 539, 540, 541, -1, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, -1, -1, 560, 561, 562, 563, -1, 565, 566, + 567, -1, 569, 570, 571, 572, -1, -1, -1, -1, + -1, 578, 579, 580, -1, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, -1, 595, 596, + -1, -1, 599, -1, -1, 602, -1, 604, -1, 606, + 607, -1, -1, 610, 611, 612, 613, 614, -1, -1, + 617, 618, -1, 620, 621, 622, 623, 624, 625, 626, + 627, -1, -1, -1, -1, -1, -1, 634, 635, -1, + 637, 638, 639, -1, -1, 642, -1, -1, -1, -1, + -1, -1, -1, 650, 651, -1, -1, -1, -1, 656, + 657, -1, -1, 660, 661, -1, -1, 664, 665, 5, + -1, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, - -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, + -1, 37, 38, 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, - -1, -1, 58, 59, -1, 61, 62, -1, 64, 65, + 56, 57, 58, 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, 94, 95, - 96, 97, 98, -1, 100, -1, -1, 103, -1, -1, - 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, - -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, + 96, 97, 98, -1, 100, 101, 102, 103, -1, -1, + 106, 107, 108, 109, 110, 111, -1, 113, 114, 115, + -1, 117, 118, 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, 129, -1, -1, 132, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, 192, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, 221, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, -1, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, 291, -1, -1, -1, 295, + -1, -1, -1, -1, 140, -1, 142, 143, 144, 145, + 146, -1, -1, -1, -1, 151, -1, -1, 154, 155, + 156, -1, -1, -1, 160, -1, 162, 163, -1, 165, + 166, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, 178, 179, -1, 181, 182, 183, 184, 185, + 186, 187, 188, -1, 190, 191, 192, 193, -1, 195, + -1, -1, -1, 199, 200, 201, 202, -1, 204, -1, + 206, 207, 208, 209, 210, 211, 212, -1, 214, -1, + 216, 217, 218, 219, -1, 221, 222, 223, -1, 225, + 226, -1, -1, -1, 230, 231, 232, 233, 234, 235, + -1, -1, 238, 239, 240, -1, -1, 243, -1, -1, + -1, 247, 248, 249, 250, -1, -1, 253, -1, 255, + 256, -1, 258, 259, -1, -1, -1, 263, -1, -1, + 266, 267, 268, -1, -1, 271, -1, 273, 274, 275, + -1, -1, -1, -1, -1, 281, 282, -1, 284, -1, + 286, -1, 288, 289, -1, -1, 292, -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, 370, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, -1, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, 564, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, 587, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, 5, 641, 7, 8, 9, 10, + 306, 307, 308, 309, 310, 311, -1, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + -1, -1, -1, -1, 330, 331, 332, 333, 334, 335, + -1, -1, 338, 339, 340, 341, -1, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, -1, + 356, 357, -1, -1, 360, 361, 362, 363, 364, 365, + 366, 367, 368, -1, 370, 371, 372, -1, 374, 375, + 376, -1, 378, 379, 380, 381, -1, 383, 384, -1, + -1, -1, -1, -1, -1, -1, -1, 393, 394, 395, + -1, 397, 398, -1, 400, -1, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, -1, 414, 415, + 416, -1, 418, -1, 420, 421, 422, 423, 424, -1, + 426, 427, 428, -1, -1, 431, -1, -1, -1, 435, + 436, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, -1, 451, 452, 453, 454, 455, + 456, -1, 458, -1, 460, 461, -1, 463, 464, -1, + 466, -1, 468, -1, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, -1, 484, 485, + -1, -1, -1, 489, 490, 491, 492, -1, -1, -1, + 496, -1, -1, -1, 500, -1, 502, 503, 504, 505, + 506, 507, -1, 509, 510, 511, 512, 513, 514, -1, + -1, -1, -1, -1, -1, 521, 522, -1, 524, -1, + -1, 527, -1, -1, -1, 531, 532, 533, -1, -1, + -1, 537, 538, 539, 540, 541, -1, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, -1, -1, 560, 561, 562, 563, -1, 565, + 566, 567, -1, 569, 570, 571, 572, -1, -1, -1, + -1, -1, 578, 579, 580, -1, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, -1, 595, + 596, -1, -1, 599, -1, -1, 602, -1, 604, -1, + 606, 607, -1, -1, 610, 611, 612, 613, 614, -1, + -1, 617, 618, -1, 620, 621, 622, 623, 624, 625, + 626, 627, -1, -1, -1, -1, -1, -1, 634, 635, + -1, 637, 638, 639, -1, -1, 642, -1, -1, -1, + -1, -1, -1, -1, 650, 651, -1, -1, -1, -1, + 656, 657, -1, -1, 660, 661, -1, -1, 664, 665, + 5, -1, 7, 8, 9, 10, 11, 12, -1, -1, + 15, -1, -1, -1, 19, -1, -1, 22, -1, 24, + 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, + -1, -1, 37, 38, 39, 40, 41, 42, 43, -1, + 45, 46, 47, -1, 49, -1, 51, 52, -1, -1, + 55, 56, 57, 58, 59, -1, 61, 62, 63, 64, + 65, -1, 67, 68, 69, 70, 71, 72, -1, 74, + 75, 76, 77, 78, 79, 80, -1, 82, 83, 84, + 85, 86, 87, 88, 89, -1, 91, 92, -1, 94, + 95, 96, 97, 98, -1, 100, 101, 102, 103, -1, + -1, 106, 107, 108, 109, 110, 111, -1, 113, 114, + 115, -1, 117, 118, 119, 120, 121, 122, -1, -1, + -1, -1, 127, 128, 129, -1, -1, 132, 133, -1, + 135, -1, -1, -1, -1, 140, -1, 142, 143, 144, + 145, 146, -1, -1, -1, -1, 151, -1, -1, 154, + 155, 156, -1, -1, -1, 160, -1, 162, 163, -1, + 165, 166, 167, -1, 169, 170, -1, 172, 173, 174, + 175, 176, 177, 178, 179, -1, 181, 182, 183, 184, + 185, 186, 187, 188, -1, 190, 191, 192, 193, -1, + 195, -1, -1, -1, 199, 200, -1, 202, -1, 204, + -1, 206, 207, 208, 209, 210, 211, 212, -1, 214, + -1, 216, 217, 218, 219, -1, 221, 222, 223, -1, + 225, 226, -1, -1, -1, 230, 231, 232, 233, 234, + 235, -1, -1, 238, 239, 240, -1, -1, 243, -1, + -1, -1, 247, 248, 249, 250, -1, -1, 253, -1, + 255, 256, -1, 258, 259, -1, -1, -1, 263, -1, + -1, 266, 267, 268, -1, -1, 271, -1, 273, 274, + 275, -1, -1, -1, -1, -1, 281, 282, -1, 284, + -1, 286, -1, 288, 289, -1, -1, 292, -1, -1, + -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, -1, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, -1, -1, -1, -1, 330, 331, 332, 333, 334, + 335, -1, -1, 338, 339, 340, 341, -1, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + -1, 356, 357, -1, -1, 360, 361, 362, 363, 364, + 365, 366, 367, 368, -1, 370, 371, 372, -1, 374, + 375, 376, -1, 378, 379, 380, 381, -1, 383, 384, + -1, -1, -1, -1, -1, -1, -1, -1, 393, 394, + 395, -1, 397, 398, -1, 400, -1, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, -1, 414, + 415, 416, -1, 418, -1, 420, 421, 422, 423, 424, + -1, 426, 427, 428, -1, -1, 431, -1, -1, -1, + 435, 436, 437, 438, 439, -1, -1, 442, 443, 444, + 445, 446, -1, 448, 449, -1, 451, 452, 453, 454, + 455, 456, -1, 458, -1, 460, 461, -1, 463, 464, + -1, 466, -1, 468, -1, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, -1, 484, + 485, -1, -1, -1, 489, 490, 491, 492, -1, -1, + -1, 496, -1, -1, -1, 500, -1, 502, 503, 504, + 505, 506, 507, -1, 509, 510, 511, 512, 513, 514, + -1, -1, -1, -1, -1, -1, 521, 522, -1, 524, + -1, -1, 527, -1, -1, -1, 531, 532, 533, -1, + -1, -1, 537, 538, 539, 540, 541, -1, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, -1, -1, 560, 561, 562, 563, -1, + 565, 566, 567, -1, 569, 570, 571, 572, -1, -1, + -1, -1, -1, 578, 579, 580, -1, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, -1, + 595, 596, -1, -1, 599, -1, -1, 602, -1, 604, + -1, 606, 607, -1, -1, 610, 611, 612, 613, 614, + -1, -1, 617, 618, -1, 620, 621, 622, 623, 624, + 625, 626, 627, -1, -1, -1, -1, -1, -1, 634, + 635, -1, 637, 638, 639, -1, -1, 642, -1, -1, + -1, -1, -1, -1, -1, 650, 651, -1, -1, -1, + -1, 656, 657, -1, -1, 660, 661, -1, -1, 664, + 665, 5, -1, 7, 8, 9, 10, 11, 12, -1, + -1, 15, -1, -1, -1, 19, -1, -1, 22, -1, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + 34, -1, -1, 37, 38, 39, 40, 41, 42, 43, + -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, + -1, 55, 56, 57, 58, 59, -1, 61, 62, 63, + 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, + 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, + 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, + 94, 95, 96, 97, 98, -1, 100, 101, 102, 103, + -1, -1, 106, 107, 108, 109, 110, 111, -1, 113, + 114, 115, -1, 117, 118, 119, 120, 121, 122, -1, + -1, -1, -1, 127, 128, 129, -1, -1, 132, 133, + -1, 135, -1, -1, -1, -1, 140, -1, 142, 143, + 144, 145, 146, -1, -1, -1, -1, 151, -1, -1, + 154, 155, 156, -1, -1, -1, 160, -1, 162, 163, + -1, 165, 166, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, 178, 179, -1, 181, 182, 183, + 184, 185, 186, 187, 188, -1, 190, 191, 192, 193, + -1, 195, -1, -1, -1, 199, 200, -1, 202, -1, + 204, -1, 206, 207, 208, 209, 210, 211, 212, -1, + 214, -1, 216, 217, 218, 219, -1, 221, 222, 223, + -1, 225, 226, -1, -1, -1, 230, 231, 232, 233, + 234, 235, -1, -1, 238, 239, 240, -1, -1, 243, + -1, -1, -1, 247, 248, 249, 250, -1, -1, 253, + -1, 255, 256, -1, 258, 259, -1, -1, -1, 263, + -1, -1, 266, 267, 268, -1, -1, 271, -1, 273, + 274, 275, -1, -1, -1, -1, -1, 281, 282, -1, + 284, -1, 286, -1, 288, 289, -1, -1, 292, -1, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, -1, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, -1, -1, -1, -1, 330, 331, 332, 333, + 334, 335, -1, -1, 338, 339, 340, 341, -1, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, -1, 356, 357, -1, -1, 360, 361, 362, 363, + 364, 365, 366, 367, 368, -1, 370, 371, 372, -1, + 374, 375, 376, -1, 378, 379, 380, 381, -1, 383, + 384, -1, -1, -1, -1, -1, -1, -1, -1, 393, + 394, 395, -1, 397, 398, -1, 400, -1, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, -1, + 414, 415, 416, -1, 418, -1, 420, 421, 422, 423, + 424, -1, 426, 427, 428, -1, -1, 431, -1, -1, + -1, 435, 436, 437, 438, 439, -1, -1, 442, 443, + 444, 445, 446, -1, 448, 449, -1, 451, 452, 453, + 454, 455, 456, -1, 458, -1, 460, 461, -1, 463, + 464, -1, 466, -1, 468, -1, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, -1, + 484, 485, -1, -1, -1, 489, 490, 491, 492, -1, + -1, -1, 496, -1, -1, -1, 500, -1, 502, 503, + 504, 505, 506, 507, -1, 509, 510, 511, 512, 513, + 514, -1, -1, -1, -1, -1, -1, 521, 522, -1, + 524, -1, -1, 527, -1, -1, -1, 531, 532, 533, + -1, -1, -1, 537, 538, 539, 540, 541, -1, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, -1, -1, 560, 561, 562, 563, + -1, 565, 566, 567, -1, 569, 570, 571, 572, -1, + -1, -1, -1, -1, 578, 579, 580, -1, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + -1, 595, 596, -1, -1, 599, -1, -1, 602, -1, + 604, -1, 606, 607, -1, -1, 610, 611, 612, 613, + 614, -1, -1, 617, 618, -1, 620, 621, 622, 623, + 624, 625, 626, 627, -1, -1, -1, -1, -1, -1, + 634, 635, -1, 637, 638, 639, -1, -1, 642, -1, + -1, -1, -1, -1, -1, -1, 650, 651, -1, -1, + -1, -1, 656, 657, -1, -1, 660, 661, -1, -1, + 664, 665, 5, -1, 7, 8, 9, 10, 11, 12, + 13, -1, 15, -1, -1, -1, 19, -1, -1, 22, + -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, + -1, 34, -1, -1, 37, 38, 39, 40, 41, 42, + 43, -1, 45, 46, 47, -1, 49, -1, 51, 52, + -1, -1, 55, 56, 57, 58, 59, -1, 61, 62, + 63, 64, 65, -1, 67, 68, 69, 70, 71, 72, + -1, 74, 75, 76, 77, 78, 79, 80, -1, 82, + 83, 84, 85, 86, 87, 88, 89, -1, 91, 92, + -1, 94, 95, 96, 97, 98, -1, 100, 101, 102, + 103, -1, -1, 106, 107, 108, 109, 110, 111, -1, + 113, 114, 115, -1, 117, 118, 119, 120, 121, 122, + -1, -1, -1, -1, 127, 128, 129, -1, -1, 132, + 133, -1, 135, -1, -1, -1, -1, 140, -1, 142, + 143, 144, 145, 146, -1, -1, -1, -1, 151, -1, + -1, 154, 155, 156, -1, -1, -1, 160, -1, 162, + 163, -1, 165, 166, 167, -1, 169, 170, -1, 172, + 173, 174, 175, 176, 177, 178, 179, -1, 181, 182, + 183, 184, 185, 186, 187, 188, -1, 190, 191, 192, + 193, -1, 195, -1, -1, -1, 199, 200, -1, 202, + -1, 204, -1, 206, 207, 208, 209, 210, 211, 212, + -1, 214, -1, 216, 217, 218, 219, -1, 221, 222, + 223, -1, 225, 226, -1, -1, -1, 230, 231, 232, + 233, 234, 235, -1, -1, 238, 239, 240, -1, -1, + 243, -1, -1, -1, 247, 248, 249, 250, -1, -1, + 253, -1, 255, 256, -1, 258, 259, -1, -1, -1, + 263, -1, -1, 266, 267, 268, -1, -1, 271, -1, + 273, 274, 275, -1, -1, -1, -1, -1, 281, 282, + -1, 284, -1, 286, -1, 288, 289, -1, -1, 292, + -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, -1, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, -1, -1, -1, -1, 330, 331, 332, + 333, 334, 335, -1, -1, 338, 339, 340, 341, -1, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, -1, 356, 357, -1, -1, 360, 361, 362, + 363, 364, -1, 366, 367, 368, -1, 370, 371, 372, + -1, 374, 375, 376, -1, 378, 379, 380, 381, -1, + 383, 384, -1, -1, -1, -1, -1, -1, -1, -1, + 393, 394, 395, -1, 397, 398, -1, 400, -1, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + -1, 414, 415, 416, -1, 418, -1, 420, 421, 422, + 423, 424, -1, 426, 427, 428, -1, -1, 431, -1, + -1, -1, 435, 436, 437, 438, 439, -1, -1, 442, + 443, 444, 445, 446, -1, 448, 449, -1, 451, 452, + 453, 454, 455, 456, -1, 458, -1, 460, 461, -1, + 463, 464, -1, 466, -1, 468, -1, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + -1, 484, 485, -1, -1, -1, 489, 490, 491, 492, + -1, -1, -1, 496, -1, -1, -1, 500, -1, 502, + 503, 504, 505, 506, 507, -1, 509, 510, 511, 512, + 513, 514, -1, -1, -1, -1, -1, -1, 521, 522, + -1, 524, -1, -1, 527, -1, -1, -1, 531, 532, + 533, -1, -1, -1, 537, 538, 539, 540, 541, -1, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, -1, -1, 560, 561, 562, + 563, -1, 565, 566, 567, -1, 569, 570, 571, 572, + -1, -1, -1, -1, -1, 578, 579, 580, -1, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, -1, 595, 596, -1, -1, 599, -1, -1, 602, + -1, 604, -1, 606, 607, -1, -1, 610, 611, 612, + 613, 614, -1, -1, 617, 618, -1, 620, 621, 622, + 623, 624, 625, 626, 627, -1, -1, -1, -1, -1, + -1, 634, 635, -1, 637, 638, 639, -1, -1, 642, + -1, -1, -1, -1, -1, -1, -1, 650, 651, -1, + -1, -1, -1, 656, 657, -1, -1, 660, 661, -1, + -1, 664, 665, 5, -1, 7, 8, 9, 10, 11, + 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, + 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, 34, -1, -1, 37, 38, 39, 40, 41, + 42, 43, -1, 45, 46, 47, -1, 49, -1, 51, + 52, -1, -1, 55, 56, 57, 58, 59, -1, 61, + 62, 63, 64, 65, -1, 67, 68, 69, 70, 71, + 72, -1, 74, 75, 76, 77, 78, 79, 80, -1, + 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, + 92, -1, 94, 95, 96, 97, 98, -1, 100, 101, + 102, 103, -1, -1, 106, 107, 108, 109, 110, 111, + -1, 113, 114, 115, -1, 117, 118, 119, 120, 121, + 122, -1, -1, -1, -1, 127, 128, 129, -1, -1, + 132, 133, -1, 135, -1, -1, -1, -1, 140, -1, + 142, 143, 144, 145, 146, -1, -1, -1, -1, 151, + -1, -1, 154, 155, 156, -1, -1, -1, 160, -1, + 162, 163, -1, 165, 166, 167, -1, 169, 170, -1, + 172, 173, 174, 175, 176, 177, 178, 179, -1, 181, + 182, 183, 184, 185, 186, 187, 188, -1, 190, 191, + 192, 193, -1, 195, -1, -1, -1, 199, 200, -1, + 202, -1, 204, -1, 206, 207, 208, 209, 210, 211, + 212, -1, 214, -1, 216, 217, 218, 219, -1, 221, + 222, 223, -1, 225, 226, -1, -1, -1, 230, 231, + 232, 233, 234, 235, -1, -1, 238, 239, 240, -1, + -1, 243, -1, -1, -1, 247, 248, 249, 250, -1, + -1, 253, -1, 255, 256, -1, 258, 259, -1, -1, + -1, 263, -1, -1, 266, 267, 268, -1, -1, 271, + -1, 273, 274, 275, -1, -1, -1, -1, -1, 281, + 282, -1, 284, -1, 286, -1, 288, 289, -1, -1, + 292, -1, -1, -1, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + -1, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, -1, -1, -1, -1, 330, 331, + 332, 333, 334, 335, -1, -1, 338, 339, 340, 341, + -1, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, -1, 356, 357, -1, -1, 360, 361, + 362, 363, 364, 365, 366, 367, 368, -1, 370, 371, + 372, -1, 374, 375, 376, -1, 378, 379, 380, 381, + -1, 383, 384, -1, -1, -1, -1, -1, -1, -1, + -1, 393, 394, 395, -1, 397, 398, -1, 400, -1, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, -1, 414, 415, 416, -1, 418, -1, 420, 421, + 422, 423, 424, -1, 426, 427, 428, -1, -1, 431, + -1, -1, -1, 435, 436, 437, 438, 439, -1, -1, + 442, 443, 444, 445, 446, -1, 448, 449, -1, 451, + 452, 453, 454, 455, 456, -1, 458, -1, 460, 461, + -1, 463, 464, -1, 466, -1, 468, -1, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, -1, 484, 485, -1, -1, -1, 489, 490, 491, + 492, -1, -1, -1, 496, -1, -1, -1, 500, -1, + 502, 503, 504, 505, 506, 507, -1, 509, 510, 511, + 512, 513, 514, -1, -1, -1, -1, -1, -1, 521, + 522, -1, 524, -1, -1, 527, -1, -1, -1, 531, + 532, 533, -1, -1, -1, 537, 538, 539, 540, 541, + -1, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, -1, -1, 560, 561, + 562, 563, -1, 565, 566, 567, -1, 569, 570, 571, + 572, -1, -1, -1, -1, -1, 578, 579, 580, -1, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, -1, 595, 596, -1, -1, 599, -1, -1, + 602, -1, 604, -1, 606, 607, -1, -1, 610, 611, + 612, 613, 614, -1, -1, 617, 618, -1, 620, 621, + 622, 623, 624, 625, 626, 627, -1, -1, -1, -1, + -1, -1, 634, 635, -1, 637, 638, 639, -1, -1, + 642, -1, -1, -1, -1, -1, -1, -1, 650, 651, + -1, -1, -1, -1, 656, 657, -1, -1, 660, 661, + -1, -1, 664, 665, 5, -1, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, - 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, - 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, + 31, 32, -1, 34, -1, -1, 37, 38, 39, 40, + 41, 42, 43, -1, 45, 46, 47, -1, 49, -1, + 51, 52, -1, -1, 55, 56, 57, 58, 59, -1, + 61, 62, 63, 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, 128, 129, -1, - -1, 132, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, 150, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, 176, 177, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, 192, -1, 194, -1, -1, -1, 198, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, 210, - 211, -1, 213, -1, -1, 216, 217, 218, -1, 220, - 221, -1, -1, 224, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, 248, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, 265, 266, 267, -1, -1, 270, - -1, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - 291, -1, -1, -1, 295, 296, 297, 298, 299, 300, + 101, 102, 103, -1, -1, 106, 107, 108, 109, 110, + 111, -1, 113, 114, 115, -1, 117, 118, 119, 120, + 121, 122, -1, -1, -1, -1, 127, 128, 129, -1, + -1, 132, 133, -1, 135, -1, -1, -1, -1, 140, + -1, 142, 143, 144, 145, 146, -1, -1, -1, -1, + 151, -1, -1, 154, 155, 156, -1, -1, -1, 160, + -1, 162, 163, -1, 165, 166, 167, -1, 169, 170, + -1, 172, 173, 174, 175, 176, 177, 178, 179, -1, + 181, 182, 183, 184, 185, 186, 187, 188, -1, 190, + 191, 192, 193, -1, 195, -1, -1, -1, 199, 200, + -1, 202, -1, 204, -1, 206, 207, 208, 209, 210, + 211, 212, -1, 214, -1, 216, 217, 218, 219, -1, + 221, 222, 223, -1, 225, 226, -1, -1, -1, 230, + 231, 232, 233, 234, 235, -1, -1, 238, 239, 240, + -1, -1, 243, -1, -1, -1, 247, 248, 249, 250, + -1, -1, 253, -1, 255, 256, -1, 258, 259, -1, + -1, -1, 263, -1, -1, 266, 267, 268, -1, -1, + 271, -1, 273, 274, 275, -1, -1, -1, -1, -1, + 281, 282, -1, 284, -1, 286, -1, 288, 289, -1, + -1, 292, -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, 366, 367, -1, -1, 370, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, 382, 383, -1, -1, -1, -1, -1, -1, -1, - -1, 392, 393, 394, -1, -1, 397, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - -1, -1, 413, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, 448, -1, 450, - 451, 452, -1, -1, 455, -1, 457, -1, 459, 460, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, + 311, -1, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, -1, -1, -1, -1, 330, + 331, 332, 333, 334, 335, -1, -1, 338, 339, 340, + 341, -1, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, -1, 356, 357, -1, -1, 360, + 361, 362, 363, 364, 365, 366, 367, 368, -1, 370, + 371, 372, -1, 374, 375, 376, -1, 378, 379, 380, + 381, -1, 383, 384, -1, -1, -1, -1, -1, -1, + -1, -1, 393, 394, 395, -1, 397, 398, -1, 400, + -1, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, -1, 414, 415, 416, -1, 418, -1, 420, + 421, 422, 423, 424, -1, 426, 427, 428, -1, -1, + 431, -1, -1, -1, 435, 436, 437, 438, 439, -1, + -1, 442, 443, 444, 445, 446, -1, 448, 449, -1, + 451, 452, 453, 454, 455, 456, -1, 458, -1, 460, + 461, -1, 463, 464, -1, 466, -1, 468, -1, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, -1, 483, 484, -1, -1, -1, 488, 489, 490, - 491, -1, -1, -1, 495, -1, -1, -1, 499, -1, - 501, 502, 503, 504, 505, 506, -1, 508, 509, 510, - 511, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - 531, 532, -1, -1, -1, 536, -1, -1, 539, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, 564, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, 583, 584, 585, 586, 587, 588, 589, -1, - 591, 592, -1, 594, 595, -1, -1, 598, -1, -1, - 601, -1, 603, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, 634, -1, 636, 637, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, + 481, 482, -1, 484, 485, -1, -1, -1, 489, 490, + 491, 492, -1, -1, -1, 496, -1, -1, -1, 500, + -1, 502, 503, 504, 505, 506, 507, -1, 509, 510, + 511, 512, 513, 514, -1, -1, -1, -1, -1, -1, + 521, 522, -1, 524, -1, -1, 527, -1, -1, -1, + 531, 532, 533, -1, -1, -1, 537, 538, 539, 540, + 541, -1, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, -1, -1, 560, + 561, 562, 563, -1, 565, 566, 567, -1, 569, 570, + 571, 572, -1, -1, -1, -1, -1, 578, 579, 580, + -1, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, -1, 595, 596, -1, -1, 599, -1, + -1, 602, -1, 604, -1, 606, 607, -1, -1, 610, + 611, 612, 613, 614, -1, -1, 617, 618, -1, 620, + 621, 622, 623, 624, 625, 626, 627, -1, -1, -1, + -1, -1, -1, 634, 635, -1, 637, 638, 639, -1, + -1, 642, -1, -1, -1, -1, -1, -1, -1, 650, + 651, -1, -1, -1, -1, 656, 657, -1, -1, 660, + 661, -1, -1, 664, 665, 5, -1, 7, 8, 9, + 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, + -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, 34, -1, -1, 37, 38, 39, + 40, 41, 42, 43, -1, 45, 46, 47, -1, 49, + -1, 51, 52, -1, -1, 55, 56, 57, 58, 59, + -1, 61, 62, 63, 64, 65, -1, 67, 68, 69, + 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, + 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, + -1, 91, 92, -1, 94, 95, 96, 97, 98, -1, + 100, 101, 102, 103, -1, -1, 106, 107, 108, 109, + 110, 111, -1, 113, 114, 115, -1, 117, 118, 119, + 120, 121, 122, -1, -1, -1, -1, 127, 128, 129, + -1, -1, 132, 133, -1, 135, -1, -1, -1, -1, + 140, -1, 142, 143, 144, 145, 146, -1, -1, -1, + -1, 151, -1, -1, 154, 155, 156, -1, -1, -1, + 160, -1, 162, 163, -1, 165, 166, 167, -1, 169, + 170, -1, 172, 173, 174, 175, 176, 177, 178, 179, + -1, 181, 182, 183, 184, 185, 186, 187, 188, -1, + 190, 191, 192, 193, -1, 195, -1, -1, -1, 199, + 200, -1, 202, -1, 204, -1, 206, 207, 208, 209, + 210, 211, 212, -1, 214, -1, 216, 217, 218, 219, + -1, 221, 222, 223, -1, 225, 226, -1, -1, -1, + 230, 231, 232, 233, 234, 235, -1, -1, 238, 239, + 240, -1, -1, 243, -1, -1, -1, 247, 248, 249, + 250, -1, -1, 253, -1, 255, 256, -1, 258, 259, + -1, -1, -1, 263, -1, -1, 266, 267, 268, -1, + -1, 271, -1, 273, 274, 275, -1, -1, -1, -1, + -1, 281, 282, -1, 284, -1, 286, -1, 288, 289, + -1, -1, 292, -1, -1, -1, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, -1, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, -1, -1, -1, -1, + 330, 331, 332, 333, 334, 335, -1, -1, 338, 339, + 340, 341, -1, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, -1, 356, 357, -1, -1, + 360, 361, 362, 363, 364, 365, 366, 367, 368, -1, + 370, 371, 372, -1, 374, 375, 376, -1, 378, 379, + 380, 381, -1, 383, 384, -1, -1, -1, -1, -1, + -1, -1, -1, 393, 394, 395, -1, 397, 398, -1, + 400, -1, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, -1, 414, 415, 416, -1, 418, -1, + 420, 421, 422, 423, 424, -1, 426, 427, 428, -1, + -1, 431, -1, -1, -1, 435, 436, 437, 438, 439, + -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, + -1, 451, 452, 453, 454, 455, 456, -1, 458, -1, + 460, 461, -1, 463, 464, -1, 466, -1, 468, -1, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, -1, 484, 485, -1, -1, -1, 489, + 490, 491, 492, -1, -1, -1, 496, -1, -1, -1, + 500, -1, 502, 503, 504, 505, 506, 507, -1, 509, + 510, 511, 512, 513, 514, -1, -1, -1, -1, -1, + -1, 521, 522, -1, 524, -1, -1, 527, -1, -1, + -1, 531, 532, 533, -1, -1, -1, 537, 538, 539, + 540, 541, -1, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, -1, -1, + 560, 561, 562, 563, -1, 565, 566, 567, -1, 569, + 570, 571, 572, -1, -1, -1, -1, -1, 578, 579, + 580, -1, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, -1, 595, 596, -1, -1, 599, + -1, -1, 602, -1, 604, -1, 606, 607, -1, -1, + 610, 611, 612, 613, 614, -1, -1, 617, 618, -1, + 620, 621, 622, 623, 624, 625, 626, 627, -1, -1, + -1, -1, -1, -1, 634, 635, -1, 637, 638, 639, + -1, -1, 642, -1, -1, -1, -1, -1, -1, -1, + 650, 651, -1, -1, -1, -1, 656, 657, -1, -1, + 660, 661, -1, -1, 664, 665, 5, -1, 7, 8, + 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, + 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, + 29, 30, 31, 32, -1, 34, -1, -1, 37, 38, + 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, + 49, -1, 51, 52, -1, -1, 55, 56, 57, 58, + 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, + 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, + 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, + 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, + -1, 100, 101, 102, 103, -1, -1, 106, 107, 108, + 109, 110, 111, -1, 113, 114, 115, -1, 117, 118, + 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, + 129, -1, -1, 132, 133, -1, 135, -1, -1, -1, + -1, 140, -1, 142, 143, 144, 145, 146, -1, -1, + -1, -1, 151, -1, -1, 154, 155, 156, -1, -1, + -1, 160, -1, 162, 163, -1, 165, 166, 167, -1, + 169, 170, -1, 172, 173, 174, 175, 176, 177, 178, + 179, -1, 181, 182, 183, 184, 185, 186, 187, 188, + -1, 190, 191, 192, 193, -1, 195, -1, -1, -1, + 199, 200, -1, 202, -1, 204, -1, 206, 207, 208, + 209, 210, 211, 212, -1, 214, -1, 216, 217, 218, + 219, -1, 221, 222, 223, -1, 225, 226, -1, -1, + -1, 230, 231, 232, 233, 234, 235, -1, -1, 238, + 239, 240, -1, -1, 243, -1, -1, -1, 247, 248, + 249, 250, -1, -1, 253, -1, 255, 256, -1, 258, + 259, -1, -1, -1, 263, -1, -1, 266, 267, 268, + -1, -1, 271, -1, 273, 274, 275, -1, -1, -1, + -1, -1, 281, 282, -1, 284, -1, 286, -1, 288, + 289, -1, -1, 292, -1, -1, -1, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, -1, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, -1, -1, -1, + -1, 330, 331, 332, 333, 334, 335, -1, -1, 338, + 339, 340, 341, -1, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, -1, 356, 357, -1, + -1, 360, 361, 362, 363, 364, 365, 366, 367, 368, + -1, 370, 371, 372, -1, 374, 375, 376, -1, 378, + 379, 380, 381, -1, 383, 384, -1, -1, -1, -1, + -1, -1, -1, -1, 393, 394, 395, -1, 397, 398, + -1, 400, -1, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, -1, 414, 415, 416, -1, 418, + -1, 420, 421, 422, 423, 424, -1, 426, 427, 428, + -1, -1, 431, -1, -1, -1, 435, 436, 437, 438, + 439, -1, -1, 442, 443, 444, 445, 446, -1, 448, + 449, -1, 451, 452, 453, 454, 455, 456, -1, 458, + -1, 460, 461, -1, 463, 464, -1, 466, -1, 468, + -1, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, -1, 484, 485, -1, -1, -1, + 489, 490, 491, 492, -1, -1, -1, 496, -1, -1, + -1, 500, -1, 502, 503, 504, 505, 506, 507, -1, + 509, 510, 511, 512, 513, 514, -1, -1, -1, -1, + -1, -1, 521, 522, -1, 524, -1, -1, 527, -1, + -1, -1, 531, 532, 533, -1, -1, -1, 537, 538, + 539, 540, 541, -1, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, -1, + -1, 560, 561, 562, 563, -1, 565, 566, 567, -1, + 569, 570, 571, 572, -1, -1, -1, -1, -1, 578, + 579, 580, -1, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, -1, 595, 596, -1, -1, + 599, -1, -1, 602, -1, 604, -1, 606, 607, -1, + -1, 610, 611, 612, 613, 614, -1, -1, 617, 618, + -1, 620, 621, 622, 623, 624, 625, 626, 627, -1, + -1, -1, -1, -1, -1, 634, 635, -1, 637, 638, + 639, -1, -1, 642, -1, -1, -1, -1, -1, -1, + -1, 650, 651, -1, -1, -1, -1, 656, 657, -1, + -1, 660, 661, -1, -1, 664, 665, 5, -1, 7, + 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, + -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, 34, -1, -1, 37, + 38, 39, 40, 41, 42, 43, -1, 45, 46, 47, + -1, 49, -1, 51, 52, -1, -1, 55, 56, 57, + 58, 59, -1, 61, 62, 63, 64, 65, -1, 67, + 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, + 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, + 88, 89, -1, 91, 92, -1, 94, 95, 96, 97, + 98, -1, 100, 101, 102, 103, -1, -1, 106, 107, + 108, 109, 110, 111, -1, 113, 114, 115, -1, 117, + 118, 119, 120, 121, 122, -1, -1, -1, -1, 127, + 128, 129, -1, -1, 132, 133, -1, 135, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, 146, -1, + -1, -1, -1, 151, -1, -1, 154, 155, 156, -1, + -1, -1, 160, -1, 162, 163, -1, 165, 166, 167, + -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, + 178, 179, -1, 181, 182, 183, 184, 185, 186, 187, + 188, -1, 190, 191, 192, 193, -1, 195, -1, -1, + -1, 199, 200, -1, 202, -1, 204, -1, 206, 207, + 208, 209, 210, 211, 212, -1, 214, -1, 216, 217, + 218, 219, -1, 221, 222, 223, -1, 225, 226, -1, + -1, -1, 230, 231, 232, 233, 234, 235, -1, -1, + 238, 239, 240, -1, -1, 243, -1, -1, -1, 247, + 248, 249, 250, -1, -1, 253, -1, 255, 256, -1, + 258, 259, -1, -1, -1, 263, -1, -1, 266, 267, + 268, -1, -1, 271, -1, 273, 274, 275, -1, -1, + -1, -1, -1, 281, 282, -1, 284, -1, 286, -1, + 288, 289, -1, -1, 292, -1, -1, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, -1, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, 330, 331, 332, 333, 334, 335, -1, -1, + 338, 339, 340, 341, -1, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, -1, 356, 357, + -1, -1, 360, 361, 362, 363, 364, -1, 366, 367, + 368, -1, 370, 371, 372, -1, 374, 375, 376, -1, + 378, 379, 380, 381, -1, 383, 384, -1, -1, -1, + -1, -1, -1, -1, -1, 393, 394, 395, -1, 397, + 398, -1, 400, -1, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, -1, 414, 415, 416, -1, + 418, -1, 420, 421, 422, 423, 424, -1, 426, 427, + 428, -1, -1, 431, -1, -1, -1, 435, 436, 437, + 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, + 448, 449, -1, 451, 452, 453, 454, 455, 456, -1, + 458, -1, 460, 461, -1, 463, 464, -1, 466, -1, + 468, -1, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, -1, 484, 485, -1, -1, + -1, 489, 490, 491, 492, -1, -1, -1, 496, -1, + -1, -1, 500, -1, 502, 503, 504, 505, 506, 507, + -1, 509, 510, 511, 512, 513, 514, -1, -1, -1, + -1, -1, -1, 521, 522, -1, 524, -1, -1, 527, + -1, -1, -1, 531, 532, 533, -1, -1, -1, 537, + 538, 539, 540, 541, -1, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + -1, -1, 560, 561, 562, 563, -1, 565, 566, 567, + -1, 569, 570, 571, 572, -1, -1, -1, -1, -1, + 578, 579, 580, -1, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, -1, 595, 596, -1, + -1, 599, -1, -1, 602, -1, 604, -1, 606, 607, + -1, -1, 610, 611, 612, 613, 614, -1, -1, 617, + 618, -1, 620, 621, 622, 623, 624, 625, 626, 627, + -1, -1, -1, -1, -1, -1, 634, 635, -1, 637, + 638, 639, -1, -1, 642, -1, -1, -1, -1, -1, + -1, -1, 650, 651, -1, -1, -1, -1, 656, 657, + -1, -1, 660, 661, -1, -1, 664, 665, 5, -1, + 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, + -1, -1, 19, -1, -1, 22, -1, 24, 25, 26, + 27, 28, 29, 30, 31, 32, -1, 34, -1, -1, + 37, 38, 39, 40, 41, 42, 43, -1, 45, 46, + 47, -1, 49, -1, 51, 52, -1, -1, 55, 56, + 57, 58, 59, -1, 61, 62, 63, 64, 65, -1, + 67, 68, 69, 70, 71, 72, -1, 74, 75, 76, + 77, 78, 79, 80, -1, 82, 83, 84, 85, 86, + 87, 88, 89, -1, 91, 92, -1, 94, 95, 96, + 97, 98, -1, 100, 101, 102, 103, -1, -1, 106, + 107, 108, 109, 110, 111, -1, 113, 114, 115, -1, + 117, 118, 119, 120, 121, 122, -1, -1, -1, -1, + 127, 128, 129, -1, -1, 132, 133, -1, 135, -1, + -1, -1, -1, 140, -1, 142, 143, 144, 145, 146, + -1, -1, -1, -1, 151, -1, -1, 154, 155, 156, + -1, -1, -1, 160, -1, 162, 163, -1, 165, 166, + 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, + 177, 178, 179, -1, 181, 182, 183, 184, 185, 186, + 187, 188, -1, 190, 191, 192, 193, -1, 195, -1, + -1, -1, 199, 200, -1, 202, -1, 204, -1, 206, + 207, 208, 209, 210, 211, 212, -1, 214, -1, 216, + 217, 218, 219, -1, 221, 222, 223, -1, 225, 226, + -1, -1, -1, 230, 231, 232, 233, 234, 235, -1, + -1, 238, 239, 240, -1, -1, 243, -1, -1, -1, + 247, 248, 249, 250, -1, -1, 253, -1, 255, 256, + -1, 258, 259, -1, -1, -1, 263, -1, -1, 266, + 267, 268, -1, -1, 271, -1, 273, 274, 275, -1, + -1, -1, -1, -1, 281, 282, -1, 284, -1, 286, + -1, 288, 289, -1, -1, 292, -1, -1, -1, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, -1, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, -1, + -1, -1, -1, 330, 331, 332, 333, 334, 335, -1, + -1, 338, 339, 340, 341, -1, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, -1, 356, + 357, -1, -1, 360, 361, 362, 363, 364, -1, 366, + 367, 368, -1, 370, 371, 372, -1, 374, 375, 376, + -1, 378, 379, 380, 381, -1, 383, 384, -1, -1, + -1, -1, -1, -1, -1, -1, 393, 394, 395, -1, + 397, 398, -1, 400, -1, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, -1, 414, 415, 416, + -1, 418, -1, 420, 421, 422, 423, 424, -1, 426, + 427, 428, -1, -1, 431, -1, -1, -1, 435, 436, + 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, + -1, 448, 449, -1, 451, 452, 453, 454, 455, 456, + -1, 458, -1, 460, 461, -1, 463, 464, -1, 466, + -1, 468, -1, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, -1, 484, 485, -1, + -1, -1, 489, 490, 491, 492, -1, -1, -1, 496, + -1, -1, -1, 500, -1, 502, 503, 504, 505, 506, + 507, -1, 509, 510, 511, 512, 513, 514, -1, -1, + -1, -1, -1, -1, 521, 522, -1, 524, -1, -1, + 527, -1, -1, -1, 531, 532, 533, -1, -1, -1, + 537, 538, 539, 540, 541, -1, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, -1, -1, 560, 561, 562, 563, -1, 565, 566, + 567, -1, 569, 570, 571, 572, -1, -1, -1, -1, + -1, 578, 579, 580, -1, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, -1, 595, 596, + -1, -1, 599, -1, -1, 602, -1, 604, -1, 606, + 607, -1, -1, 610, 611, 612, 613, 614, -1, -1, + 617, 618, -1, 620, 621, 622, 623, 624, 625, 626, + 627, -1, -1, -1, -1, -1, -1, 634, 635, -1, + 637, 638, 639, -1, -1, 642, -1, -1, -1, -1, + -1, -1, -1, 650, 651, -1, -1, -1, -1, 656, + 657, -1, -1, 660, 661, -1, -1, 664, 665, 5, + -1, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, - -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, + -1, 37, 38, 39, 40, 41, 42, 43, -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, - -1, -1, 58, 59, -1, 61, 62, -1, 64, 65, + 56, 57, 58, 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, 94, 95, - 96, 97, 98, -1, 100, -1, -1, 103, -1, -1, - 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, - -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, + 96, 97, 98, -1, 100, 101, 102, 103, -1, -1, + 106, 107, 108, 109, 110, 111, -1, 113, 114, 115, + -1, 117, 118, 119, 120, 121, 122, -1, -1, -1, -1, 127, 128, 129, -1, -1, 132, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, 192, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, 221, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, -1, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, 291, -1, -1, -1, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, 370, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, -1, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, 564, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, 587, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, - 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, - 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, - -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, 97, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, 109, 110, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, - -1, -1, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, 150, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, 176, 177, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, -1, -1, 194, -1, -1, -1, 198, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, 210, - 211, -1, 213, -1, -1, 216, 217, 218, -1, 220, - -1, -1, -1, 224, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, 248, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, 265, 266, 267, -1, -1, 270, - -1, -1, 273, 274, 275, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, -1, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, 366, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, 382, 383, -1, -1, -1, -1, -1, -1, -1, - -1, 392, 393, 394, -1, -1, 397, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - -1, -1, 413, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, 448, -1, 450, - 451, 452, -1, -1, 455, -1, 457, -1, 459, 460, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, -1, 483, 484, -1, -1, -1, 488, 489, 490, - 491, -1, -1, -1, 495, -1, -1, -1, 499, -1, - 501, 502, 503, 504, 505, 506, -1, 508, 509, 510, - 511, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - 531, 532, -1, -1, -1, 536, -1, -1, 539, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, 564, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, 583, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, 594, 595, -1, -1, 598, -1, -1, - 601, -1, 603, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, 634, -1, 636, 637, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, - -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, - 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, - -1, 37, 38, -1, -1, -1, 42, -1, -1, 45, - 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, - -1, -1, 58, 59, -1, 61, 62, -1, 64, 65, - -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, - 76, 77, 78, 79, 80, -1, 82, 83, 84, 85, - 86, 87, 88, 89, -1, 91, 92, -1, 94, 95, - 96, 97, 98, -1, 100, -1, -1, 103, -1, -1, - 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, - -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, - -1, 127, 128, -1, -1, -1, 132, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, -1, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, -1, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, 275, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, -1, -1, 295, + -1, -1, -1, -1, 140, -1, 142, 143, 144, 145, + 146, -1, -1, -1, -1, 151, -1, -1, 154, 155, + 156, -1, -1, -1, 160, -1, 162, 163, -1, 165, + 166, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, 178, 179, -1, 181, 182, 183, 184, 185, + 186, 187, 188, -1, 190, 191, 192, 193, -1, 195, + -1, -1, -1, 199, 200, -1, 202, -1, 204, -1, + 206, 207, 208, 209, 210, 211, 212, -1, 214, -1, + 216, 217, 218, 219, -1, 221, 222, 223, -1, 225, + 226, -1, -1, -1, 230, 231, 232, 233, 234, 235, + -1, -1, 238, 239, 240, -1, -1, 243, -1, -1, + -1, 247, 248, 249, 250, -1, -1, 253, -1, 255, + 256, -1, 258, 259, -1, -1, -1, 263, -1, -1, + 266, 267, 268, -1, -1, 271, -1, 273, 274, 275, + -1, -1, -1, -1, -1, 281, 282, -1, 284, -1, + 286, -1, 288, 289, -1, -1, 292, -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, -1, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, 564, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, - 31, 32, -1, 34, -1, -1, -1, 38, 39, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, - 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, - -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, 97, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, - -1, -1, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, 150, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, 176, 177, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, -1, -1, 194, -1, -1, -1, 198, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, 210, - 211, -1, 213, -1, -1, 216, 217, 218, -1, 220, - 221, 222, -1, 224, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, 248, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, 265, 266, 267, -1, -1, 270, - -1, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, -1, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, 366, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, 382, 383, -1, -1, -1, -1, -1, -1, -1, - -1, 392, 393, 394, -1, -1, 397, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - -1, -1, 413, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, 448, -1, 450, - 451, 452, -1, -1, 455, -1, 457, -1, 459, 460, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, -1, 483, 484, -1, -1, -1, 488, 489, 490, - 491, -1, -1, -1, 495, -1, -1, -1, 499, -1, - 501, 502, 503, 504, 505, 506, -1, 508, 509, 510, - 511, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - 531, 532, -1, -1, -1, 536, -1, -1, 539, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, 564, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, 583, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, 594, 595, -1, -1, 598, -1, -1, - 601, -1, 603, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, 634, -1, 636, 637, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, - -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, + 306, 307, 308, 309, 310, 311, -1, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + -1, -1, -1, -1, 330, 331, 332, 333, 334, 335, + -1, -1, 338, 339, 340, 341, -1, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, -1, + 356, 357, -1, -1, 360, 361, 362, 363, 364, -1, + 366, 367, 368, -1, 370, 371, 372, -1, 374, 375, + 376, -1, 378, 379, 380, 381, -1, 383, 384, -1, + -1, -1, -1, -1, -1, -1, -1, 393, 394, 395, + -1, 397, 398, -1, 400, -1, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, -1, 414, 415, + 416, -1, 418, -1, 420, 421, 422, 423, 424, -1, + 426, 427, 428, -1, -1, 431, -1, -1, -1, 435, + 436, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, -1, 451, 452, 453, 454, 455, + 456, -1, 458, -1, 460, 461, -1, 463, 464, -1, + 466, -1, 468, -1, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, -1, 484, 485, + -1, -1, -1, 489, 490, 491, 492, -1, -1, -1, + 496, -1, -1, -1, 500, -1, 502, 503, 504, 505, + 506, 507, -1, 509, 510, 511, 512, 513, 514, -1, + -1, -1, -1, -1, -1, 521, 522, -1, 524, -1, + -1, 527, -1, -1, -1, 531, 532, 533, -1, -1, + -1, 537, 538, 539, 540, 541, -1, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, -1, -1, 560, 561, 562, 563, -1, 565, + 566, 567, -1, 569, 570, 571, 572, -1, -1, -1, + -1, -1, 578, 579, 580, -1, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, -1, 595, + 596, -1, -1, 599, -1, -1, 602, -1, 604, -1, + 606, 607, -1, -1, 610, 611, 612, 613, 614, -1, + -1, 617, 618, -1, 620, 621, 622, 623, 624, 625, + 626, 627, -1, -1, -1, -1, -1, -1, 634, 635, + -1, 637, 638, 639, -1, -1, 642, -1, -1, -1, + -1, -1, -1, -1, 650, 651, -1, -1, -1, -1, + 656, 657, -1, -1, 660, 661, -1, -1, 664, 665, + 5, -1, 7, 8, 9, 10, 11, 12, -1, -1, + 15, -1, -1, -1, 19, -1, -1, 22, -1, 24, + 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, + -1, -1, 37, 38, 39, 40, 41, 42, 43, -1, + 45, 46, 47, -1, 49, -1, 51, 52, -1, -1, + 55, 56, 57, 58, 59, -1, 61, 62, 63, 64, + 65, -1, 67, 68, 69, 70, 71, 72, -1, 74, + 75, 76, 77, 78, 79, 80, -1, 82, 83, 84, + 85, 86, 87, 88, 89, -1, 91, 92, -1, 94, + 95, 96, 97, 98, -1, 100, 101, 102, 103, -1, + -1, 106, 107, 108, 109, 110, 111, -1, 113, 114, + 115, -1, 117, 118, 119, 120, 121, 122, -1, -1, + -1, -1, 127, 128, 129, -1, -1, 132, 133, -1, + 135, -1, -1, -1, -1, 140, -1, 142, 143, 144, + 145, 146, -1, -1, -1, -1, 151, -1, -1, 154, + 155, 156, -1, -1, -1, 160, -1, 162, 163, -1, + 165, 166, 167, -1, 169, 170, -1, 172, 173, 174, + 175, 176, 177, 178, 179, -1, 181, 182, 183, 184, + 185, 186, 187, 188, -1, 190, 191, 192, 193, -1, + 195, -1, -1, -1, 199, 200, -1, 202, -1, 204, + -1, 206, 207, 208, 209, 210, 211, 212, -1, 214, + -1, 216, 217, 218, 219, -1, 221, 222, 223, -1, + 225, 226, -1, -1, -1, 230, 231, 232, 233, 234, + 235, -1, -1, 238, 239, 240, -1, -1, 243, -1, + -1, -1, 247, 248, 249, 250, -1, -1, 253, -1, + 255, 256, -1, 258, 259, -1, -1, -1, 263, -1, + -1, 266, 267, 268, -1, -1, 271, -1, 273, 274, + 275, -1, -1, -1, -1, -1, 281, 282, -1, 284, + -1, 286, -1, 288, 289, -1, -1, 292, -1, -1, + -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, -1, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, -1, -1, -1, -1, 330, 331, 332, 333, 334, + 335, -1, -1, 338, 339, 340, 341, -1, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + -1, 356, 357, -1, -1, 360, 361, 362, 363, 364, + -1, 366, 367, 368, -1, 370, 371, 372, -1, 374, + 375, 376, -1, 378, 379, 380, 381, -1, 383, 384, + -1, -1, -1, -1, -1, -1, -1, -1, 393, 394, + 395, -1, 397, 398, -1, 400, -1, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, -1, 414, + 415, 416, -1, 418, -1, 420, 421, 422, 423, 424, + -1, 426, 427, 428, -1, -1, 431, -1, -1, -1, + 435, 436, 437, 438, 439, -1, -1, 442, 443, 444, + 445, 446, -1, 448, 449, -1, 451, 452, 453, 454, + 455, 456, -1, 458, -1, 460, 461, -1, 463, 464, + -1, 466, -1, 468, -1, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, -1, 484, + 485, -1, -1, -1, 489, 490, 491, 492, -1, -1, + -1, 496, -1, -1, -1, 500, -1, 502, 503, 504, + 505, 506, 507, -1, 509, 510, 511, 512, 513, 514, + -1, -1, -1, -1, -1, -1, 521, 522, -1, 524, + -1, -1, 527, -1, -1, -1, 531, 532, 533, -1, + -1, -1, 537, 538, 539, 540, 541, -1, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, -1, -1, 560, 561, 562, 563, -1, + 565, 566, 567, -1, 569, 570, 571, 572, -1, -1, + -1, -1, -1, 578, 579, 580, -1, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, -1, + 595, 596, -1, -1, 599, -1, -1, 602, -1, 604, + -1, 606, 607, -1, -1, 610, 611, 612, 613, 614, + -1, -1, 617, 618, -1, 620, 621, 622, 623, 624, + 625, 626, 627, -1, -1, -1, -1, -1, -1, 634, + 635, -1, 637, 638, 639, -1, -1, 642, -1, -1, + -1, -1, -1, -1, -1, 650, 651, -1, -1, -1, + -1, 656, 657, -1, -1, 660, 661, -1, -1, 664, + 665, 5, -1, 7, 8, 9, 10, 11, 12, -1, + -1, 15, -1, -1, -1, 19, -1, -1, 22, -1, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + 34, -1, -1, -1, 38, 39, -1, -1, 42, -1, + -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, + -1, 55, -1, -1, 58, 59, -1, 61, 62, -1, + 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, + 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, + 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, + 94, 95, 96, 97, 98, -1, 100, -1, -1, 103, + -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, + -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, + -1, -1, -1, 127, 128, 129, -1, -1, -1, 133, + -1, 135, -1, -1, -1, -1, 140, -1, 142, 143, + 144, 145, 146, -1, -1, -1, -1, 151, -1, -1, + 154, 155, 156, -1, -1, -1, 160, -1, 162, 163, + -1, 165, 166, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, 178, -1, -1, 181, 182, 183, + 184, -1, 186, 187, 188, -1, 190, 191, 192, 193, + -1, 195, -1, -1, -1, 199, 200, -1, 202, -1, + 204, -1, 206, 207, 208, 209, 210, 211, 212, -1, + 214, -1, -1, 217, 218, 219, -1, 221, 222, 223, + -1, 225, 226, -1, -1, -1, 230, 231, 232, 233, + 234, -1, -1, -1, 238, 239, 240, -1, -1, 243, + -1, -1, -1, -1, 248, 249, -1, -1, -1, 253, + -1, 255, 256, -1, 258, 259, -1, -1, -1, 263, + -1, -1, 266, 267, 268, -1, -1, 271, -1, -1, + 274, 275, -1, -1, -1, -1, -1, 281, 282, -1, + 284, -1, 286, -1, 288, 289, -1, -1, 292, -1, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, -1, 313, + 314, 315, 316, -1, 318, 319, 320, 321, -1, 323, + 324, 325, -1, -1, -1, -1, 330, 331, 332, 333, + 334, 335, -1, -1, 338, 339, -1, 341, -1, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, -1, 356, 357, -1, -1, 360, 361, 362, 363, + -1, -1, -1, 367, 368, -1, 370, 371, 372, -1, + 374, 375, 376, -1, 378, 379, 380, 381, -1, 383, + 384, -1, -1, -1, -1, -1, -1, -1, -1, 393, + 394, 395, -1, -1, 398, -1, 400, -1, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, 416, -1, 418, -1, 420, 421, 422, 423, + 424, -1, 426, 427, 428, -1, -1, 431, -1, -1, + -1, 435, 436, 437, 438, 439, -1, -1, 442, 443, + 444, 445, 446, -1, 448, 449, -1, 451, 452, 453, + -1, -1, 456, -1, 458, -1, 460, 461, -1, 463, + 464, -1, 466, -1, 468, -1, -1, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, -1, + 484, 485, -1, -1, -1, 489, 490, 491, 492, -1, + -1, -1, 496, -1, -1, -1, 500, -1, 502, 503, + 504, 505, 506, 507, -1, 509, 510, 511, 512, 513, + 514, -1, -1, -1, -1, -1, -1, 521, 522, -1, + 524, -1, -1, 527, -1, -1, -1, 531, 532, 533, + -1, -1, -1, 537, -1, -1, 540, 541, -1, 543, + 544, 545, 546, 547, 548, -1, -1, 551, 552, 553, + 554, -1, 556, 557, -1, -1, 560, 561, 562, 563, + -1, 565, 566, 567, -1, 569, 570, 571, 572, -1, + -1, -1, -1, -1, 578, 579, 580, -1, -1, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + -1, 595, 596, -1, -1, 599, -1, -1, 602, -1, + 604, -1, 606, 607, -1, -1, -1, -1, -1, -1, + 614, -1, -1, 617, -1, -1, -1, 621, 622, 623, + 624, 625, 626, 627, -1, -1, -1, -1, -1, -1, + 634, 635, -1, 637, 638, 639, -1, -1, 642, -1, + -1, -1, -1, -1, -1, 5, -1, 7, 8, 9, + 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, + 664, 665, 22, -1, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, + -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, + -1, 51, 52, -1, -1, 55, -1, -1, 58, 59, + -1, 61, 62, -1, 64, 65, -1, 67, 68, 69, + 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, + 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, + -1, 91, 92, 93, 94, 95, 96, 97, 98, -1, + 100, -1, -1, 103, -1, -1, 106, -1, 108, -1, + -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, + -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, + -1, -1, -1, 133, -1, 135, -1, -1, -1, -1, + 140, -1, 142, 143, 144, 145, 146, -1, -1, -1, + -1, 151, -1, -1, 154, 155, 156, -1, -1, -1, + 160, -1, 162, 163, -1, 165, 166, 167, -1, 169, + 170, -1, 172, 173, 174, 175, 176, 177, 178, -1, + -1, 181, 182, 183, 184, -1, -1, 187, 188, -1, + 190, 191, 192, -1, -1, 195, -1, -1, -1, 199, + 200, -1, 202, 203, 204, -1, 206, 207, 208, 209, + 210, 211, 212, -1, 214, -1, -1, 217, 218, 219, + -1, 221, -1, -1, -1, 225, 226, -1, -1, -1, + 230, 231, 232, 233, 234, -1, -1, -1, 238, 239, + 240, 241, -1, 243, -1, -1, -1, -1, 248, 249, + -1, -1, -1, 253, -1, 255, 256, -1, 258, 259, + -1, -1, -1, 263, 264, -1, 266, 267, 268, -1, + -1, 271, -1, -1, 274, 275, -1, 277, -1, -1, + -1, 281, 282, -1, 284, -1, 286, -1, 288, 289, + -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, -1, 313, 314, 315, 316, -1, 318, 319, + 320, 321, -1, 323, 324, 325, -1, -1, -1, -1, + 330, 331, 332, 333, 334, 335, -1, -1, 338, 339, + -1, 341, -1, 343, -1, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, -1, -1, 357, -1, -1, + 360, 361, 362, 363, -1, -1, -1, 367, 368, -1, + -1, -1, 372, -1, 374, 375, 376, -1, 378, 379, + 380, 381, -1, 383, 384, -1, -1, -1, -1, -1, + -1, -1, -1, 393, 394, 395, -1, -1, 398, -1, + 400, -1, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, -1, 414, 415, 416, -1, 418, -1, + 420, 421, 422, 423, 424, -1, 426, 427, 428, -1, + -1, 431, -1, -1, -1, 435, 436, 437, 438, 439, + -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, + -1, 451, 452, 453, -1, -1, 456, -1, 458, -1, + 460, 461, -1, 463, 464, -1, 466, -1, 468, -1, + -1, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, -1, 484, 485, 486, -1, -1, 489, + 490, 491, 492, -1, -1, -1, 496, -1, -1, -1, + 500, -1, 502, 503, 504, 505, 506, 507, -1, 509, + 510, 511, 512, 513, 514, 515, -1, -1, -1, -1, + -1, 521, 522, -1, 524, -1, -1, 527, -1, -1, + -1, 531, 532, 533, -1, -1, -1, 537, -1, -1, + 540, 541, -1, 543, 544, 545, 546, 547, 548, -1, + -1, 551, 552, 553, 554, -1, 556, 557, -1, -1, + 560, 561, 562, 563, -1, -1, 566, 567, -1, 569, + 570, 571, 572, -1, -1, -1, -1, -1, 578, 579, + 580, -1, -1, -1, 584, 585, 586, 587, -1, 589, + 590, -1, 592, 593, -1, 595, 596, -1, -1, 599, + -1, -1, 602, -1, 604, -1, 606, 607, -1, -1, + -1, -1, -1, -1, 614, -1, -1, 617, -1, -1, + -1, 621, 622, 623, 624, 625, 626, 627, -1, -1, + -1, -1, -1, -1, 634, 635, -1, 637, 638, 639, + -1, -1, 642, -1, -1, -1, -1, 5, -1, 7, + 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, + -1, 19, -1, -1, 22, 665, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, + 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, + -1, 49, -1, 51, 52, -1, -1, 55, -1, -1, + 58, 59, -1, 61, 62, -1, 64, 65, -1, 67, + 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, + 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, + 88, 89, -1, 91, 92, 93, 94, 95, 96, 97, + 98, -1, 100, -1, -1, 103, -1, -1, 106, -1, + 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, + 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, + 128, -1, -1, -1, -1, 133, -1, 135, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, 146, -1, + -1, -1, -1, 151, -1, -1, 154, 155, 156, -1, + -1, -1, 160, -1, 162, 163, -1, 165, 166, 167, + -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, + 178, -1, -1, 181, 182, 183, 184, -1, -1, 187, + 188, -1, 190, 191, 192, -1, -1, 195, -1, -1, + -1, 199, 200, -1, 202, 203, 204, -1, 206, 207, + 208, 209, 210, 211, 212, -1, 214, -1, -1, 217, + 218, 219, -1, 221, -1, -1, -1, 225, 226, -1, + -1, -1, 230, 231, 232, 233, 234, -1, -1, -1, + 238, 239, 240, 241, -1, 243, -1, -1, -1, -1, + 248, 249, -1, -1, -1, 253, -1, 255, 256, -1, + 258, 259, -1, -1, -1, 263, 264, -1, 266, 267, + 268, -1, -1, 271, -1, -1, 274, 275, -1, -1, + -1, -1, -1, 281, 282, -1, 284, -1, 286, -1, + 288, 289, -1, -1, -1, -1, -1, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, -1, 313, 314, 315, 316, -1, + 318, 319, 320, 321, -1, 323, 324, 325, -1, -1, + -1, -1, 330, 331, 332, 333, 334, 335, -1, -1, + 338, 339, -1, 341, -1, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, -1, -1, 357, + -1, -1, 360, 361, 362, 363, -1, -1, -1, 367, + 368, -1, -1, -1, 372, -1, 374, 375, 376, -1, + 378, 379, 380, 381, -1, 383, 384, -1, -1, -1, + -1, -1, -1, -1, -1, 393, 394, 395, -1, -1, + 398, -1, 400, -1, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, 416, -1, + 418, -1, 420, 421, 422, 423, 424, -1, 426, 427, + 428, -1, -1, 431, -1, -1, -1, 435, 436, 437, + 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, + 448, 449, -1, 451, 452, 453, -1, -1, 456, -1, + 458, -1, 460, 461, -1, 463, 464, -1, 466, -1, + 468, -1, -1, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, -1, 484, 485, -1, -1, + -1, 489, 490, 491, 492, -1, -1, -1, 496, -1, + -1, -1, 500, -1, 502, 503, 504, 505, 506, 507, + -1, 509, 510, 511, 512, 513, 514, 515, -1, -1, + -1, -1, -1, 521, 522, -1, 524, -1, -1, 527, + -1, -1, -1, 531, 532, 533, -1, -1, -1, 537, + -1, -1, 540, 541, -1, 543, 544, 545, 546, 547, + 548, -1, -1, 551, 552, 553, 554, -1, 556, 557, + -1, -1, 560, 561, 562, 563, -1, -1, 566, 567, + -1, 569, 570, 571, 572, -1, -1, -1, -1, -1, + 578, 579, 580, -1, -1, -1, 584, 585, 586, 587, + -1, 589, 590, -1, 592, 593, -1, 595, 596, -1, + -1, 599, -1, -1, 602, -1, 604, -1, 606, 607, + -1, -1, -1, -1, -1, -1, 614, -1, -1, 617, + -1, -1, -1, 621, 622, 623, 624, 625, 626, 627, + -1, -1, -1, -1, -1, -1, 634, 635, -1, 637, + 638, 639, -1, -1, 642, -1, -1, -1, -1, 5, + -1, 7, 8, 9, 10, 11, 12, -1, -1, 15, + -1, -1, -1, 19, -1, -1, 22, 665, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, @@ -15741,376 +13615,188 @@ static const yytype_int16 yycheck[] = 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, -1, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, -1, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, -1, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, 291, -1, -1, -1, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, 370, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - 396, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, -1, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, -1, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, 587, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, - 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, - 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, - -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, 97, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, - -1, -1, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, 150, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, 176, 177, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, -1, -1, 194, -1, -1, -1, 198, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, 210, - 211, -1, 213, -1, -1, 216, 217, 218, -1, 220, - -1, -1, -1, 224, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, 248, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, 265, 266, 267, -1, -1, 270, - -1, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - 291, -1, -1, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, 366, 367, -1, -1, 370, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, 382, 383, -1, -1, -1, -1, -1, -1, -1, - -1, 392, 393, 394, -1, 396, 397, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - -1, -1, 413, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, 448, -1, 450, - 451, 452, -1, -1, 455, -1, 457, -1, 459, 460, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, -1, 483, 484, -1, -1, -1, 488, 489, 490, - 491, -1, -1, -1, 495, -1, -1, -1, 499, -1, - 501, 502, 503, 504, 505, 506, -1, 508, 509, 510, - 511, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - 531, 532, -1, -1, -1, 536, -1, -1, 539, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, -1, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, 583, 584, 585, 586, 587, 588, 589, -1, - 591, 592, -1, 594, 595, -1, -1, 598, -1, -1, - 601, -1, 603, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, 634, -1, 636, 637, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, - -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, - 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, - -1, 37, 38, -1, -1, -1, 42, -1, -1, 45, - 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, - -1, -1, 58, 59, -1, 61, 62, -1, 64, 65, - -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, - 76, 77, 78, 79, 80, -1, 82, 83, 84, 85, - 86, 87, 88, 89, -1, 91, 92, -1, 94, 95, - 96, 97, 98, -1, 100, -1, -1, 103, -1, -1, - 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, - -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, - -1, 127, 128, -1, -1, -1, 132, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, -1, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, -1, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, 275, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, -1, -1, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, -1, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, 564, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, - 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, - 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, - -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, 97, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, - -1, -1, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, 150, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, 176, 177, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, -1, -1, 194, -1, -1, -1, 198, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, 210, - 211, -1, 213, -1, -1, 216, 217, 218, -1, 220, - -1, -1, -1, 224, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, 248, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, 265, 266, 267, -1, -1, 270, - -1, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - 291, -1, -1, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, 366, 367, -1, -1, 370, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, 382, 383, -1, -1, -1, -1, -1, -1, -1, - -1, 392, 393, 394, -1, 396, 397, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - -1, -1, 413, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, 448, -1, 450, - 451, 452, -1, -1, 455, -1, 457, -1, 459, 460, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, -1, 483, 484, -1, -1, -1, 488, 489, 490, - 491, -1, -1, -1, 495, -1, -1, -1, 499, -1, - 501, 502, 503, 504, 505, 506, -1, 508, 509, 510, - 511, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - 531, 532, -1, -1, -1, 536, -1, -1, 539, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, -1, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, 583, 584, 585, 586, 587, 588, 589, -1, - 591, 592, -1, 594, 595, -1, -1, 598, -1, -1, - 601, -1, 603, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, 634, -1, 636, 637, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, - -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, - 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, - -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, - 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, - -1, -1, 58, 59, -1, 61, 62, -1, 64, 65, - -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, - 76, 77, 78, 79, 80, -1, 82, 83, 84, 85, - 86, 87, 88, 89, -1, 91, 92, -1, 94, 95, - 96, 97, 98, -1, 100, -1, -1, 103, -1, -1, - 106, -1, 108, 109, -1, 111, -1, 113, -1, -1, - -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, - -1, 127, 128, -1, -1, -1, -1, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, -1, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, -1, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, 275, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, -1, -1, 295, + -1, -1, -1, -1, 140, -1, 142, 143, 144, 145, + 146, -1, -1, -1, -1, 151, -1, -1, 154, 155, + 156, -1, -1, -1, 160, -1, 162, 163, -1, 165, + 166, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, 178, -1, -1, 181, 182, 183, 184, -1, + -1, 187, 188, -1, 190, 191, 192, -1, -1, 195, + -1, -1, -1, 199, 200, -1, 202, -1, 204, -1, + 206, 207, 208, 209, 210, 211, 212, -1, 214, -1, + -1, 217, 218, 219, -1, 221, -1, -1, -1, 225, + 226, -1, -1, -1, 230, 231, 232, 233, 234, -1, + -1, -1, 238, 239, 240, -1, -1, 243, -1, -1, + -1, -1, 248, 249, -1, -1, -1, 253, -1, 255, + 256, -1, 258, 259, -1, -1, -1, 263, -1, -1, + 266, 267, 268, -1, -1, 271, -1, -1, 274, 275, + -1, -1, -1, -1, -1, 281, 282, -1, 284, -1, + 286, -1, 288, 289, -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, -1, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, 564, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, 13, -1, 15, -1, -1, -1, 19, -1, - -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, - 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, - 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, - -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, 97, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, - -1, -1, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, 150, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, 176, 177, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, -1, -1, 194, -1, -1, -1, 198, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, 210, - 211, -1, 213, -1, -1, 216, 217, 218, -1, 220, - -1, -1, -1, 224, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, 248, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, 265, 266, 267, -1, -1, 270, - -1, -1, 273, 274, 275, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, -1, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, 366, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, 382, 383, -1, -1, -1, -1, -1, -1, -1, - -1, 392, 393, 394, -1, -1, 397, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - -1, -1, 413, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, 448, -1, 450, - 451, 452, -1, -1, 455, -1, 457, -1, 459, 460, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, -1, 483, 484, -1, -1, -1, 488, 489, 490, - 491, -1, -1, -1, 495, -1, -1, -1, 499, -1, - 501, 502, 503, 504, 505, 506, -1, 508, 509, 510, - 511, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - 531, 532, -1, -1, -1, 536, -1, -1, 539, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, 564, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, 583, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, 594, 595, -1, -1, 598, -1, -1, - 601, -1, 603, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, 634, -1, 636, 637, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, - -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, + 306, 307, 308, 309, 310, 311, -1, 313, 314, 315, + 316, -1, 318, 319, 320, 321, -1, 323, 324, 325, + -1, -1, -1, -1, 330, 331, 332, 333, 334, 335, + -1, -1, 338, 339, -1, 341, -1, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, -1, + -1, 357, -1, -1, 360, 361, 362, 363, -1, -1, + -1, 367, 368, -1, -1, -1, 372, -1, 374, 375, + 376, -1, 378, 379, 380, 381, -1, 383, 384, -1, + -1, -1, -1, -1, -1, -1, -1, 393, 394, 395, + -1, -1, 398, -1, 400, -1, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + 416, -1, 418, -1, 420, 421, 422, 423, 424, -1, + 426, 427, 428, -1, -1, 431, -1, -1, -1, 435, + 436, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, -1, 451, 452, 453, -1, -1, + 456, -1, 458, -1, 460, 461, -1, 463, 464, -1, + 466, -1, 468, -1, -1, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, -1, 484, 485, + 486, -1, -1, 489, 490, 491, 492, -1, -1, -1, + 496, -1, -1, -1, 500, -1, 502, 503, 504, 505, + 506, 507, -1, 509, 510, 511, 512, 513, 514, -1, + -1, -1, -1, -1, -1, 521, 522, -1, 524, -1, + -1, 527, -1, -1, -1, 531, 532, 533, -1, -1, + -1, 537, -1, -1, 540, 541, -1, 543, 544, 545, + 546, 547, 548, -1, -1, 551, 552, 553, 554, -1, + 556, 557, -1, -1, 560, 561, 562, 563, -1, -1, + 566, 567, -1, 569, 570, 571, 572, -1, -1, -1, + -1, -1, 578, 579, 580, -1, -1, -1, 584, 585, + 586, 587, -1, 589, 590, -1, 592, 593, -1, 595, + 596, -1, -1, 599, -1, -1, 602, -1, 604, -1, + 606, 607, -1, -1, -1, -1, -1, -1, 614, -1, + -1, 617, -1, -1, -1, 621, 622, 623, 624, 625, + 626, 627, -1, -1, -1, -1, -1, -1, 634, 635, + -1, 637, 638, 639, -1, -1, 642, -1, -1, -1, + -1, 5, -1, 7, 8, 9, 10, 11, 12, -1, + -1, 15, 658, -1, -1, 19, -1, -1, 22, 665, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, + -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, + -1, 55, -1, -1, 58, 59, -1, 61, 62, -1, + 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, + 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, + 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, + 94, 95, 96, 97, 98, -1, 100, -1, -1, 103, + -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, + -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, + -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, + -1, 135, -1, -1, -1, -1, 140, -1, 142, 143, + 144, 145, 146, -1, -1, -1, -1, 151, -1, -1, + 154, 155, 156, -1, -1, -1, 160, -1, 162, 163, + -1, 165, 166, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, 178, -1, -1, 181, 182, 183, + 184, -1, -1, 187, 188, -1, 190, 191, 192, -1, + -1, 195, -1, -1, -1, 199, 200, -1, 202, -1, + 204, -1, 206, 207, 208, 209, 210, 211, 212, -1, + 214, -1, -1, 217, 218, 219, -1, 221, -1, -1, + -1, 225, 226, -1, -1, -1, 230, 231, 232, 233, + 234, -1, -1, -1, 238, 239, 240, -1, -1, 243, + -1, -1, -1, -1, 248, 249, -1, -1, -1, 253, + -1, 255, 256, -1, 258, 259, -1, -1, -1, 263, + -1, -1, 266, 267, 268, -1, -1, 271, -1, -1, + 274, 275, -1, -1, -1, -1, -1, 281, 282, -1, + 284, -1, 286, -1, 288, 289, -1, -1, -1, -1, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, -1, 313, + 314, 315, 316, -1, 318, 319, 320, 321, -1, 323, + 324, 325, -1, -1, -1, -1, 330, 331, 332, 333, + 334, 335, -1, -1, 338, 339, -1, 341, -1, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, -1, -1, 357, -1, -1, 360, 361, 362, 363, + -1, -1, -1, 367, 368, -1, -1, -1, 372, -1, + 374, 375, 376, -1, 378, 379, 380, 381, -1, 383, + 384, -1, -1, -1, -1, -1, -1, -1, -1, 393, + 394, 395, -1, -1, 398, -1, 400, -1, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, 416, -1, 418, -1, 420, 421, 422, 423, + 424, -1, 426, 427, 428, -1, -1, 431, -1, -1, + -1, 435, 436, 437, 438, 439, -1, -1, 442, 443, + 444, 445, 446, -1, 448, 449, -1, 451, 452, 453, + -1, -1, 456, -1, 458, -1, 460, 461, -1, 463, + 464, -1, 466, -1, 468, -1, -1, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, -1, + 484, 485, -1, -1, -1, 489, 490, 491, 492, -1, + -1, -1, 496, -1, -1, -1, 500, -1, 502, 503, + 504, 505, 506, 507, -1, 509, 510, 511, 512, 513, + 514, -1, -1, -1, -1, -1, -1, 521, 522, -1, + 524, -1, -1, 527, -1, -1, -1, 531, 532, 533, + -1, -1, -1, 537, -1, -1, 540, 541, -1, 543, + 544, 545, 546, 547, 548, -1, -1, 551, 552, 553, + 554, -1, 556, 557, -1, -1, 560, 561, 562, 563, + -1, -1, 566, 567, -1, 569, 570, 571, 572, -1, + -1, -1, -1, -1, 578, 579, 580, -1, -1, -1, + 584, 585, 586, 587, -1, 589, 590, -1, 592, 593, + -1, 595, 596, -1, -1, 599, -1, -1, 602, -1, + 604, -1, 606, 607, -1, -1, -1, -1, -1, -1, + 614, -1, -1, 617, -1, -1, -1, 621, 622, 623, + 624, 625, 626, 627, -1, -1, -1, -1, -1, -1, + 634, 635, -1, 637, 638, 639, -1, -1, 642, -1, + -1, -1, -1, -1, -1, 5, -1, 7, 8, 9, + 10, 11, 12, -1, 658, 15, -1, -1, -1, 19, + 664, 665, 22, -1, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, + -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, + -1, 51, 52, -1, -1, 55, -1, -1, 58, 59, + -1, 61, 62, -1, 64, 65, -1, 67, 68, 69, + 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, + 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, + -1, 91, 92, -1, 94, 95, 96, 97, 98, -1, + 100, -1, -1, 103, -1, -1, 106, -1, 108, -1, + -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, + -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, + -1, -1, -1, 133, -1, 135, -1, -1, -1, -1, + 140, -1, 142, 143, 144, 145, 146, -1, -1, -1, + -1, 151, -1, -1, 154, 155, 156, -1, -1, -1, + 160, -1, 162, 163, -1, 165, 166, 167, -1, 169, + 170, -1, 172, 173, 174, 175, 176, 177, 178, -1, + -1, 181, 182, 183, 184, -1, -1, 187, 188, -1, + 190, 191, 192, -1, -1, 195, -1, -1, -1, 199, + 200, -1, 202, -1, 204, -1, 206, 207, 208, 209, + 210, 211, 212, -1, 214, -1, -1, 217, 218, 219, + -1, 221, -1, -1, -1, 225, 226, -1, -1, -1, + 230, 231, 232, 233, 234, -1, -1, -1, 238, 239, + 240, -1, -1, 243, -1, -1, -1, -1, 248, 249, + -1, -1, -1, 253, -1, 255, 256, -1, 258, 259, + -1, -1, -1, 263, -1, -1, 266, 267, 268, -1, + -1, 271, -1, -1, 274, 275, -1, -1, -1, -1, + -1, 281, 282, -1, 284, -1, 286, -1, 288, 289, + -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, -1, 313, 314, 315, 316, -1, 318, 319, + 320, 321, -1, 323, 324, 325, -1, -1, -1, -1, + 330, 331, 332, 333, 334, 335, -1, -1, 338, 339, + -1, 341, -1, 343, -1, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, -1, -1, 357, -1, -1, + 360, 361, 362, 363, -1, -1, -1, 367, 368, -1, + -1, -1, 372, -1, 374, 375, 376, -1, 378, 379, + 380, 381, -1, 383, 384, -1, -1, -1, -1, -1, + -1, -1, -1, 393, 394, 395, -1, -1, 398, -1, + 400, -1, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, -1, 414, 415, 416, -1, 418, -1, + 420, 421, 422, 423, 424, -1, 426, 427, 428, -1, + -1, 431, -1, -1, -1, 435, 436, 437, 438, 439, + -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, + -1, 451, 452, 453, -1, -1, 456, -1, 458, -1, + 460, 461, -1, 463, 464, -1, 466, -1, 468, -1, + -1, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, -1, 484, 485, -1, -1, -1, 489, + 490, 491, 492, -1, -1, -1, 496, -1, -1, -1, + 500, -1, 502, 503, 504, 505, 506, 507, -1, 509, + 510, 511, 512, 513, 514, -1, -1, -1, -1, -1, + -1, 521, 522, -1, 524, -1, -1, 527, -1, -1, + -1, 531, 532, 533, -1, -1, -1, 537, -1, -1, + 540, 541, -1, 543, 544, 545, 546, 547, 548, -1, + -1, 551, 552, 553, 554, -1, 556, 557, -1, -1, + 560, 561, 562, 563, -1, -1, 566, 567, -1, 569, + 570, 571, 572, -1, -1, -1, -1, -1, 578, 579, + 580, -1, -1, -1, 584, 585, 586, 587, -1, 589, + 590, -1, 592, 593, -1, 595, 596, -1, -1, 599, + -1, -1, 602, -1, 604, -1, 606, 607, -1, -1, + -1, -1, -1, -1, 614, -1, -1, 617, -1, -1, + -1, 621, 622, 623, 624, 625, 626, 627, -1, -1, + -1, -1, -1, -1, 634, 635, -1, 637, 638, 639, + -1, -1, 642, -1, -1, -1, -1, -1, -1, 5, + -1, 7, 8, 9, 10, 11, 12, 657, -1, 15, + -1, -1, -1, 19, -1, 665, 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, @@ -16119,127 +13805,129 @@ static const yytype_int16 yycheck[] = 76, 77, 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, -1, 100, -1, -1, 103, -1, -1, - 106, -1, 108, -1, 110, 111, -1, 113, -1, -1, + 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, -1, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, -1, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, 275, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, -1, -1, 295, + -1, -1, -1, -1, 140, -1, 142, 143, 144, 145, + 146, -1, -1, -1, -1, 151, -1, -1, 154, 155, + 156, -1, -1, -1, 160, -1, 162, 163, -1, 165, + 166, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, 178, -1, -1, 181, 182, 183, 184, -1, + -1, 187, 188, -1, 190, 191, 192, -1, -1, 195, + -1, -1, -1, 199, 200, -1, 202, -1, 204, -1, + 206, 207, 208, 209, 210, 211, 212, -1, 214, -1, + -1, 217, 218, 219, -1, 221, -1, -1, -1, 225, + 226, -1, -1, -1, 230, 231, 232, 233, 234, -1, + -1, -1, 238, 239, 240, -1, -1, 243, -1, -1, + -1, -1, 248, 249, -1, 251, -1, 253, -1, 255, + 256, -1, 258, 259, -1, -1, -1, 263, -1, -1, + 266, 267, 268, -1, -1, 271, -1, -1, 274, 275, + -1, -1, -1, -1, -1, 281, 282, -1, 284, -1, + 286, -1, 288, 289, -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, -1, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, 564, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, - 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, - 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, - -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, 97, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, - -1, 132, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, 150, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, 176, 177, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, -1, -1, 194, -1, -1, -1, 198, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, 210, - 211, -1, 213, -1, -1, 216, 217, 218, -1, 220, - -1, -1, -1, 224, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, 248, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, 265, 266, 267, -1, -1, 270, - -1, -1, 273, 274, 275, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, -1, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, 366, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, 382, 383, -1, -1, -1, -1, -1, -1, -1, - -1, 392, 393, 394, -1, -1, 397, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - -1, -1, 413, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, 448, -1, 450, - 451, 452, -1, -1, 455, -1, 457, -1, 459, 460, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, -1, 483, 484, -1, -1, -1, 488, 489, 490, - 491, -1, -1, -1, 495, -1, -1, -1, 499, -1, - 501, 502, 503, 504, 505, 506, -1, 508, 509, 510, - 511, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - 531, 532, -1, -1, -1, 536, -1, -1, 539, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, 564, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, 583, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, 594, 595, -1, -1, 598, -1, -1, - 601, -1, 603, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, 634, -1, 636, 637, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, - -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, + 306, 307, 308, 309, 310, 311, -1, 313, 314, 315, + 316, -1, 318, 319, 320, 321, -1, 323, 324, 325, + -1, -1, -1, -1, 330, 331, 332, 333, 334, 335, + -1, -1, 338, 339, -1, 341, -1, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, -1, + -1, 357, -1, -1, 360, 361, 362, 363, -1, -1, + -1, 367, 368, -1, -1, -1, 372, -1, 374, 375, + 376, -1, 378, 379, 380, 381, -1, 383, 384, -1, + -1, -1, -1, -1, -1, -1, -1, 393, 394, 395, + -1, -1, 398, -1, 400, -1, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + 416, -1, 418, -1, 420, 421, 422, 423, 424, -1, + 426, 427, 428, -1, -1, 431, -1, -1, -1, 435, + 436, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, -1, 451, 452, 453, -1, -1, + 456, -1, 458, -1, 460, 461, -1, 463, 464, -1, + 466, -1, 468, -1, -1, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, -1, 484, 485, + -1, -1, -1, 489, 490, 491, 492, -1, -1, -1, + 496, -1, -1, -1, 500, -1, 502, 503, 504, 505, + 506, 507, -1, 509, 510, 511, 512, 513, 514, -1, + -1, -1, -1, -1, -1, 521, 522, -1, 524, -1, + -1, 527, -1, -1, -1, 531, 532, 533, -1, -1, + -1, 537, -1, -1, 540, 541, -1, 543, 544, 545, + 546, 547, 548, -1, -1, 551, 552, 553, 554, -1, + 556, 557, -1, -1, 560, 561, 562, 563, -1, -1, + 566, 567, -1, 569, 570, 571, 572, -1, -1, -1, + -1, -1, 578, 579, 580, -1, -1, -1, 584, 585, + 586, 587, -1, 589, 590, -1, 592, 593, -1, 595, + 596, -1, -1, 599, -1, -1, 602, -1, 604, -1, + 606, 607, -1, -1, -1, -1, -1, -1, 614, -1, + -1, 617, -1, -1, -1, 621, 622, 623, 624, 625, + 626, 627, -1, -1, -1, -1, -1, -1, 634, 635, + -1, 637, 638, 639, -1, -1, 642, -1, -1, -1, + -1, 5, -1, 7, 8, 9, 10, 11, 12, -1, + -1, 15, -1, -1, -1, 19, -1, -1, 22, 665, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, + -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, + -1, 55, -1, -1, 58, 59, -1, 61, 62, -1, + 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, + 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, + 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, + 94, 95, 96, 97, 98, -1, 100, -1, -1, 103, + -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, + -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, + -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, + -1, 135, -1, -1, -1, -1, 140, -1, 142, 143, + 144, 145, 146, -1, -1, -1, -1, 151, -1, -1, + 154, 155, 156, -1, -1, -1, 160, -1, 162, 163, + -1, 165, 166, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, 178, -1, -1, 181, 182, 183, + 184, -1, -1, 187, 188, -1, 190, 191, 192, -1, + -1, 195, -1, -1, -1, 199, 200, -1, 202, -1, + 204, -1, 206, 207, 208, 209, 210, 211, 212, -1, + 214, -1, -1, 217, 218, 219, -1, 221, -1, -1, + -1, 225, 226, -1, -1, -1, 230, 231, 232, 233, + 234, -1, -1, -1, 238, 239, 240, -1, -1, 243, + -1, -1, -1, -1, 248, 249, -1, -1, -1, 253, + -1, 255, 256, -1, 258, 259, -1, -1, -1, 263, + -1, -1, 266, 267, 268, -1, -1, 271, -1, -1, + 274, 275, -1, -1, -1, -1, -1, 281, 282, -1, + 284, -1, 286, -1, 288, 289, -1, -1, -1, -1, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, -1, 313, + 314, 315, 316, -1, 318, 319, 320, 321, -1, 323, + 324, 325, -1, -1, -1, -1, 330, 331, 332, 333, + 334, 335, -1, -1, 338, 339, -1, 341, -1, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, -1, -1, 357, -1, -1, 360, 361, 362, 363, + -1, -1, -1, 367, 368, -1, -1, -1, 372, -1, + 374, 375, 376, -1, 378, 379, 380, 381, -1, 383, + 384, -1, -1, -1, -1, -1, -1, -1, -1, 393, + 394, 395, -1, -1, 398, -1, 400, -1, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, 416, -1, 418, -1, 420, 421, 422, 423, + 424, -1, 426, 427, 428, -1, -1, 431, -1, -1, + -1, 435, 436, 437, 438, 439, -1, -1, 442, 443, + 444, 445, 446, -1, 448, 449, -1, 451, 452, 453, + -1, -1, 456, -1, 458, -1, 460, 461, -1, 463, + 464, -1, 466, -1, 468, -1, -1, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, -1, + 484, 485, -1, -1, -1, 489, 490, 491, 492, -1, + -1, -1, 496, -1, -1, -1, 500, -1, 502, 503, + 504, 505, 506, 507, -1, 509, 510, 511, 512, 513, + 514, -1, -1, -1, -1, -1, -1, 521, 522, -1, + 524, -1, -1, 527, -1, -1, -1, 531, 532, 533, + -1, -1, -1, 537, -1, -1, 540, 541, -1, 543, + 544, 545, 546, 547, 548, -1, -1, 551, 552, 553, + 554, -1, 556, 557, -1, -1, 560, 561, 562, 563, + -1, -1, 566, 567, -1, 569, 570, 571, 572, -1, + -1, -1, -1, -1, 578, 579, 580, -1, -1, -1, + 584, 585, 586, 587, -1, 589, 590, -1, 592, 593, + -1, 595, 596, -1, -1, 599, -1, -1, 602, -1, + 604, -1, 606, 607, -1, -1, -1, -1, -1, -1, + 614, -1, -1, 617, -1, -1, -1, 621, 622, 623, + 624, 625, 626, 627, -1, -1, -1, -1, -1, -1, + 634, 635, -1, 637, 638, 639, -1, -1, 642, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 652, 5, + -1, 7, 8, 9, 10, 11, 12, -1, -1, 15, + -1, 665, -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, - -1, 37, 38, -1, -1, -1, 42, -1, -1, 45, + -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, @@ -16249,122 +13937,188 @@ static const yytype_int16 yycheck[] = 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, -1, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, -1, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, 275, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, -1, -1, 295, + -1, -1, -1, -1, 140, -1, 142, 143, 144, 145, + 146, -1, -1, -1, -1, 151, -1, -1, 154, 155, + 156, -1, -1, -1, 160, -1, 162, 163, -1, 165, + 166, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, 178, -1, -1, 181, 182, 183, 184, -1, + -1, 187, 188, -1, 190, 191, 192, -1, -1, 195, + -1, -1, -1, 199, 200, -1, 202, -1, 204, -1, + 206, 207, 208, 209, 210, 211, 212, -1, 214, -1, + -1, 217, 218, 219, -1, 221, -1, -1, -1, 225, + 226, -1, -1, -1, 230, 231, 232, 233, 234, -1, + -1, -1, 238, 239, 240, -1, -1, 243, -1, -1, + -1, -1, 248, 249, -1, -1, -1, 253, -1, 255, + 256, -1, 258, 259, -1, -1, -1, 263, -1, -1, + 266, 267, 268, -1, -1, 271, -1, -1, 274, 275, + -1, -1, -1, -1, -1, 281, 282, -1, 284, -1, + 286, -1, 288, 289, -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, -1, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, 564, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, - 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, - 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, - -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, 97, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, - -1, -1, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, 150, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, 176, 177, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, -1, -1, 194, -1, -1, -1, 198, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, 210, - 211, -1, 213, -1, -1, 216, 217, 218, -1, 220, - -1, -1, -1, 224, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, 248, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, 265, 266, 267, -1, -1, 270, - -1, -1, 273, 274, 275, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, -1, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, 366, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, 382, 383, -1, -1, -1, -1, -1, -1, -1, - -1, 392, 393, 394, -1, -1, 397, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - -1, -1, 413, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, 448, -1, 450, - 451, 452, -1, -1, 455, -1, 457, -1, 459, 460, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, -1, 483, 484, -1, -1, -1, 488, 489, 490, - 491, -1, -1, -1, 495, -1, -1, -1, 499, -1, - 501, 502, 503, 504, 505, 506, -1, 508, 509, 510, - 511, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - 531, 532, -1, -1, -1, 536, -1, -1, 539, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, 564, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, 583, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, 594, 595, -1, -1, 598, -1, -1, - 601, -1, 603, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, 634, -1, 636, 637, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, - -1, -1, -1, 19, 20, -1, 22, -1, 24, 25, + 306, 307, 308, 309, 310, 311, -1, 313, 314, 315, + 316, -1, 318, 319, 320, 321, -1, 323, 324, 325, + -1, -1, -1, -1, 330, 331, 332, 333, 334, 335, + -1, -1, 338, 339, -1, 341, -1, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, -1, + -1, 357, -1, -1, 360, 361, 362, 363, -1, -1, + -1, 367, 368, -1, -1, -1, 372, -1, 374, 375, + 376, -1, 378, 379, 380, 381, -1, 383, 384, -1, + -1, -1, -1, -1, -1, -1, -1, 393, 394, 395, + -1, -1, 398, -1, 400, -1, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + 416, -1, 418, -1, 420, 421, 422, 423, 424, -1, + 426, 427, 428, -1, -1, 431, -1, -1, -1, 435, + 436, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, -1, 451, 452, 453, -1, -1, + 456, -1, 458, -1, 460, 461, -1, 463, 464, -1, + 466, -1, 468, -1, -1, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, -1, 484, 485, + -1, -1, -1, 489, 490, 491, 492, -1, -1, -1, + 496, -1, -1, -1, 500, -1, 502, 503, 504, 505, + 506, 507, -1, 509, 510, 511, 512, 513, 514, -1, + -1, -1, -1, -1, -1, 521, 522, -1, 524, -1, + -1, 527, -1, -1, -1, 531, 532, 533, -1, -1, + -1, 537, -1, -1, 540, 541, -1, 543, 544, 545, + 546, 547, 548, -1, -1, 551, 552, 553, 554, -1, + 556, 557, -1, -1, 560, 561, 562, 563, -1, -1, + 566, 567, -1, 569, 570, 571, 572, -1, -1, -1, + -1, -1, 578, 579, 580, -1, -1, -1, 584, 585, + 586, 587, -1, 589, 590, -1, 592, 593, -1, 595, + 596, -1, -1, 599, -1, -1, 602, -1, 604, -1, + 606, 607, -1, -1, -1, -1, -1, -1, 614, -1, + -1, 617, -1, -1, -1, 621, 622, 623, 624, 625, + 626, 627, -1, -1, -1, -1, -1, -1, 634, 635, + -1, 637, 638, 639, -1, -1, 642, -1, -1, -1, + -1, -1, -1, 5, -1, 7, 8, 9, 10, 11, + 12, 657, -1, 15, -1, -1, -1, 19, -1, 665, + 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, 34, -1, -1, -1, 38, -1, -1, -1, + 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, + 52, -1, -1, 55, -1, -1, 58, 59, -1, 61, + 62, -1, 64, 65, -1, 67, 68, 69, 70, 71, + 72, -1, 74, 75, 76, 77, 78, 79, 80, -1, + 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, + 92, -1, 94, 95, 96, 97, 98, -1, 100, -1, + -1, 103, -1, -1, 106, -1, 108, -1, -1, 111, + -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, + 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, + -1, 133, -1, 135, -1, -1, -1, -1, 140, -1, + 142, 143, 144, 145, 146, -1, -1, -1, -1, 151, + -1, -1, 154, 155, 156, -1, -1, -1, 160, -1, + 162, 163, -1, 165, 166, 167, -1, 169, 170, -1, + 172, 173, 174, 175, 176, 177, 178, -1, -1, 181, + 182, 183, 184, -1, -1, 187, 188, -1, 190, 191, + 192, -1, -1, 195, -1, -1, -1, 199, 200, -1, + 202, -1, 204, -1, 206, 207, 208, 209, 210, 211, + 212, -1, 214, -1, -1, 217, 218, 219, -1, 221, + -1, -1, -1, 225, 226, -1, -1, -1, 230, 231, + 232, 233, 234, -1, -1, -1, 238, 239, 240, -1, + -1, 243, -1, -1, -1, -1, 248, 249, -1, -1, + -1, 253, -1, 255, 256, -1, 258, 259, -1, -1, + -1, 263, -1, -1, 266, 267, 268, -1, -1, 271, + -1, -1, 274, 275, -1, -1, -1, -1, -1, 281, + 282, -1, 284, -1, 286, -1, 288, 289, -1, -1, + -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + -1, 313, 314, 315, 316, -1, 318, 319, 320, 321, + -1, 323, 324, 325, -1, -1, -1, -1, 330, 331, + 332, 333, 334, 335, -1, -1, 338, 339, -1, 341, + -1, 343, -1, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, -1, -1, 357, -1, -1, 360, 361, + 362, 363, -1, -1, -1, 367, 368, -1, -1, -1, + 372, -1, 374, 375, 376, -1, 378, 379, 380, 381, + -1, 383, 384, -1, -1, -1, -1, -1, -1, -1, + -1, 393, 394, 395, -1, -1, 398, -1, 400, -1, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + -1, -1, 414, 415, 416, -1, 418, -1, 420, 421, + 422, 423, 424, -1, 426, 427, 428, -1, -1, 431, + -1, -1, -1, 435, 436, 437, 438, 439, -1, -1, + 442, 443, 444, 445, 446, -1, 448, 449, -1, 451, + 452, 453, -1, -1, 456, -1, 458, -1, 460, 461, + -1, 463, 464, -1, 466, -1, 468, -1, -1, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, -1, 484, 485, -1, -1, -1, 489, 490, 491, + 492, -1, -1, -1, 496, -1, -1, -1, 500, -1, + 502, 503, 504, 505, 506, 507, -1, 509, 510, 511, + 512, 513, 514, -1, -1, -1, -1, -1, -1, 521, + 522, -1, 524, -1, -1, 527, -1, -1, -1, 531, + 532, 533, -1, -1, -1, 537, -1, -1, 540, 541, + -1, 543, 544, 545, 546, 547, 548, -1, -1, 551, + 552, 553, 554, -1, 556, 557, -1, -1, 560, 561, + 562, 563, -1, -1, 566, 567, -1, 569, 570, 571, + 572, -1, -1, -1, -1, -1, 578, 579, 580, -1, + -1, -1, 584, 585, 586, 587, -1, 589, 590, -1, + 592, 593, -1, 595, 596, -1, -1, 599, -1, -1, + 602, -1, 604, -1, 606, 607, -1, -1, -1, -1, + -1, -1, 614, -1, -1, 617, -1, -1, -1, 621, + 622, 623, 624, 625, 626, 627, -1, -1, -1, -1, + -1, -1, 634, 635, -1, 637, 638, 639, -1, -1, + 642, -1, -1, -1, -1, -1, -1, 5, -1, 7, + 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, + -1, 19, 664, 665, 22, -1, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, + 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, + -1, 49, -1, 51, 52, -1, -1, 55, -1, -1, + 58, 59, -1, 61, 62, -1, 64, 65, -1, 67, + 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, + 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, + 88, 89, -1, 91, 92, -1, 94, 95, 96, 97, + 98, -1, 100, -1, -1, 103, -1, -1, 106, -1, + 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, + 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, + 128, -1, -1, -1, -1, 133, -1, 135, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, 146, -1, + -1, -1, -1, 151, -1, -1, 154, 155, 156, -1, + -1, -1, 160, -1, 162, 163, -1, 165, 166, 167, + -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, + 178, -1, -1, 181, 182, 183, 184, -1, -1, 187, + 188, -1, 190, 191, 192, -1, -1, 195, -1, -1, + -1, 199, 200, -1, 202, -1, 204, -1, 206, 207, + 208, 209, 210, 211, 212, -1, 214, -1, -1, 217, + 218, 219, -1, 221, -1, -1, -1, 225, 226, -1, + -1, -1, 230, 231, 232, 233, 234, -1, -1, -1, + 238, 239, 240, -1, -1, 243, -1, -1, -1, -1, + 248, 249, -1, -1, -1, 253, -1, 255, 256, -1, + 258, 259, -1, -1, -1, 263, -1, -1, 266, 267, + 268, -1, -1, 271, -1, -1, 274, 275, -1, -1, + -1, -1, -1, 281, 282, -1, 284, -1, 286, -1, + 288, 289, -1, -1, -1, -1, -1, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, -1, 313, 314, 315, 316, -1, + 318, 319, 320, 321, -1, 323, 324, 325, -1, -1, + -1, -1, 330, 331, 332, 333, 334, 335, -1, -1, + 338, 339, -1, 341, -1, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, -1, -1, 357, + -1, -1, 360, 361, 362, 363, -1, -1, -1, 367, + 368, -1, -1, -1, 372, -1, 374, 375, 376, -1, + 378, 379, 380, 381, -1, 383, 384, -1, -1, -1, + -1, -1, -1, -1, -1, 393, 394, 395, -1, -1, + 398, -1, 400, -1, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, 416, -1, + 418, -1, 420, 421, 422, 423, 424, -1, 426, 427, + 428, -1, -1, 431, -1, -1, -1, 435, 436, 437, + 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, + 448, 449, -1, 451, 452, 453, -1, -1, 456, -1, + 458, -1, 460, 461, -1, 463, 464, -1, 466, -1, + 468, -1, -1, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, -1, 484, 485, -1, -1, + -1, 489, 490, 491, 492, -1, -1, -1, 496, -1, + -1, -1, 500, -1, 502, 503, 504, 505, 506, 507, + -1, 509, 510, 511, 512, 513, 514, -1, -1, -1, + -1, -1, -1, 521, 522, -1, 524, -1, -1, 527, + -1, -1, -1, 531, 532, 533, -1, -1, -1, 537, + -1, -1, 540, 541, -1, 543, 544, 545, 546, 547, + 548, -1, -1, 551, 552, 553, 554, -1, 556, 557, + -1, -1, 560, 561, 562, 563, -1, -1, 566, 567, + -1, 569, 570, 571, 572, -1, -1, -1, -1, -1, + 578, 579, 580, -1, -1, -1, 584, 585, 586, 587, + -1, 589, 590, -1, 592, 593, -1, 595, 596, -1, + -1, 599, -1, -1, 602, -1, 604, -1, 606, 607, + -1, -1, -1, -1, -1, -1, 614, -1, -1, 617, + -1, -1, -1, 621, 622, 623, 624, 625, 626, 627, + -1, -1, -1, -1, -1, -1, 634, 635, -1, 637, + 638, 639, -1, -1, 642, -1, -1, -1, -1, 5, + -1, 7, 8, 9, 10, 11, 12, -1, -1, 15, + -1, -1, -1, 19, -1, -1, 22, 665, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, @@ -16376,186 +14130,764 @@ static const yytype_int16 yycheck[] = 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, -1, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, -1, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, -1, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, -1, -1, 295, + -1, -1, -1, -1, 140, -1, 142, 143, 144, 145, + 146, -1, -1, -1, -1, 151, -1, -1, 154, 155, + 156, -1, -1, -1, 160, -1, 162, 163, -1, 165, + 166, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, 178, -1, -1, 181, 182, 183, 184, -1, + -1, 187, 188, -1, 190, 191, 192, -1, -1, 195, + -1, -1, -1, 199, 200, -1, 202, -1, 204, -1, + 206, 207, 208, 209, 210, 211, 212, -1, 214, -1, + -1, 217, 218, 219, -1, 221, -1, -1, -1, 225, + 226, -1, -1, -1, 230, 231, 232, 233, 234, -1, + -1, -1, 238, 239, 240, -1, -1, 243, -1, -1, + -1, -1, 248, 249, -1, -1, -1, 253, -1, 255, + 256, -1, 258, 259, -1, -1, -1, 263, -1, -1, + 266, 267, 268, -1, -1, 271, -1, -1, 274, 275, + -1, -1, -1, -1, -1, 281, 282, -1, 284, -1, + 286, -1, 288, 289, -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, -1, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, 564, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, - 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, - 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, - -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, 97, 98, 99, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, - -1, -1, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, 150, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, 176, 177, -1, 179, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, -1, -1, 194, -1, -1, -1, 198, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, 210, - 211, -1, 213, -1, -1, 216, 217, 218, -1, 220, - -1, -1, -1, 224, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, 248, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, 265, 266, 267, -1, -1, 270, - -1, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, -1, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, 366, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, 382, 383, -1, -1, -1, -1, -1, -1, -1, - -1, 392, 393, 394, -1, -1, 397, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - -1, -1, 413, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, 448, -1, 450, - 451, 452, -1, -1, 455, -1, 457, -1, 459, 460, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, -1, 483, 484, -1, -1, -1, 488, 489, 490, - 491, -1, -1, -1, 495, -1, -1, -1, 499, -1, - 501, 502, 503, 504, 505, 506, -1, 508, 509, 510, - 511, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - 531, 532, -1, -1, -1, 536, -1, -1, 539, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, -1, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, 583, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, 594, 595, -1, -1, 598, -1, -1, - 601, -1, 603, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, 634, -1, 636, 637, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, - -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, + 306, 307, 308, 309, 310, 311, -1, 313, 314, 315, + 316, -1, 318, 319, 320, 321, -1, 323, 324, 325, + -1, -1, -1, -1, 330, 331, 332, 333, 334, 335, + -1, -1, 338, 339, -1, 341, -1, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, -1, + -1, 357, -1, -1, 360, 361, 362, 363, -1, -1, + -1, 367, 368, -1, -1, -1, 372, -1, 374, 375, + 376, -1, 378, 379, 380, 381, -1, 383, 384, -1, + -1, -1, -1, -1, -1, -1, -1, 393, 394, 395, + -1, -1, 398, -1, 400, -1, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + 416, -1, 418, -1, 420, 421, 422, 423, 424, -1, + 426, 427, 428, -1, -1, 431, -1, -1, -1, 435, + 436, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, -1, 451, 452, 453, -1, -1, + 456, -1, 458, -1, 460, 461, -1, 463, 464, -1, + 466, -1, 468, -1, -1, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, -1, 484, 485, + -1, -1, -1, 489, 490, 491, 492, -1, -1, -1, + 496, -1, -1, -1, 500, -1, 502, 503, 504, 505, + 506, 507, -1, 509, 510, 511, 512, 513, 514, -1, + -1, -1, -1, -1, -1, 521, 522, -1, 524, -1, + -1, 527, -1, -1, -1, 531, 532, 533, -1, -1, + -1, 537, -1, -1, 540, 541, -1, 543, 544, 545, + 546, 547, 548, -1, -1, 551, 552, 553, 554, -1, + 556, 557, -1, -1, 560, 561, 562, 563, -1, -1, + 566, 567, -1, 569, 570, 571, 572, -1, -1, -1, + -1, -1, 578, 579, 580, -1, -1, -1, 584, 585, + 586, 587, -1, 589, 590, -1, 592, 593, -1, 595, + 596, -1, -1, 599, -1, -1, 602, -1, 604, -1, + 606, 607, -1, -1, -1, -1, -1, -1, 614, -1, + -1, 617, -1, -1, -1, 621, 622, 623, 624, 625, + 626, 627, -1, -1, -1, -1, -1, -1, 634, 635, + -1, 637, 638, 639, -1, -1, 642, -1, -1, -1, + -1, 5, -1, 7, 8, 9, 10, 11, 12, -1, + -1, 15, -1, -1, -1, 19, -1, -1, 22, 665, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, + -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, + -1, 55, -1, -1, 58, 59, -1, 61, 62, -1, + 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, + 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, + 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, + 94, 95, 96, 97, 98, -1, 100, -1, -1, 103, + -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, + -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, + -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, + -1, 135, -1, -1, -1, -1, 140, -1, 142, 143, + 144, 145, 146, -1, -1, -1, -1, 151, -1, -1, + 154, 155, 156, -1, -1, -1, 160, -1, 162, 163, + -1, 165, 166, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, 178, -1, -1, 181, 182, 183, + 184, -1, -1, 187, 188, -1, 190, 191, 192, -1, + -1, 195, -1, -1, -1, 199, 200, -1, 202, -1, + 204, -1, 206, 207, 208, 209, 210, 211, 212, -1, + 214, -1, -1, 217, 218, 219, -1, 221, -1, -1, + -1, 225, 226, -1, -1, -1, 230, 231, 232, 233, + 234, -1, -1, -1, 238, 239, 240, -1, -1, 243, + -1, -1, -1, -1, 248, 249, -1, -1, -1, 253, + -1, 255, 256, -1, 258, 259, -1, -1, -1, 263, + -1, -1, 266, 267, 268, -1, -1, 271, -1, -1, + 274, 275, -1, -1, -1, -1, -1, 281, 282, -1, + 284, -1, 286, -1, 288, 289, -1, -1, -1, -1, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, -1, 313, + 314, 315, 316, -1, 318, 319, 320, 321, -1, 323, + 324, 325, -1, -1, -1, -1, 330, 331, 332, 333, + 334, 335, -1, -1, 338, 339, -1, 341, -1, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, -1, -1, 357, -1, -1, 360, 361, 362, 363, + -1, -1, -1, 367, 368, -1, -1, -1, 372, -1, + 374, 375, 376, -1, 378, 379, 380, 381, -1, 383, + 384, -1, -1, -1, -1, -1, -1, -1, -1, 393, + 394, 395, -1, -1, 398, -1, 400, -1, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, 416, -1, 418, -1, 420, 421, 422, 423, + 424, -1, 426, 427, 428, -1, -1, 431, -1, -1, + -1, 435, 436, 437, 438, 439, -1, -1, 442, 443, + 444, 445, 446, -1, 448, 449, -1, 451, 452, 453, + -1, -1, 456, -1, 458, -1, 460, 461, -1, 463, + 464, -1, 466, -1, 468, -1, -1, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, -1, + 484, 485, -1, -1, -1, 489, 490, 491, 492, -1, + -1, -1, 496, -1, -1, -1, 500, -1, 502, 503, + 504, 505, 506, 507, -1, 509, 510, 511, 512, 513, + 514, -1, -1, -1, -1, -1, -1, 521, 522, -1, + 524, -1, -1, 527, -1, -1, -1, 531, 532, 533, + -1, -1, -1, 537, -1, -1, 540, 541, -1, 543, + 544, 545, 546, 547, 548, -1, -1, 551, 552, 553, + 554, -1, 556, 557, -1, -1, 560, 561, 562, 563, + -1, -1, 566, 567, -1, 569, 570, 571, 572, -1, + -1, -1, -1, -1, 578, 579, 580, -1, -1, -1, + 584, 585, 586, 587, -1, 589, 590, -1, 592, 593, + -1, 595, 596, -1, -1, 599, -1, -1, 602, -1, + 604, -1, 606, 607, -1, -1, -1, -1, -1, -1, + 614, -1, -1, 617, -1, -1, -1, 621, 622, 623, + 624, 625, 626, 627, -1, -1, -1, -1, -1, -1, + 634, 635, -1, 637, 638, 639, -1, -1, 642, -1, + -1, -1, -1, 5, -1, 7, 8, 9, 10, 11, + 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, + 22, 665, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, 34, -1, -1, -1, 38, -1, -1, -1, + 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, + 52, -1, -1, 55, -1, -1, 58, 59, -1, 61, + 62, -1, 64, 65, -1, 67, 68, 69, 70, 71, + 72, -1, 74, 75, 76, 77, 78, 79, 80, -1, + 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, + 92, -1, 94, 95, 96, 97, 98, -1, 100, -1, + -1, 103, -1, -1, 106, -1, 108, -1, -1, 111, + -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, + 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, + -1, 133, -1, 135, -1, -1, -1, -1, 140, -1, + 142, 143, 144, 145, 146, -1, -1, -1, -1, 151, + -1, -1, 154, 155, 156, -1, -1, -1, 160, -1, + 162, 163, -1, 165, 166, 167, -1, 169, 170, -1, + 172, 173, 174, 175, 176, 177, 178, -1, -1, 181, + 182, 183, 184, -1, -1, 187, 188, -1, 190, 191, + 192, -1, -1, 195, -1, -1, -1, 199, 200, -1, + 202, -1, 204, -1, 206, 207, 208, 209, 210, 211, + 212, -1, 214, -1, -1, 217, 218, 219, -1, 221, + -1, -1, -1, 225, 226, -1, -1, -1, 230, 231, + 232, 233, 234, -1, -1, -1, 238, 239, 240, -1, + -1, 243, -1, -1, -1, -1, 248, 249, -1, -1, + -1, 253, -1, 255, 256, -1, 258, 259, -1, -1, + -1, 263, -1, -1, 266, 267, 268, -1, -1, 271, + -1, -1, 274, 275, -1, -1, -1, -1, -1, 281, + 282, -1, 284, -1, 286, -1, 288, 289, -1, -1, + -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + -1, 313, 314, 315, 316, -1, 318, 319, 320, 321, + -1, 323, 324, 325, -1, -1, -1, -1, 330, 331, + 332, 333, 334, 335, -1, -1, 338, 339, -1, 341, + -1, 343, -1, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, -1, -1, 357, -1, -1, 360, 361, + 362, 363, -1, -1, -1, 367, 368, -1, -1, -1, + 372, -1, 374, 375, 376, -1, 378, 379, 380, 381, + -1, 383, 384, -1, -1, -1, -1, -1, -1, -1, + -1, 393, 394, 395, -1, -1, 398, -1, 400, -1, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + -1, -1, 414, 415, 416, -1, 418, -1, 420, 421, + 422, 423, 424, -1, 426, 427, 428, -1, -1, 431, + -1, -1, -1, 435, 436, 437, 438, 439, -1, -1, + 442, 443, 444, 445, 446, -1, 448, 449, -1, 451, + 452, 453, -1, -1, 456, -1, 458, -1, 460, 461, + -1, 463, 464, -1, 466, -1, 468, -1, -1, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, -1, 484, 485, -1, -1, -1, 489, 490, 491, + 492, -1, -1, -1, 496, -1, -1, -1, 500, -1, + 502, 503, 504, 505, 506, 507, -1, 509, 510, 511, + 512, 513, 514, -1, -1, -1, -1, -1, -1, 521, + 522, -1, 524, -1, -1, 527, -1, -1, -1, 531, + 532, 533, -1, -1, -1, 537, -1, -1, 540, 541, + -1, 543, 544, 545, 546, 547, 548, -1, -1, 551, + 552, 553, 554, -1, 556, 557, -1, -1, 560, 561, + 562, 563, -1, -1, 566, 567, -1, 569, 570, 571, + 572, -1, -1, -1, -1, -1, 578, 579, 580, -1, + -1, -1, 584, 585, 586, 587, -1, 589, 590, -1, + 592, 593, -1, 595, 596, -1, -1, 599, -1, -1, + 602, -1, 604, -1, 606, 607, -1, -1, -1, -1, + -1, -1, 614, -1, -1, 617, -1, -1, -1, 621, + 622, 623, 624, 625, 626, 627, -1, -1, -1, -1, + -1, -1, 634, 635, -1, 637, 638, 639, -1, -1, + 642, -1, -1, -1, -1, 5, -1, 7, 8, 9, + 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, + -1, -1, 22, 665, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, + -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, + -1, 51, 52, -1, -1, 55, -1, -1, 58, 59, + -1, 61, 62, 63, 64, 65, -1, 67, 68, 69, + 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, + 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, + -1, 91, 92, -1, 94, 95, 96, 97, 98, -1, + 100, -1, -1, 103, -1, -1, 106, -1, 108, -1, + -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, + -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, + -1, -1, 132, 133, -1, 135, -1, -1, -1, -1, + 140, -1, 142, 143, 144, 145, 146, -1, -1, -1, + -1, 151, -1, -1, 154, 155, 156, -1, -1, -1, + 160, -1, 162, 163, -1, 165, 166, 167, -1, 169, + 170, -1, 172, 173, 174, 175, 176, 177, 178, -1, + -1, 181, 182, 183, 184, -1, -1, 187, 188, -1, + 190, 191, 192, -1, -1, 195, -1, -1, -1, 199, + 200, -1, 202, -1, 204, -1, 206, 207, 208, 209, + 210, 211, 212, -1, 214, -1, -1, 217, 218, 219, + -1, 221, -1, -1, -1, 225, 226, -1, -1, -1, + 230, 231, 232, 233, 234, -1, -1, -1, 238, 239, + 240, -1, -1, 243, -1, -1, -1, -1, 248, 249, + -1, -1, -1, 253, -1, 255, 256, -1, 258, 259, + -1, -1, -1, 263, -1, -1, 266, 267, 268, -1, + -1, 271, -1, -1, 274, 275, -1, -1, -1, -1, + -1, 281, 282, -1, 284, -1, 286, -1, 288, 289, + -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, -1, 313, 314, 315, 316, -1, 318, 319, + 320, 321, -1, 323, 324, 325, -1, -1, -1, -1, + 330, 331, 332, 333, 334, 335, -1, -1, 338, 339, + -1, 341, -1, 343, -1, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, -1, -1, 357, -1, -1, + 360, 361, 362, 363, -1, -1, -1, 367, 368, -1, + -1, -1, 372, -1, 374, 375, 376, -1, 378, 379, + 380, 381, -1, 383, 384, -1, -1, -1, -1, -1, + -1, -1, -1, 393, 394, 395, -1, -1, 398, -1, + 400, -1, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, -1, 414, 415, 416, -1, 418, -1, + 420, 421, 422, 423, 424, -1, 426, 427, 428, -1, + -1, 431, -1, -1, -1, 435, 436, 437, 438, 439, + -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, + -1, 451, 452, 453, -1, -1, 456, -1, 458, -1, + 460, 461, -1, 463, 464, -1, 466, -1, 468, -1, + -1, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, -1, 484, 485, -1, -1, -1, 489, + 490, 491, 492, -1, -1, -1, 496, -1, -1, -1, + 500, -1, 502, 503, 504, 505, 506, 507, -1, 509, + 510, 511, 512, 513, 514, -1, -1, -1, -1, -1, + -1, 521, 522, -1, 524, -1, -1, 527, -1, -1, + -1, 531, 532, 533, -1, -1, -1, 537, -1, -1, + 540, 541, -1, 543, 544, 545, 546, 547, 548, -1, + -1, 551, 552, 553, 554, -1, 556, 557, -1, -1, + 560, 561, 562, 563, -1, -1, 566, 567, -1, 569, + 570, 571, 572, -1, -1, -1, -1, -1, 578, 579, + 580, -1, -1, -1, 584, 585, 586, 587, -1, 589, + 590, -1, 592, 593, -1, 595, 596, -1, -1, 599, + -1, -1, 602, -1, 604, -1, 606, 607, -1, -1, + -1, -1, -1, -1, 614, -1, -1, 617, -1, -1, + -1, 621, 622, 623, 624, 625, 626, 627, -1, -1, + -1, -1, -1, -1, 634, 635, -1, 637, 638, 639, + -1, -1, 642, -1, -1, -1, 5, -1, 7, 8, + 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, + 19, -1, -1, 22, 664, 24, 25, 26, 27, 28, + 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, + -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, + 49, -1, 51, 52, -1, -1, 55, -1, -1, 58, + 59, -1, 61, 62, -1, 64, 65, -1, 67, 68, + 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, + 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, + 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, + -1, 100, -1, -1, 103, -1, -1, 106, -1, 108, + -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, + 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, + -1, -1, -1, -1, 133, -1, 135, -1, -1, -1, + -1, 140, -1, 142, 143, 144, 145, 146, -1, -1, + -1, -1, 151, -1, -1, 154, 155, 156, -1, -1, + -1, 160, -1, 162, 163, -1, 165, 166, 167, -1, + 169, 170, -1, 172, 173, 174, 175, 176, 177, 178, + -1, -1, 181, 182, 183, 184, -1, -1, 187, 188, + -1, 190, 191, 192, -1, -1, 195, -1, -1, -1, + 199, 200, -1, 202, -1, 204, -1, 206, 207, 208, + 209, 210, 211, 212, -1, 214, -1, -1, 217, 218, + 219, -1, 221, -1, -1, -1, 225, 226, -1, -1, + -1, 230, 231, 232, 233, 234, -1, -1, -1, 238, + 239, 240, -1, -1, 243, -1, -1, -1, -1, 248, + 249, -1, -1, -1, 253, -1, 255, 256, -1, 258, + 259, -1, -1, -1, 263, -1, -1, 266, 267, 268, + -1, -1, 271, -1, -1, 274, 275, 276, -1, -1, + -1, -1, 281, 282, -1, 284, -1, 286, -1, 288, + 289, -1, -1, -1, -1, -1, -1, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, -1, 313, 314, 315, 316, -1, 318, + 319, 320, 321, -1, 323, 324, 325, -1, -1, -1, + -1, 330, 331, 332, 333, 334, 335, -1, -1, 338, + 339, -1, 341, -1, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, -1, -1, 357, -1, + -1, 360, 361, 362, 363, -1, -1, -1, 367, 368, + -1, -1, -1, 372, -1, 374, 375, 376, -1, 378, + 379, 380, 381, -1, 383, 384, -1, -1, -1, -1, + -1, -1, -1, -1, 393, 394, 395, -1, -1, 398, + -1, 400, -1, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, 416, -1, 418, + -1, 420, 421, 422, 423, 424, -1, 426, 427, 428, + -1, -1, 431, -1, -1, -1, 435, 436, 437, 438, + 439, -1, -1, 442, 443, 444, 445, 446, -1, 448, + 449, -1, 451, 452, 453, -1, -1, 456, -1, 458, + -1, 460, 461, -1, 463, 464, -1, 466, -1, 468, + -1, -1, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, -1, 484, 485, -1, -1, -1, + 489, 490, 491, 492, -1, -1, -1, 496, -1, -1, + -1, 500, -1, 502, 503, 504, 505, 506, 507, -1, + 509, 510, 511, 512, 513, 514, -1, -1, -1, -1, + -1, -1, 521, 522, -1, 524, -1, -1, 527, -1, + -1, -1, 531, 532, 533, -1, -1, -1, 537, -1, + -1, 540, 541, -1, 543, 544, 545, 546, 547, 548, + -1, -1, 551, 552, 553, 554, -1, 556, 557, -1, + -1, 560, 561, 562, 563, -1, 565, 566, 567, -1, + 569, 570, 571, 572, -1, -1, -1, -1, -1, 578, + 579, 580, -1, -1, -1, 584, 585, 586, 587, -1, + 589, 590, -1, 592, 593, -1, 595, 596, -1, -1, + 599, -1, -1, 602, -1, 604, -1, 606, 607, -1, + -1, -1, -1, -1, -1, 614, -1, -1, 617, -1, + -1, -1, 621, 622, 623, 624, 625, 626, 627, -1, + -1, -1, -1, -1, -1, 634, 635, -1, 637, 638, + 639, -1, -1, 642, -1, -1, -1, 5, -1, 7, + 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, + -1, 19, -1, -1, 22, 664, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, + 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, + -1, 49, -1, 51, 52, -1, -1, 55, -1, -1, + 58, 59, -1, 61, 62, -1, 64, 65, -1, 67, + 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, + 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, + 88, 89, -1, 91, 92, -1, 94, 95, 96, 97, + 98, -1, 100, -1, -1, 103, -1, -1, 106, -1, + 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, + 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, + 128, -1, -1, -1, -1, 133, -1, 135, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, 146, -1, + -1, -1, -1, 151, -1, -1, 154, 155, 156, -1, + -1, -1, 160, -1, 162, 163, -1, 165, 166, 167, + -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, + 178, -1, -1, 181, 182, 183, 184, -1, -1, 187, + 188, -1, 190, 191, 192, -1, -1, 195, -1, -1, + -1, 199, 200, -1, 202, -1, 204, -1, 206, 207, + 208, 209, 210, 211, 212, -1, 214, -1, -1, 217, + 218, 219, -1, 221, -1, -1, -1, 225, 226, -1, + -1, -1, 230, 231, 232, 233, 234, -1, -1, -1, + 238, 239, 240, -1, -1, 243, -1, -1, -1, -1, + 248, 249, -1, -1, -1, 253, -1, 255, 256, -1, + 258, 259, -1, -1, -1, 263, -1, -1, 266, 267, + 268, -1, -1, 271, -1, -1, 274, 275, 276, -1, + -1, -1, -1, 281, 282, -1, 284, -1, 286, -1, + 288, 289, -1, -1, -1, -1, -1, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, -1, 313, 314, 315, 316, -1, + 318, 319, 320, 321, -1, 323, 324, 325, -1, -1, + -1, -1, 330, 331, 332, 333, 334, 335, -1, -1, + 338, 339, -1, 341, -1, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, -1, -1, 357, + -1, -1, 360, 361, 362, 363, -1, -1, -1, 367, + 368, -1, -1, -1, 372, -1, 374, 375, 376, -1, + 378, 379, 380, 381, -1, 383, 384, -1, -1, -1, + -1, -1, -1, -1, -1, 393, 394, 395, -1, -1, + 398, -1, 400, -1, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, 416, -1, + 418, -1, 420, 421, 422, 423, 424, -1, 426, 427, + 428, -1, -1, 431, -1, -1, -1, 435, 436, 437, + 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, + 448, 449, -1, 451, 452, 453, -1, -1, 456, -1, + 458, -1, 460, 461, -1, 463, 464, -1, 466, -1, + 468, -1, -1, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, -1, 484, 485, -1, -1, + -1, 489, 490, 491, 492, -1, -1, -1, 496, -1, + -1, -1, 500, -1, 502, 503, 504, 505, 506, 507, + -1, 509, 510, 511, 512, 513, 514, -1, -1, -1, + -1, -1, -1, 521, 522, -1, 524, -1, -1, 527, + -1, -1, -1, 531, 532, 533, -1, -1, -1, 537, + -1, -1, 540, 541, -1, 543, 544, 545, 546, 547, + 548, -1, -1, 551, 552, 553, 554, -1, 556, 557, + -1, -1, 560, 561, 562, 563, -1, 565, 566, 567, + -1, 569, 570, 571, 572, -1, -1, -1, -1, -1, + 578, 579, 580, -1, -1, -1, 584, 585, 586, 587, + -1, 589, 590, -1, 592, 593, -1, 595, 596, -1, + -1, 599, -1, -1, 602, -1, 604, -1, 606, 607, + -1, -1, -1, -1, -1, -1, 614, -1, -1, 617, + -1, -1, -1, 621, 622, 623, 624, 625, 626, 627, + -1, -1, -1, -1, -1, -1, 634, 635, -1, 637, + 638, 639, -1, -1, 642, -1, -1, -1, 5, -1, + 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, + -1, -1, 19, -1, -1, 22, 664, 24, 25, 26, + 27, 28, 29, 30, 31, 32, -1, 34, -1, -1, + -1, 38, -1, -1, -1, 42, -1, -1, 45, 46, + 47, -1, 49, -1, 51, 52, -1, -1, 55, -1, + -1, 58, 59, -1, 61, 62, -1, 64, 65, -1, + 67, 68, 69, 70, 71, 72, -1, 74, 75, 76, + 77, 78, 79, 80, -1, 82, 83, 84, 85, 86, + 87, 88, 89, -1, 91, 92, -1, 94, 95, 96, + 97, 98, -1, 100, -1, -1, 103, -1, -1, 106, + -1, 108, -1, -1, 111, -1, 113, -1, -1, -1, + 117, 118, 119, -1, -1, 122, -1, -1, -1, -1, + 127, 128, -1, -1, -1, -1, 133, -1, 135, -1, + -1, -1, -1, 140, -1, 142, 143, 144, 145, 146, + -1, -1, -1, -1, 151, -1, -1, 154, 155, 156, + -1, -1, -1, 160, -1, 162, 163, -1, 165, 166, + 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, + 177, 178, -1, -1, 181, 182, 183, 184, -1, -1, + 187, 188, -1, 190, 191, 192, -1, -1, 195, -1, + -1, -1, 199, 200, -1, 202, -1, 204, -1, 206, + 207, 208, 209, 210, 211, 212, -1, 214, -1, -1, + 217, 218, 219, -1, 221, -1, -1, -1, 225, 226, + -1, -1, -1, 230, 231, 232, 233, 234, -1, -1, + -1, 238, 239, 240, -1, -1, 243, -1, -1, -1, + -1, 248, 249, -1, -1, -1, 253, -1, 255, 256, + -1, 258, 259, -1, -1, -1, 263, -1, -1, 266, + 267, 268, -1, -1, 271, -1, -1, 274, 275, 276, + -1, -1, -1, -1, 281, 282, -1, 284, -1, 286, + -1, 288, 289, -1, -1, -1, -1, -1, -1, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, -1, 313, 314, 315, 316, + -1, 318, 319, 320, 321, -1, 323, 324, 325, -1, + -1, -1, -1, 330, 331, 332, 333, 334, 335, -1, + -1, 338, 339, -1, 341, -1, 343, -1, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, -1, -1, + 357, -1, -1, 360, 361, 362, 363, -1, -1, -1, + 367, 368, -1, -1, -1, 372, -1, 374, 375, 376, + -1, 378, 379, 380, 381, -1, 383, 384, -1, -1, + -1, -1, -1, -1, -1, -1, 393, 394, 395, -1, + -1, 398, -1, 400, -1, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, -1, -1, 414, 415, 416, + -1, 418, -1, 420, 421, 422, 423, 424, -1, 426, + 427, 428, -1, -1, 431, -1, -1, -1, 435, 436, + 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, + -1, 448, 449, -1, 451, 452, 453, -1, -1, 456, + -1, 458, -1, 460, 461, -1, 463, 464, -1, 466, + -1, 468, -1, -1, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, -1, 484, 485, -1, + -1, -1, 489, 490, 491, 492, -1, -1, -1, 496, + -1, -1, -1, 500, -1, 502, 503, 504, 505, 506, + 507, -1, 509, 510, 511, 512, 513, 514, -1, -1, + -1, -1, -1, -1, 521, 522, -1, 524, -1, -1, + 527, -1, -1, -1, 531, 532, 533, -1, -1, -1, + 537, -1, -1, 540, 541, -1, 543, 544, 545, 546, + 547, 548, -1, -1, 551, 552, 553, 554, -1, 556, + 557, -1, -1, 560, 561, 562, 563, -1, 565, 566, + 567, -1, 569, 570, 571, 572, -1, -1, -1, -1, + -1, 578, 579, 580, -1, -1, -1, 584, 585, 586, + 587, -1, 589, 590, -1, 592, 593, -1, 595, 596, + -1, -1, 599, -1, -1, 602, -1, 604, -1, 606, + 607, -1, -1, -1, -1, -1, -1, 614, -1, -1, + 617, -1, -1, -1, 621, 622, 623, 624, 625, 626, + 627, -1, -1, -1, -1, -1, -1, 634, 635, -1, + 637, 638, 639, -1, -1, 642, -1, -1, -1, 5, + -1, 7, 8, 9, 10, 11, 12, -1, -1, 15, + -1, -1, -1, 19, -1, -1, 22, 664, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, - -1, -1, 58, 59, -1, 61, 62, -1, 64, 65, + -1, -1, 58, 59, -1, 61, 62, 63, 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, -1, 100, -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, - -1, 127, 128, -1, -1, -1, -1, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, -1, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, -1, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, -1, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, -1, -1, 295, + -1, 127, 128, -1, -1, -1, 132, 133, -1, 135, + -1, -1, -1, -1, 140, -1, 142, 143, 144, 145, + 146, -1, -1, -1, -1, 151, -1, -1, 154, 155, + 156, -1, -1, -1, 160, -1, 162, 163, -1, 165, + 166, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, 178, -1, -1, 181, 182, 183, 184, -1, + -1, 187, 188, -1, 190, 191, 192, -1, -1, 195, + -1, -1, -1, 199, 200, -1, 202, -1, 204, -1, + 206, 207, 208, 209, 210, 211, 212, -1, 214, -1, + -1, 217, 218, 219, -1, 221, -1, -1, -1, 225, + 226, -1, -1, -1, 230, 231, 232, 233, 234, -1, + -1, -1, 238, 239, 240, -1, -1, 243, -1, -1, + -1, -1, 248, 249, -1, -1, -1, 253, -1, 255, + 256, -1, 258, 259, -1, -1, -1, 263, -1, -1, + 266, 267, 268, -1, -1, 271, -1, -1, 274, 275, + -1, -1, -1, -1, -1, 281, 282, -1, 284, -1, + 286, -1, 288, 289, -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, -1, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, 517, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, -1, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, 5, 641, 7, 8, 9, 10, + 306, 307, 308, 309, 310, 311, -1, 313, 314, 315, + 316, -1, 318, 319, 320, 321, -1, 323, 324, 325, + -1, -1, -1, -1, 330, 331, 332, 333, 334, 335, + -1, -1, 338, 339, -1, 341, -1, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, -1, + -1, 357, -1, -1, 360, 361, 362, 363, -1, -1, + -1, 367, 368, -1, -1, -1, 372, -1, 374, 375, + 376, -1, 378, 379, 380, 381, -1, 383, 384, -1, + -1, -1, -1, -1, -1, -1, -1, 393, 394, 395, + -1, -1, 398, -1, 400, -1, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + 416, -1, 418, -1, 420, 421, 422, 423, 424, -1, + 426, 427, 428, -1, -1, 431, -1, -1, -1, 435, + 436, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, -1, 451, 452, 453, -1, -1, + 456, -1, 458, -1, 460, 461, -1, 463, 464, -1, + 466, -1, 468, -1, -1, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, -1, 484, 485, + -1, -1, -1, 489, 490, 491, 492, -1, -1, -1, + 496, -1, -1, -1, 500, -1, 502, 503, 504, 505, + 506, 507, -1, 509, 510, 511, 512, 513, 514, -1, + -1, -1, -1, -1, -1, 521, 522, -1, 524, -1, + -1, 527, -1, -1, -1, 531, 532, 533, -1, -1, + -1, 537, -1, -1, 540, 541, -1, 543, 544, 545, + 546, 547, 548, -1, -1, 551, 552, 553, 554, -1, + 556, 557, -1, -1, 560, 561, 562, 563, -1, -1, + 566, 567, -1, 569, 570, 571, 572, -1, -1, -1, + -1, -1, 578, 579, 580, -1, -1, -1, 584, 585, + 586, 587, -1, 589, 590, -1, 592, 593, -1, 595, + 596, -1, -1, 599, -1, -1, 602, -1, 604, -1, + 606, 607, -1, -1, -1, -1, -1, -1, 614, -1, + -1, 617, -1, -1, -1, 621, 622, 623, 624, 625, + 626, 627, -1, -1, -1, -1, -1, -1, 634, 635, + -1, 637, 638, 639, -1, -1, 642, -1, -1, -1, + 5, -1, 7, 8, 9, 10, 11, 12, -1, -1, + 15, -1, -1, -1, 19, -1, -1, 22, 664, 24, + 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, + -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, + 45, 46, 47, -1, 49, -1, 51, 52, -1, -1, + 55, -1, -1, 58, 59, -1, 61, 62, -1, 64, + 65, -1, 67, 68, 69, 70, 71, 72, -1, 74, + 75, 76, 77, 78, 79, 80, -1, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, -1, 94, + 95, 96, 97, 98, -1, 100, -1, -1, 103, -1, + -1, 106, -1, 108, -1, -1, 111, -1, 113, -1, + -1, -1, 117, 118, 119, -1, -1, 122, -1, -1, + -1, -1, 127, 128, -1, -1, -1, -1, 133, -1, + 135, -1, -1, -1, -1, 140, -1, 142, 143, 144, + 145, 146, -1, -1, -1, -1, 151, -1, -1, 154, + 155, 156, -1, -1, -1, 160, -1, 162, 163, -1, + 165, 166, 167, -1, 169, 170, -1, 172, 173, 174, + 175, 176, 177, 178, -1, -1, 181, 182, 183, 184, + -1, -1, 187, 188, -1, 190, 191, 192, -1, -1, + 195, -1, -1, -1, 199, 200, -1, 202, -1, 204, + -1, 206, 207, 208, 209, 210, 211, 212, -1, 214, + -1, -1, 217, 218, 219, -1, 221, -1, -1, -1, + 225, 226, -1, -1, -1, 230, 231, 232, 233, 234, + -1, -1, -1, 238, 239, 240, -1, -1, 243, -1, + -1, -1, -1, 248, 249, -1, -1, -1, 253, -1, + 255, 256, -1, 258, 259, -1, -1, -1, 263, -1, + -1, 266, 267, 268, -1, -1, 271, -1, -1, 274, + 275, -1, -1, -1, -1, -1, 281, 282, -1, 284, + -1, 286, -1, 288, 289, -1, -1, -1, -1, -1, + -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, -1, 313, 314, + 315, 316, -1, 318, 319, 320, 321, -1, 323, 324, + 325, -1, -1, -1, -1, 330, 331, 332, 333, 334, + 335, -1, -1, 338, 339, -1, 341, -1, 343, -1, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + -1, -1, 357, -1, -1, 360, 361, 362, 363, -1, + -1, -1, 367, 368, -1, -1, -1, 372, -1, 374, + 375, 376, -1, 378, 379, 380, 381, -1, 383, 384, + -1, -1, -1, -1, -1, -1, -1, -1, 393, 394, + 395, -1, -1, 398, -1, 400, -1, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, + 415, 416, -1, 418, -1, 420, 421, 422, 423, 424, + -1, 426, 427, 428, -1, -1, 431, -1, -1, -1, + 435, 436, 437, 438, 439, -1, -1, 442, 443, 444, + 445, 446, -1, 448, 449, -1, 451, 452, 453, -1, + -1, 456, -1, 458, -1, 460, 461, -1, 463, 464, + -1, 466, -1, 468, -1, -1, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, -1, 484, + 485, -1, -1, -1, 489, 490, 491, 492, -1, -1, + -1, 496, -1, -1, -1, 500, -1, 502, 503, 504, + 505, 506, 507, -1, 509, 510, 511, 512, 513, 514, + -1, -1, -1, -1, -1, -1, 521, 522, -1, 524, + -1, -1, 527, -1, -1, -1, 531, 532, 533, -1, + -1, -1, 537, -1, -1, 540, 541, -1, 543, 544, + 545, 546, 547, 548, -1, -1, 551, 552, 553, 554, + -1, 556, 557, -1, -1, 560, 561, 562, 563, -1, + -1, 566, 567, -1, 569, 570, 571, 572, -1, -1, + -1, -1, -1, 578, 579, 580, -1, -1, -1, 584, + 585, 586, 587, -1, 589, 590, -1, 592, 593, -1, + 595, 596, -1, -1, 599, -1, -1, 602, -1, 604, + -1, 606, 607, -1, -1, -1, -1, -1, -1, 614, + -1, -1, 617, -1, -1, -1, 621, 622, 623, 624, + 625, 626, 627, -1, -1, -1, -1, -1, -1, 634, + 635, -1, 637, 638, 639, -1, -1, 642, -1, -1, + -1, 5, -1, 7, 8, 9, 10, 11, 12, -1, + -1, 15, -1, -1, -1, 19, -1, -1, 22, 664, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, + -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, + -1, 55, -1, -1, 58, 59, -1, 61, 62, -1, + 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, + 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, + 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, + 94, 95, 96, 97, 98, -1, 100, -1, -1, 103, + -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, + -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, + -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, + -1, 135, -1, -1, -1, -1, 140, -1, 142, 143, + 144, 145, 146, -1, -1, -1, -1, 151, -1, -1, + 154, 155, 156, -1, -1, -1, 160, -1, 162, 163, + -1, 165, 166, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, 178, -1, -1, 181, 182, 183, + 184, -1, -1, 187, 188, -1, 190, 191, 192, -1, + -1, 195, -1, -1, -1, 199, 200, -1, 202, -1, + 204, -1, 206, 207, 208, 209, 210, 211, 212, -1, + 214, -1, -1, 217, 218, 219, -1, 221, -1, -1, + -1, 225, 226, -1, -1, -1, 230, 231, 232, 233, + 234, -1, -1, -1, 238, 239, 240, -1, -1, 243, + -1, -1, -1, -1, 248, 249, -1, -1, -1, 253, + -1, 255, 256, -1, 258, 259, -1, -1, -1, 263, + -1, -1, 266, 267, 268, -1, -1, 271, -1, -1, + 274, 275, -1, -1, -1, -1, -1, 281, 282, -1, + 284, -1, 286, -1, 288, 289, -1, -1, -1, -1, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, -1, 313, + 314, 315, 316, -1, 318, 319, 320, 321, -1, 323, + 324, 325, -1, -1, -1, -1, 330, 331, 332, 333, + 334, 335, -1, -1, 338, 339, -1, 341, -1, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, -1, -1, 357, -1, -1, 360, 361, 362, 363, + -1, -1, -1, 367, 368, -1, -1, -1, 372, -1, + 374, 375, 376, -1, 378, 379, 380, 381, -1, 383, + 384, -1, -1, -1, -1, -1, -1, -1, -1, 393, + 394, 395, -1, -1, 398, -1, 400, -1, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, 416, -1, 418, -1, 420, 421, 422, 423, + 424, -1, 426, 427, 428, -1, -1, 431, -1, -1, + -1, 435, 436, 437, 438, 439, -1, -1, 442, 443, + 444, 445, 446, -1, 448, 449, -1, 451, 452, 453, + -1, -1, 456, -1, 458, -1, 460, 461, -1, 463, + 464, -1, 466, -1, 468, -1, -1, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, -1, + 484, 485, -1, -1, -1, 489, 490, 491, 492, -1, + -1, -1, 496, -1, -1, -1, 500, -1, 502, 503, + 504, 505, 506, 507, -1, 509, 510, 511, 512, 513, + 514, -1, -1, -1, -1, -1, -1, 521, 522, -1, + 524, -1, -1, 527, -1, -1, -1, 531, 532, 533, + -1, -1, -1, 537, -1, -1, 540, 541, -1, 543, + 544, 545, 546, 547, 548, -1, -1, 551, 552, 553, + 554, -1, 556, 557, -1, -1, 560, 561, 562, 563, + -1, -1, 566, 567, -1, 569, 570, 571, 572, -1, + -1, -1, -1, -1, 578, 579, 580, -1, -1, -1, + 584, 585, 586, 587, -1, 589, 590, -1, 592, 593, + -1, 595, 596, -1, -1, 599, -1, -1, 602, -1, + 604, -1, 606, 607, -1, -1, -1, -1, -1, -1, + 614, -1, -1, 617, -1, -1, -1, 621, 622, 623, + 624, 625, 626, 627, -1, -1, -1, -1, -1, -1, + 634, 635, -1, 637, 638, 639, -1, -1, 642, -1, + -1, -1, 5, -1, 7, 8, 9, 10, 11, 12, + -1, -1, 15, -1, -1, -1, 19, -1, -1, -1, + 664, 24, 25, 26, 27, 28, 29, 30, 31, -1, + -1, 34, -1, -1, -1, 38, -1, -1, -1, 42, + -1, -1, 45, 46, 47, -1, 49, -1, -1, -1, + -1, -1, 55, 56, -1, 58, 59, -1, 61, -1, + -1, -1, -1, -1, 67, 68, 69, 70, 71, 72, + -1, 74, 75, -1, -1, -1, -1, -1, -1, 82, + -1, 84, -1, 86, 87, 88, 89, -1, 91, 92, + -1, 94, 95, 96, -1, 98, -1, 100, -1, -1, + 103, -1, -1, 106, -1, 108, -1, -1, 111, -1, + 113, -1, -1, -1, 117, 118, 119, -1, -1, 122, + -1, -1, -1, -1, 127, -1, -1, -1, -1, -1, + 133, -1, 135, -1, -1, -1, -1, 140, -1, 142, + 143, 144, 145, 146, -1, -1, -1, -1, -1, -1, + -1, 154, 155, 156, -1, -1, -1, 160, -1, -1, + 163, -1, 165, 166, 167, -1, 169, 170, -1, 172, + 173, 174, 175, 176, -1, -1, -1, -1, 181, 182, + 183, 184, -1, -1, 187, 188, 189, 190, 191, 192, + -1, -1, -1, -1, -1, -1, -1, 200, -1, 202, + -1, 204, -1, 206, 207, 208, 209, 210, -1, 212, + -1, 214, -1, -1, -1, 218, 219, -1, -1, -1, + -1, -1, -1, 226, -1, -1, -1, 230, 231, 232, + 233, 234, 235, -1, -1, 238, 239, 240, -1, -1, + 243, -1, -1, -1, -1, 248, -1, -1, -1, -1, + 253, -1, 255, 256, -1, 258, 259, 260, -1, -1, + 263, -1, -1, -1, 267, 268, -1, -1, 271, 272, + -1, 274, 275, -1, -1, -1, -1, -1, 281, 282, + -1, 284, -1, 286, -1, 288, 289, -1, -1, -1, + -1, 294, -1, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, -1, + 313, 314, 315, 316, -1, 318, 319, 320, 321, -1, + 323, 324, 325, -1, -1, -1, -1, 330, 331, 332, + 333, 334, 335, -1, -1, 338, 339, -1, 341, -1, + 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, -1, -1, 357, -1, -1, 360, 361, 362, + 363, -1, -1, -1, -1, 368, -1, -1, -1, 372, + -1, 374, 375, 376, -1, 378, 379, 380, 381, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 394, 395, -1, -1, -1, -1, 400, -1, 402, + 403, 404, 405, 406, 407, 408, 409, 410, -1, -1, + -1, -1, 415, 416, -1, 418, -1, 420, 421, 422, + 423, 424, -1, 426, 427, 428, -1, -1, 431, -1, + -1, -1, 435, 436, 437, 438, 439, -1, -1, 442, + 443, 444, 445, 446, -1, 448, -1, -1, 451, -1, + 453, 454, -1, 456, -1, -1, -1, 460, -1, -1, + 463, 464, -1, 466, 467, 468, -1, -1, 471, -1, + 473, 474, 475, 476, 477, 478, 479, -1, 481, 482, + -1, 484, -1, -1, -1, -1, 489, 490, 491, -1, + -1, -1, -1, 496, -1, -1, -1, -1, -1, -1, + 503, -1, -1, 506, 507, -1, 509, -1, 511, -1, + 513, 514, -1, -1, -1, -1, -1, -1, 521, 522, + -1, 524, -1, -1, 527, -1, -1, -1, 531, -1, + 533, -1, -1, -1, 537, -1, -1, -1, 541, -1, + 543, 544, 545, 546, 547, 548, -1, -1, 551, 552, + 553, 554, -1, 556, 557, -1, -1, 560, 561, 562, + 563, -1, -1, 566, 567, -1, 569, 570, 571, 572, + -1, -1, -1, -1, -1, 578, 579, 580, -1, -1, + -1, -1, 585, 586, 587, -1, 589, 590, -1, 592, + 593, -1, -1, -1, -1, -1, 599, -1, -1, 602, + -1, -1, -1, 606, 607, -1, -1, -1, -1, -1, + -1, 614, -1, -1, 617, -1, -1, -1, 621, 622, + 623, 624, 625, 626, 627, -1, -1, 630, -1, -1, + -1, 634, -1, -1, 637, -1, 639, -1, 5, 642, + 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, + -1, -1, 19, -1, -1, 22, 659, 24, 25, 26, + 27, 28, 29, 30, 31, 32, -1, 34, -1, -1, + -1, 38, -1, -1, -1, 42, -1, -1, 45, 46, + 47, -1, 49, -1, 51, 52, -1, -1, 55, -1, + -1, 58, 59, -1, 61, 62, -1, 64, 65, -1, + 67, 68, 69, 70, 71, 72, -1, 74, 75, 76, + 77, 78, 79, 80, -1, 82, 83, 84, 85, 86, + 87, 88, 89, -1, 91, 92, -1, 94, 95, 96, + 97, 98, -1, 100, -1, -1, 103, -1, -1, 106, + -1, 108, 109, -1, 111, -1, 113, -1, -1, -1, + 117, 118, 119, -1, -1, 122, -1, -1, -1, -1, + 127, 128, -1, -1, -1, -1, 133, -1, 135, -1, + -1, -1, -1, 140, -1, 142, 143, 144, 145, 146, + -1, -1, -1, -1, 151, -1, -1, 154, 155, 156, + -1, -1, -1, 160, -1, 162, 163, -1, 165, 166, + 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, + 177, 178, -1, -1, 181, 182, 183, 184, -1, -1, + 187, 188, -1, 190, 191, 192, -1, -1, 195, -1, + -1, -1, 199, 200, -1, 202, -1, 204, -1, 206, + 207, 208, 209, 210, 211, 212, -1, 214, -1, -1, + 217, 218, 219, -1, 221, -1, -1, -1, 225, 226, + -1, -1, -1, 230, 231, 232, 233, 234, -1, -1, + -1, 238, 239, 240, -1, -1, 243, -1, -1, -1, + -1, 248, 249, -1, -1, -1, 253, -1, 255, 256, + -1, 258, 259, -1, -1, -1, 263, -1, -1, 266, + 267, 268, -1, -1, 271, -1, -1, 274, 275, 276, + -1, -1, -1, -1, 281, 282, -1, 284, -1, 286, + -1, 288, 289, -1, -1, -1, -1, -1, -1, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, -1, 313, 314, 315, 316, + -1, 318, 319, 320, 321, -1, 323, 324, 325, -1, + -1, -1, -1, 330, 331, 332, 333, 334, 335, -1, + -1, 338, 339, -1, 341, -1, 343, -1, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, -1, -1, + 357, -1, -1, 360, 361, 362, 363, -1, -1, -1, + 367, 368, -1, -1, -1, 372, -1, 374, 375, 376, + -1, 378, 379, 380, 381, -1, 383, 384, -1, -1, + -1, -1, -1, -1, -1, -1, 393, 394, 395, -1, + -1, 398, -1, 400, -1, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, -1, -1, 414, 415, 416, + -1, 418, -1, 420, 421, 422, 423, 424, -1, 426, + 427, 428, -1, -1, 431, -1, -1, -1, 435, 436, + 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, + -1, 448, 449, -1, 451, 452, 453, -1, -1, 456, + -1, 458, -1, 460, 461, -1, 463, 464, -1, 466, + -1, 468, -1, -1, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, -1, 484, 485, -1, + -1, -1, 489, 490, 491, 492, -1, -1, -1, 496, + -1, -1, -1, 500, -1, 502, 503, 504, 505, 506, + 507, -1, 509, 510, 511, 512, 513, 514, -1, -1, + -1, -1, -1, -1, 521, 522, -1, 524, -1, -1, + 527, -1, -1, -1, 531, 532, 533, -1, -1, -1, + 537, -1, -1, 540, 541, -1, 543, 544, 545, 546, + 547, 548, -1, -1, 551, 552, 553, 554, -1, 556, + 557, -1, -1, 560, 561, 562, 563, -1, 565, 566, + 567, -1, 569, 570, 571, 572, -1, -1, -1, -1, + -1, 578, 579, 580, -1, -1, -1, 584, 585, 586, + 587, -1, 589, 590, -1, 592, 593, -1, 595, 596, + -1, -1, 599, -1, -1, 602, -1, 604, -1, 606, + 607, -1, -1, -1, -1, -1, -1, 614, -1, -1, + 617, -1, -1, -1, 621, 622, 623, 624, 625, 626, + 627, -1, -1, -1, -1, -1, -1, 634, 635, -1, + 637, 638, 639, -1, 5, 642, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, + 657, 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, @@ -16566,61 +14898,761 @@ static const yytype_int16 yycheck[] = -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, - -1, -1, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, 150, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, 176, 177, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, -1, -1, 194, -1, -1, -1, 198, 199, 200, - 201, -1, 203, -1, 205, 206, 207, 208, 209, 210, - 211, -1, 213, -1, -1, 216, 217, 218, -1, 220, - -1, -1, -1, 224, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, 248, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, 265, 266, 267, -1, -1, 270, - -1, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, -1, -1, 295, 296, 297, 298, 299, 300, + -1, -1, 133, -1, 135, -1, -1, -1, -1, 140, + -1, 142, 143, 144, 145, 146, -1, -1, -1, -1, + 151, -1, -1, 154, 155, 156, -1, -1, -1, 160, + -1, 162, 163, -1, 165, 166, 167, -1, 169, 170, + -1, 172, 173, 174, 175, 176, 177, 178, -1, -1, + 181, 182, 183, 184, -1, -1, 187, 188, -1, 190, + 191, 192, -1, -1, 195, -1, -1, -1, 199, 200, + -1, 202, -1, 204, -1, 206, 207, 208, 209, 210, + 211, 212, -1, 214, -1, -1, 217, 218, 219, -1, + 221, -1, -1, -1, 225, 226, -1, -1, -1, 230, + 231, 232, 233, 234, -1, -1, -1, 238, 239, 240, + -1, -1, 243, -1, -1, -1, -1, 248, 249, -1, + -1, -1, 253, -1, 255, 256, -1, 258, 259, -1, + -1, -1, 263, -1, -1, 266, 267, 268, -1, -1, + 271, -1, -1, 274, 275, -1, -1, -1, -1, -1, + 281, 282, -1, 284, -1, 286, -1, 288, 289, -1, + -1, -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, 366, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, 382, 383, -1, -1, -1, -1, -1, -1, -1, - -1, 392, 393, 394, -1, -1, 397, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - -1, -1, 413, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, 448, -1, 450, - 451, 452, -1, -1, 455, -1, 457, -1, 459, 460, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, + 311, -1, 313, 314, 315, 316, -1, 318, 319, 320, + 321, -1, 323, 324, 325, -1, -1, -1, -1, 330, + 331, 332, 333, 334, 335, -1, -1, 338, 339, -1, + 341, -1, 343, -1, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, -1, -1, 357, -1, -1, 360, + 361, 362, 363, -1, -1, -1, 367, 368, -1, -1, + -1, 372, -1, 374, 375, 376, -1, 378, 379, 380, + 381, -1, 383, 384, -1, -1, -1, -1, -1, -1, + -1, -1, 393, 394, 395, -1, -1, 398, -1, 400, + -1, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, -1, -1, 414, 415, 416, -1, 418, -1, 420, + 421, 422, 423, 424, -1, 426, 427, 428, -1, -1, + 431, -1, -1, -1, 435, 436, 437, 438, 439, -1, + -1, 442, 443, 444, 445, 446, -1, 448, 449, -1, + 451, 452, 453, -1, -1, 456, -1, 458, -1, 460, + 461, -1, 463, 464, -1, 466, -1, 468, -1, -1, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, -1, 483, 484, -1, -1, -1, 488, 489, 490, - 491, -1, -1, -1, 495, -1, -1, -1, 499, -1, - 501, 502, 503, 504, 505, 506, -1, 508, 509, 510, - 511, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - 531, 532, -1, -1, -1, 536, -1, -1, 539, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, -1, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, 583, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, 594, 595, -1, -1, 598, -1, -1, - 601, -1, 603, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, 634, -1, 636, 637, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, + 481, 482, -1, 484, 485, -1, -1, -1, 489, 490, + 491, 492, -1, -1, -1, 496, -1, -1, -1, 500, + -1, 502, 503, 504, 505, 506, 507, -1, 509, 510, + 511, 512, 513, 514, -1, -1, -1, -1, -1, -1, + 521, 522, -1, 524, -1, -1, 527, -1, -1, -1, + 531, 532, 533, -1, -1, -1, 537, -1, -1, 540, + 541, -1, 543, 544, 545, 546, 547, 548, -1, -1, + 551, 552, 553, 554, -1, 556, 557, -1, -1, 560, + 561, 562, 563, -1, -1, 566, 567, -1, 569, 570, + 571, 572, -1, -1, -1, -1, -1, 578, 579, 580, + -1, -1, -1, 584, 585, 586, 587, -1, 589, 590, + -1, 592, 593, -1, 595, 596, -1, -1, 599, -1, + -1, 602, -1, 604, -1, 606, 607, -1, -1, -1, + -1, -1, -1, 614, -1, -1, 617, -1, -1, -1, + 621, 622, 623, 624, 625, 626, 627, -1, -1, -1, + -1, -1, -1, 634, 635, -1, 637, 638, 639, -1, + 5, 642, 7, 8, 9, 10, 11, 12, -1, -1, + 15, 652, -1, -1, 19, -1, -1, 22, -1, 24, + 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, + -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, + 45, 46, 47, -1, 49, -1, 51, 52, -1, -1, + 55, -1, -1, 58, 59, -1, 61, 62, -1, 64, + 65, -1, 67, 68, 69, 70, 71, 72, -1, 74, + 75, 76, 77, 78, 79, 80, -1, 82, 83, 84, + 85, 86, 87, 88, 89, -1, 91, 92, -1, 94, + 95, 96, 97, 98, -1, 100, -1, -1, 103, -1, + -1, 106, -1, 108, -1, -1, 111, -1, 113, -1, + -1, -1, 117, 118, 119, -1, -1, 122, -1, -1, + -1, -1, 127, 128, -1, -1, -1, -1, 133, -1, + 135, -1, -1, -1, -1, 140, -1, 142, 143, 144, + 145, 146, -1, -1, -1, -1, 151, -1, -1, 154, + 155, 156, -1, -1, -1, 160, -1, 162, 163, -1, + 165, 166, 167, -1, 169, 170, -1, 172, 173, 174, + 175, 176, 177, 178, -1, -1, 181, 182, 183, 184, + -1, -1, 187, 188, -1, 190, 191, 192, -1, -1, + 195, -1, -1, -1, 199, 200, -1, 202, -1, 204, + -1, 206, 207, 208, 209, 210, 211, 212, -1, 214, + -1, -1, 217, 218, 219, -1, 221, -1, -1, -1, + 225, 226, -1, -1, -1, 230, 231, 232, 233, 234, + -1, -1, -1, 238, 239, 240, -1, -1, 243, -1, + -1, -1, -1, 248, 249, -1, -1, -1, 253, -1, + 255, 256, -1, 258, 259, -1, -1, -1, 263, -1, + -1, 266, 267, 268, -1, -1, 271, -1, -1, 274, + 275, -1, -1, -1, -1, -1, 281, 282, -1, 284, + -1, 286, -1, 288, 289, -1, -1, -1, -1, -1, + -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, -1, 313, 314, + 315, 316, -1, 318, 319, 320, 321, -1, 323, 324, + 325, -1, -1, -1, -1, 330, 331, 332, 333, 334, + 335, -1, -1, 338, 339, -1, 341, -1, 343, -1, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + -1, -1, 357, -1, -1, 360, 361, 362, 363, -1, + -1, -1, 367, 368, -1, -1, -1, 372, -1, 374, + 375, 376, -1, 378, 379, 380, 381, -1, 383, 384, + -1, -1, -1, -1, -1, -1, -1, -1, 393, 394, + 395, -1, -1, 398, -1, 400, -1, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, -1, -1, 414, + 415, 416, -1, 418, -1, 420, 421, 422, 423, 424, + -1, 426, 427, 428, -1, -1, 431, -1, -1, -1, + 435, 436, 437, 438, 439, -1, -1, 442, 443, 444, + 445, 446, -1, 448, 449, -1, 451, 452, 453, -1, + -1, 456, -1, 458, -1, 460, 461, -1, 463, 464, + -1, 466, -1, 468, -1, -1, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, -1, 484, + 485, -1, -1, -1, 489, 490, 491, 492, -1, -1, + -1, 496, -1, -1, -1, 500, -1, 502, 503, 504, + 505, 506, 507, -1, 509, 510, 511, 512, 513, 514, + -1, -1, -1, -1, -1, -1, 521, 522, -1, 524, + -1, -1, 527, -1, -1, -1, 531, 532, 533, -1, + -1, -1, 537, -1, -1, 540, 541, -1, 543, 544, + 545, 546, 547, 548, -1, -1, 551, 552, 553, 554, + -1, 556, 557, -1, -1, 560, 561, 562, 563, -1, + -1, 566, 567, -1, 569, 570, 571, 572, -1, -1, + -1, -1, -1, 578, 579, 580, -1, -1, -1, 584, + 585, 586, 587, -1, 589, 590, -1, 592, 593, -1, + 595, 596, -1, -1, 599, -1, -1, 602, -1, 604, + -1, 606, 607, -1, -1, -1, -1, -1, -1, 614, + -1, -1, 617, -1, -1, -1, 621, 622, 623, 624, + 625, 626, 627, -1, -1, -1, -1, -1, -1, 634, + 635, -1, 637, 638, 639, -1, 5, 642, 7, 8, + 9, 10, 11, 12, -1, -1, 15, 652, -1, -1, + 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, + 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, + -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, + 49, -1, 51, 52, -1, -1, 55, -1, -1, 58, + 59, -1, 61, 62, -1, 64, 65, -1, 67, 68, + 69, 70, 71, 72, -1, 74, 75, 76, 77, 78, + 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, + 89, -1, 91, 92, -1, 94, 95, 96, 97, 98, + -1, 100, -1, -1, 103, -1, -1, 106, -1, 108, + -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, + 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, + -1, -1, -1, -1, 133, -1, 135, -1, -1, -1, + -1, 140, -1, 142, 143, 144, 145, 146, -1, -1, + -1, -1, 151, -1, -1, 154, 155, 156, -1, -1, + -1, 160, -1, 162, 163, -1, 165, 166, 167, -1, + 169, 170, -1, 172, 173, 174, 175, 176, 177, 178, + -1, -1, 181, 182, 183, 184, -1, -1, 187, 188, + -1, 190, 191, 192, -1, -1, 195, -1, -1, -1, + 199, 200, -1, 202, -1, 204, -1, 206, 207, 208, + 209, 210, 211, 212, -1, 214, -1, -1, 217, 218, + 219, -1, 221, -1, -1, -1, 225, 226, -1, -1, + -1, 230, 231, 232, 233, 234, -1, -1, -1, 238, + 239, 240, -1, -1, 243, -1, -1, -1, -1, 248, + 249, -1, -1, -1, 253, -1, 255, 256, -1, 258, + 259, -1, -1, -1, 263, -1, -1, 266, 267, 268, + -1, -1, 271, -1, -1, 274, 275, -1, -1, -1, + -1, -1, 281, 282, -1, 284, -1, 286, -1, 288, + 289, -1, -1, -1, -1, -1, -1, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, -1, 313, 314, 315, 316, -1, 318, + 319, 320, 321, -1, 323, 324, 325, -1, -1, -1, + -1, 330, 331, 332, 333, 334, 335, -1, -1, 338, + 339, -1, 341, -1, 343, -1, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, -1, -1, 357, -1, + -1, 360, 361, 362, 363, -1, -1, -1, 367, 368, + -1, -1, -1, 372, -1, 374, 375, 376, -1, 378, + 379, 380, 381, -1, 383, 384, -1, -1, -1, -1, + -1, -1, -1, -1, 393, 394, 395, -1, -1, 398, + -1, 400, -1, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, -1, 414, 415, 416, -1, 418, + -1, 420, 421, 422, 423, 424, -1, 426, 427, 428, + -1, -1, 431, -1, -1, -1, 435, 436, 437, 438, + 439, -1, -1, 442, 443, 444, 445, 446, -1, 448, + 449, -1, 451, 452, 453, -1, -1, 456, -1, 458, + -1, 460, 461, -1, 463, 464, -1, 466, -1, 468, + -1, -1, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, -1, 484, 485, -1, -1, -1, + 489, 490, 491, 492, -1, -1, -1, 496, -1, -1, + -1, 500, -1, 502, 503, 504, 505, 506, 507, -1, + 509, 510, 511, 512, 513, 514, -1, -1, -1, -1, + -1, -1, 521, 522, -1, 524, -1, -1, 527, -1, + -1, -1, 531, 532, 533, -1, -1, -1, 537, -1, + -1, 540, 541, -1, 543, 544, 545, 546, 547, 548, + -1, -1, 551, 552, 553, 554, -1, 556, 557, -1, + -1, 560, 561, 562, 563, -1, -1, 566, 567, -1, + 569, 570, 571, 572, -1, -1, -1, -1, -1, 578, + 579, 580, -1, -1, -1, 584, 585, 586, 587, -1, + 589, 590, -1, 592, 593, -1, 595, 596, -1, -1, + 599, -1, -1, 602, -1, 604, -1, 606, 607, -1, + -1, -1, -1, -1, -1, 614, -1, -1, 617, -1, + -1, -1, 621, 622, 623, 624, 625, 626, 627, -1, + -1, -1, -1, -1, -1, 634, 635, -1, 637, 638, + 639, -1, 5, 642, 7, 8, 9, 10, 11, 12, + -1, -1, 15, 652, -1, -1, 19, -1, -1, 22, + -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, + -1, 34, -1, -1, -1, 38, -1, -1, -1, 42, + -1, -1, 45, 46, 47, -1, 49, -1, 51, 52, + -1, -1, 55, -1, -1, 58, 59, -1, 61, 62, + -1, 64, 65, -1, 67, 68, 69, 70, 71, 72, + -1, 74, 75, 76, 77, 78, 79, 80, -1, 82, + 83, 84, 85, 86, 87, 88, 89, -1, 91, 92, + -1, 94, 95, 96, 97, 98, -1, 100, -1, -1, + 103, -1, -1, 106, -1, 108, -1, -1, 111, -1, + 113, -1, -1, -1, 117, 118, 119, -1, -1, 122, + -1, -1, -1, -1, 127, 128, -1, -1, -1, -1, + 133, -1, 135, -1, -1, -1, -1, 140, -1, 142, + 143, 144, 145, 146, -1, -1, -1, -1, 151, -1, + -1, 154, 155, 156, -1, -1, -1, 160, -1, 162, + 163, -1, 165, 166, 167, -1, 169, 170, -1, 172, + 173, 174, 175, 176, 177, 178, -1, -1, 181, 182, + 183, 184, -1, -1, 187, 188, -1, 190, 191, 192, + -1, -1, 195, -1, -1, -1, 199, 200, -1, 202, + -1, 204, -1, 206, 207, 208, 209, 210, 211, 212, + -1, 214, -1, -1, 217, 218, 219, -1, 221, -1, + -1, -1, 225, 226, -1, -1, -1, 230, 231, 232, + 233, 234, -1, -1, -1, 238, 239, 240, -1, -1, + 243, -1, -1, -1, -1, 248, 249, -1, -1, -1, + 253, -1, 255, 256, -1, 258, 259, -1, -1, -1, + 263, -1, -1, 266, 267, 268, -1, -1, 271, -1, + -1, 274, 275, -1, -1, -1, -1, -1, 281, 282, + -1, 284, -1, 286, -1, 288, 289, -1, -1, -1, + -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, -1, + 313, 314, 315, 316, -1, 318, 319, 320, 321, -1, + 323, 324, 325, -1, -1, -1, -1, 330, 331, 332, + 333, 334, 335, -1, -1, 338, 339, -1, 341, -1, + 343, -1, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, -1, -1, 357, -1, -1, 360, 361, 362, + 363, -1, -1, -1, 367, 368, -1, -1, -1, 372, + -1, 374, 375, 376, -1, 378, 379, 380, 381, -1, + 383, 384, -1, -1, -1, -1, -1, -1, -1, -1, + 393, 394, 395, -1, -1, 398, -1, 400, -1, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, + -1, 414, 415, 416, -1, 418, -1, 420, 421, 422, + 423, 424, -1, 426, 427, 428, -1, -1, 431, -1, + -1, -1, 435, 436, 437, 438, 439, -1, -1, 442, + 443, 444, 445, 446, -1, 448, 449, -1, 451, 452, + 453, -1, -1, 456, -1, 458, -1, 460, 461, -1, + 463, 464, -1, 466, -1, 468, -1, -1, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + -1, 484, 485, -1, -1, -1, 489, 490, 491, 492, + -1, -1, -1, 496, -1, -1, -1, 500, -1, 502, + 503, 504, 505, 506, 507, -1, 509, 510, 511, 512, + 513, 514, -1, -1, -1, -1, -1, -1, 521, 522, + -1, 524, -1, -1, 527, -1, -1, -1, 531, 532, + 533, -1, -1, -1, 537, -1, -1, 540, 541, -1, + 543, 544, 545, 546, 547, 548, -1, -1, 551, 552, + 553, 554, -1, 556, 557, -1, -1, 560, 561, 562, + 563, -1, -1, 566, 567, -1, 569, 570, 571, 572, + -1, -1, -1, -1, -1, 578, 579, 580, -1, -1, + -1, 584, 585, 586, 587, -1, 589, 590, -1, 592, + 593, -1, 595, 596, -1, -1, 599, -1, -1, 602, + -1, 604, -1, 606, 607, -1, -1, -1, -1, -1, + -1, 614, -1, -1, 617, -1, -1, -1, 621, 622, + 623, 624, 625, 626, 627, -1, -1, -1, -1, -1, + -1, 634, 635, -1, 637, 638, 639, -1, 5, 642, + 7, 8, 9, 10, 11, 12, -1, -1, 15, 652, + -1, -1, 19, -1, -1, 22, -1, 24, 25, 26, + 27, 28, 29, 30, 31, 32, -1, 34, -1, -1, + 37, 38, -1, -1, -1, 42, -1, -1, 45, 46, + 47, -1, 49, -1, 51, 52, -1, -1, 55, -1, + -1, 58, 59, -1, 61, 62, -1, 64, 65, -1, + 67, 68, 69, 70, 71, 72, -1, 74, 75, 76, + 77, 78, 79, 80, -1, 82, 83, 84, 85, 86, + 87, 88, 89, -1, 91, 92, -1, 94, 95, 96, + 97, 98, -1, 100, -1, -1, 103, -1, -1, 106, + -1, 108, -1, -1, 111, -1, 113, -1, -1, -1, + 117, 118, 119, -1, -1, 122, -1, -1, -1, -1, + 127, 128, -1, -1, -1, 132, 133, -1, 135, -1, + -1, -1, -1, 140, -1, 142, 143, 144, 145, 146, + -1, -1, -1, -1, 151, -1, -1, 154, 155, 156, + -1, -1, -1, 160, -1, 162, 163, -1, 165, 166, + 167, -1, 169, 170, -1, 172, 173, 174, 175, 176, + 177, 178, -1, -1, 181, 182, 183, 184, -1, -1, + 187, 188, -1, 190, 191, 192, -1, -1, 195, -1, + -1, -1, 199, 200, -1, 202, -1, 204, -1, 206, + 207, 208, 209, 210, 211, 212, -1, 214, -1, -1, + 217, 218, 219, -1, 221, -1, -1, -1, 225, 226, + -1, -1, -1, 230, 231, 232, 233, 234, -1, -1, + -1, 238, 239, 240, -1, -1, 243, -1, -1, -1, + -1, 248, 249, -1, -1, -1, 253, -1, 255, 256, + -1, 258, 259, -1, -1, -1, 263, -1, -1, 266, + 267, 268, -1, -1, 271, -1, -1, 274, 275, 276, + -1, -1, -1, -1, 281, 282, -1, 284, -1, 286, + -1, 288, 289, -1, -1, -1, -1, -1, -1, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, -1, 313, 314, 315, 316, + -1, 318, 319, 320, 321, -1, 323, 324, 325, -1, + -1, -1, -1, 330, 331, 332, 333, 334, 335, -1, + -1, 338, 339, -1, 341, -1, 343, -1, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, -1, -1, + 357, -1, -1, 360, 361, 362, 363, -1, -1, -1, + 367, 368, -1, -1, -1, 372, -1, 374, 375, 376, + -1, 378, 379, 380, 381, -1, 383, 384, -1, -1, + -1, -1, -1, -1, -1, -1, 393, 394, 395, -1, + -1, 398, -1, 400, -1, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, -1, -1, 414, 415, 416, + -1, 418, -1, 420, 421, 422, 423, 424, -1, 426, + 427, 428, -1, -1, 431, -1, -1, -1, 435, 436, + 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, + -1, 448, 449, -1, 451, 452, 453, -1, -1, 456, + -1, 458, -1, 460, 461, -1, 463, 464, -1, 466, + -1, 468, -1, -1, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, -1, 484, 485, -1, + -1, -1, 489, 490, 491, 492, -1, -1, 495, 496, + -1, -1, -1, 500, -1, 502, 503, 504, 505, 506, + 507, -1, 509, 510, 511, 512, 513, 514, -1, -1, + -1, -1, -1, -1, 521, 522, -1, 524, -1, -1, + 527, -1, -1, -1, 531, 532, 533, -1, -1, -1, + 537, -1, -1, 540, 541, -1, 543, 544, 545, 546, + 547, 548, -1, -1, 551, 552, 553, 554, -1, 556, + 557, -1, -1, 560, 561, 562, 563, -1, 565, 566, + 567, -1, 569, 570, 571, 572, -1, -1, -1, -1, + -1, 578, 579, 580, -1, -1, -1, 584, 585, 586, + 587, -1, 589, 590, -1, 592, 593, -1, 595, 596, + -1, -1, 599, -1, -1, 602, -1, 604, -1, 606, + 607, -1, -1, -1, -1, -1, -1, 614, -1, -1, + 617, -1, -1, -1, 621, 622, 623, 624, 625, 626, + 627, -1, -1, -1, -1, -1, -1, 634, 635, -1, + 637, 638, 639, -1, -1, 642, -1, 5, 645, 7, + 8, 9, 10, 11, 12, 13, 14, 15, -1, -1, + -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, + 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, + -1, 49, -1, 51, 52, -1, -1, 55, -1, -1, + 58, 59, -1, 61, 62, -1, 64, 65, -1, 67, + 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, + 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, + 88, 89, -1, 91, 92, -1, 94, 95, 96, 97, + 98, -1, 100, -1, -1, 103, 104, -1, 106, -1, + 108, -1, 110, 111, -1, 113, -1, -1, -1, 117, + 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, + 128, -1, -1, -1, -1, 133, -1, 135, 136, -1, + -1, -1, 140, -1, 142, 143, 144, 145, 146, -1, + -1, -1, -1, 151, 152, -1, 154, 155, 156, -1, + -1, -1, 160, -1, 162, 163, -1, 165, 166, 167, + -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, + 178, -1, -1, 181, 182, 183, 184, -1, -1, 187, + 188, -1, 190, 191, 192, -1, -1, 195, -1, -1, + -1, 199, 200, -1, 202, -1, 204, -1, 206, 207, + 208, 209, 210, 211, 212, 213, 214, -1, -1, 217, + 218, 219, -1, 221, -1, -1, -1, 225, 226, -1, + -1, -1, 230, 231, 232, 233, 234, -1, -1, -1, + 238, 239, 240, 241, -1, 243, -1, -1, -1, 247, + 248, 249, -1, -1, -1, 253, -1, 255, 256, -1, + 258, 259, -1, -1, -1, 263, -1, -1, 266, 267, + 268, -1, -1, 271, -1, -1, 274, 275, 276, -1, + -1, -1, -1, 281, 282, -1, 284, -1, 286, 287, + 288, 289, -1, -1, -1, -1, -1, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, -1, 313, 314, 315, 316, -1, + 318, 319, 320, 321, -1, 323, 324, 325, -1, -1, + -1, -1, 330, 331, 332, 333, 334, 335, -1, -1, + 338, 339, -1, 341, -1, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, -1, -1, 357, + -1, -1, 360, 361, 362, 363, -1, -1, -1, 367, + 368, -1, -1, -1, 372, -1, 374, 375, 376, -1, + 378, 379, 380, 381, -1, 383, 384, -1, -1, -1, + -1, -1, -1, -1, -1, 393, 394, 395, -1, -1, + 398, -1, 400, -1, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, 416, -1, + 418, -1, 420, 421, 422, 423, 424, -1, 426, 427, + 428, -1, -1, 431, -1, -1, -1, 435, 436, 437, + 438, 439, 440, -1, 442, 443, 444, 445, 446, -1, + 448, 449, -1, 451, 452, 453, -1, -1, 456, -1, + 458, -1, 460, 461, -1, 463, 464, -1, 466, -1, + 468, -1, -1, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, -1, 484, 485, 486, -1, + -1, 489, 490, 491, 492, -1, -1, -1, 496, -1, + -1, 499, 500, -1, 502, 503, 504, 505, 506, 507, + -1, 509, 510, 511, 512, 513, 514, -1, -1, -1, + -1, -1, -1, 521, 522, -1, 524, -1, -1, 527, + -1, -1, -1, 531, 532, 533, -1, -1, -1, 537, + -1, -1, 540, 541, -1, 543, 544, 545, 546, 547, + 548, -1, -1, 551, 552, 553, 554, -1, 556, 557, + -1, -1, 560, 561, 562, 563, -1, 565, 566, 567, + -1, 569, 570, 571, 572, -1, -1, -1, -1, -1, + 578, 579, 580, 581, -1, -1, 584, 585, 586, 587, + -1, 589, 590, -1, 592, 593, -1, 595, 596, -1, + -1, 599, -1, -1, 602, 603, 604, 605, 606, 607, + -1, -1, -1, -1, -1, -1, 614, -1, -1, 617, + -1, -1, -1, 621, 622, 623, 624, 625, 626, 627, + -1, -1, -1, -1, -1, -1, 634, 635, -1, 637, + 638, 639, -1, 5, 642, 7, 8, 9, 10, 11, + 12, 13, 14, 15, -1, -1, -1, 19, -1, -1, + 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, 34, -1, -1, -1, 38, -1, -1, -1, + 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, + 52, -1, -1, 55, -1, -1, 58, 59, -1, 61, + 62, -1, 64, 65, -1, 67, 68, 69, 70, 71, + 72, -1, 74, 75, 76, 77, 78, 79, 80, -1, + 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, + 92, -1, 94, 95, 96, 97, 98, -1, 100, -1, + -1, 103, 104, -1, 106, -1, 108, -1, 110, 111, + -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, + 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, + -1, 133, -1, 135, 136, -1, -1, -1, 140, -1, + 142, 143, 144, 145, 146, -1, -1, -1, -1, 151, + 152, -1, 154, 155, 156, -1, -1, -1, 160, -1, + 162, 163, -1, 165, 166, 167, -1, 169, 170, -1, + 172, 173, 174, 175, 176, 177, 178, -1, -1, 181, + 182, 183, 184, -1, -1, 187, 188, -1, 190, 191, + 192, -1, -1, 195, -1, -1, -1, 199, 200, -1, + 202, -1, 204, -1, 206, 207, 208, 209, 210, 211, + 212, 213, 214, -1, -1, 217, 218, 219, -1, 221, + -1, -1, -1, 225, 226, -1, -1, -1, 230, 231, + 232, 233, 234, -1, -1, -1, 238, 239, 240, 241, + -1, 243, -1, -1, -1, 247, 248, 249, -1, -1, + -1, 253, -1, 255, 256, -1, 258, 259, -1, -1, + -1, 263, -1, -1, 266, 267, 268, -1, -1, 271, + -1, -1, 274, 275, 276, -1, -1, -1, -1, 281, + 282, -1, 284, -1, 286, 287, 288, 289, -1, -1, + -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + -1, 313, 314, 315, 316, -1, 318, 319, 320, 321, + -1, 323, 324, 325, -1, -1, -1, -1, 330, 331, + 332, 333, 334, 335, -1, -1, 338, 339, -1, 341, + -1, 343, -1, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, -1, -1, 357, -1, -1, 360, 361, + 362, 363, -1, -1, -1, 367, 368, -1, -1, -1, + 372, -1, 374, 375, 376, -1, 378, 379, 380, 381, + -1, 383, 384, -1, -1, -1, -1, -1, -1, -1, + -1, 393, 394, 395, -1, -1, 398, -1, 400, -1, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + -1, -1, 414, 415, 416, -1, 418, -1, 420, 421, + 422, 423, 424, -1, 426, 427, 428, -1, -1, 431, + -1, -1, -1, 435, 436, 437, 438, 439, 440, -1, + 442, 443, 444, 445, 446, -1, 448, 449, -1, 451, + 452, 453, -1, -1, 456, -1, 458, -1, 460, 461, + -1, 463, 464, -1, 466, -1, 468, -1, -1, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, -1, 484, 485, 486, -1, -1, 489, 490, 491, + 492, -1, -1, -1, 496, -1, -1, 499, 500, -1, + 502, 503, 504, 505, 506, 507, -1, 509, 510, 511, + 512, 513, 514, -1, -1, -1, -1, -1, -1, 521, + 522, -1, 524, -1, -1, 527, -1, -1, -1, 531, + 532, 533, -1, -1, -1, 537, -1, -1, 540, 541, + -1, 543, 544, 545, 546, 547, 548, -1, -1, 551, + 552, 553, 554, -1, 556, 557, -1, -1, 560, 561, + 562, 563, -1, 565, 566, 567, -1, 569, 570, 571, + 572, -1, -1, -1, -1, -1, 578, 579, 580, 581, + -1, -1, 584, 585, 586, 587, -1, 589, 590, -1, + 592, 593, -1, 595, 596, -1, -1, 599, -1, -1, + 602, 603, 604, 605, 606, 607, -1, -1, -1, -1, + -1, -1, 614, -1, -1, 617, -1, -1, -1, 621, + 622, 623, 624, 625, 626, 627, -1, -1, -1, -1, + -1, -1, 634, 635, -1, 637, 638, 639, -1, 5, + 642, 7, 8, 9, 10, 11, 12, -1, -1, 15, + -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, + 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, + -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, + 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, + -1, -1, 58, 59, -1, 61, 62, -1, 64, 65, + -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, + 76, 77, 78, 79, 80, -1, 82, 83, 84, 85, + 86, 87, 88, 89, -1, 91, 92, -1, 94, 95, + 96, 97, 98, -1, 100, -1, -1, 103, -1, -1, + 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, + -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, + -1, 127, 128, 129, -1, -1, -1, 133, -1, 135, + -1, -1, -1, -1, 140, -1, 142, 143, 144, 145, + 146, -1, -1, -1, -1, 151, -1, -1, 154, 155, + 156, -1, -1, -1, 160, -1, 162, 163, -1, 165, + 166, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, 178, -1, -1, 181, 182, 183, 184, -1, + -1, 187, 188, -1, 190, 191, 192, 193, -1, 195, + -1, -1, -1, 199, 200, -1, 202, -1, 204, -1, + 206, 207, 208, 209, 210, 211, 212, -1, 214, -1, + -1, 217, 218, 219, -1, 221, 222, -1, -1, 225, + 226, -1, -1, -1, 230, 231, 232, 233, 234, -1, + -1, -1, 238, 239, 240, -1, -1, 243, -1, -1, + -1, -1, 248, 249, -1, -1, -1, 253, -1, 255, + 256, -1, 258, 259, -1, -1, -1, 263, -1, -1, + 266, 267, 268, -1, -1, 271, -1, -1, 274, 275, + -1, -1, -1, -1, -1, 281, 282, -1, 284, -1, + 286, -1, 288, 289, -1, -1, 292, -1, -1, -1, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, -1, 313, 314, 315, + 316, -1, 318, 319, 320, 321, -1, 323, 324, 325, + -1, -1, -1, -1, 330, 331, 332, 333, 334, 335, + -1, -1, 338, 339, -1, 341, -1, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, -1, + -1, 357, -1, -1, 360, 361, 362, 363, 364, 365, + -1, 367, 368, -1, -1, 371, 372, -1, 374, 375, + 376, -1, 378, 379, 380, 381, -1, 383, 384, -1, + -1, -1, -1, -1, -1, -1, -1, 393, 394, 395, + -1, -1, 398, -1, 400, -1, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + 416, -1, 418, -1, 420, 421, 422, 423, 424, -1, + 426, 427, 428, -1, -1, 431, -1, -1, -1, 435, + 436, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, -1, 451, 452, 453, -1, -1, + 456, -1, 458, -1, 460, 461, -1, 463, 464, -1, + 466, -1, 468, -1, -1, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, -1, 484, 485, + -1, -1, -1, 489, 490, 491, 492, -1, -1, -1, + 496, -1, -1, -1, 500, -1, 502, 503, 504, 505, + 506, 507, -1, 509, 510, 511, 512, 513, 514, -1, + -1, 517, 518, 519, -1, 521, 522, -1, 524, -1, + -1, 527, -1, -1, -1, 531, 532, 533, -1, -1, + -1, 537, -1, -1, 540, 541, -1, 543, 544, 545, + 546, 547, 548, -1, -1, 551, 552, 553, 554, -1, + 556, 557, -1, -1, 560, 561, 562, 563, -1, -1, + 566, 567, -1, 569, 570, 571, 572, -1, -1, -1, + -1, -1, 578, 579, 580, -1, -1, -1, 584, 585, + 586, 587, 588, 589, 590, -1, 592, 593, -1, 595, + 596, -1, -1, 599, -1, -1, 602, -1, 604, -1, + 606, 607, -1, -1, -1, -1, -1, -1, 614, -1, + -1, 617, -1, -1, -1, 621, 622, 623, 624, 625, + 626, 627, -1, -1, -1, -1, -1, -1, 634, 635, + -1, 637, 638, 639, -1, 5, 642, 7, 8, 9, + 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, + -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, + -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, + -1, 51, 52, -1, -1, 55, -1, -1, 58, 59, + -1, 61, 62, -1, 64, 65, -1, 67, 68, 69, + 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, + 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, + -1, 91, 92, -1, 94, 95, 96, 97, 98, -1, + 100, -1, -1, 103, -1, -1, 106, -1, 108, -1, + -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, + -1, -1, 122, -1, -1, -1, -1, 127, 128, 129, + -1, -1, 132, 133, -1, 135, -1, -1, -1, -1, + 140, -1, 142, 143, 144, 145, 146, -1, -1, -1, + -1, 151, -1, -1, 154, 155, 156, -1, -1, -1, + 160, -1, 162, 163, -1, 165, 166, 167, -1, 169, + 170, -1, 172, 173, 174, 175, 176, 177, 178, -1, + -1, 181, 182, 183, 184, -1, -1, 187, 188, -1, + 190, 191, 192, 193, -1, 195, -1, -1, -1, 199, + 200, -1, 202, -1, 204, -1, 206, 207, 208, 209, + 210, 211, 212, -1, 214, -1, -1, 217, 218, 219, + -1, 221, 222, -1, -1, 225, 226, -1, -1, -1, + 230, 231, 232, 233, 234, -1, -1, -1, 238, 239, + 240, -1, -1, 243, -1, -1, -1, -1, 248, 249, + -1, -1, -1, 253, -1, 255, 256, -1, 258, 259, + -1, -1, -1, 263, -1, -1, 266, 267, 268, -1, + -1, 271, -1, -1, 274, 275, -1, -1, -1, -1, + -1, 281, 282, -1, 284, -1, 286, -1, 288, 289, + -1, -1, 292, -1, -1, -1, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, -1, 313, 314, 315, 316, -1, 318, 319, + 320, 321, -1, 323, 324, 325, -1, -1, -1, -1, + 330, 331, 332, 333, 334, 335, -1, -1, 338, 339, + -1, 341, -1, 343, -1, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, -1, -1, 357, -1, -1, + 360, 361, 362, 363, -1, -1, -1, 367, 368, -1, + -1, 371, 372, -1, 374, 375, 376, -1, 378, 379, + 380, 381, -1, 383, 384, -1, -1, -1, -1, -1, + -1, -1, -1, 393, 394, 395, -1, -1, 398, -1, + 400, -1, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, -1, 414, 415, 416, -1, 418, -1, + 420, 421, 422, 423, 424, -1, 426, 427, 428, -1, + -1, 431, -1, -1, -1, 435, 436, 437, 438, 439, + -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, + -1, 451, 452, 453, -1, -1, 456, -1, 458, -1, + 460, 461, -1, 463, 464, -1, 466, -1, 468, -1, + -1, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, -1, 484, 485, -1, -1, -1, 489, + 490, 491, 492, -1, -1, -1, 496, -1, -1, -1, + 500, -1, 502, 503, 504, 505, 506, 507, -1, 509, + 510, 511, 512, 513, 514, -1, -1, -1, -1, -1, + -1, 521, 522, -1, 524, -1, -1, 527, -1, -1, + -1, 531, 532, 533, -1, -1, -1, 537, -1, -1, + 540, 541, -1, 543, 544, 545, 546, 547, 548, -1, + -1, 551, 552, 553, 554, -1, 556, 557, -1, -1, + 560, 561, 562, 563, -1, 565, 566, 567, -1, 569, + 570, 571, 572, -1, -1, -1, -1, -1, 578, 579, + 580, -1, -1, -1, 584, 585, 586, 587, 588, 589, + 590, -1, 592, 593, -1, 595, 596, -1, -1, 599, + -1, -1, 602, -1, 604, -1, 606, 607, -1, -1, + -1, -1, -1, -1, 614, -1, -1, 617, -1, -1, + -1, 621, 622, 623, 624, 625, 626, 627, -1, -1, + -1, -1, -1, -1, 634, 635, -1, 637, 638, 639, + -1, 5, 642, 7, 8, 9, 10, 11, 12, -1, + -1, 15, -1, -1, -1, 19, -1, -1, 22, -1, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, + -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, + -1, 55, -1, -1, 58, 59, -1, 61, 62, -1, + 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, + 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, + 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, + 94, 95, 96, 97, 98, -1, 100, -1, -1, 103, + -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, + -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, + -1, -1, -1, 127, 128, 129, -1, -1, 132, 133, + -1, 135, -1, -1, -1, -1, 140, -1, 142, 143, + 144, 145, 146, -1, -1, -1, -1, 151, -1, -1, + 154, 155, 156, -1, -1, -1, 160, -1, 162, 163, + -1, 165, 166, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, 178, -1, -1, 181, 182, 183, + 184, -1, -1, 187, 188, -1, 190, 191, 192, 193, + -1, 195, -1, -1, -1, 199, 200, -1, 202, -1, + 204, -1, 206, 207, 208, 209, 210, 211, 212, -1, + 214, -1, -1, 217, 218, 219, -1, 221, 222, -1, + -1, 225, 226, -1, -1, -1, 230, 231, 232, 233, + 234, -1, -1, -1, 238, 239, 240, -1, -1, 243, + -1, -1, -1, -1, 248, 249, -1, -1, -1, 253, + -1, 255, 256, -1, 258, 259, -1, -1, -1, 263, + -1, -1, 266, 267, 268, -1, -1, 271, -1, -1, + 274, 275, -1, -1, -1, -1, -1, 281, 282, -1, + 284, -1, 286, -1, 288, 289, -1, -1, 292, -1, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, -1, 313, + 314, 315, 316, -1, 318, 319, 320, 321, -1, 323, + 324, 325, -1, -1, -1, -1, 330, 331, 332, 333, + 334, 335, -1, -1, 338, 339, -1, 341, -1, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, -1, -1, 357, -1, -1, 360, 361, 362, 363, + -1, -1, -1, 367, 368, -1, -1, 371, 372, -1, + 374, 375, 376, -1, 378, 379, 380, 381, -1, 383, + 384, -1, -1, -1, -1, -1, -1, -1, -1, 393, + 394, 395, -1, -1, 398, -1, 400, -1, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, 416, -1, 418, -1, 420, 421, 422, 423, + 424, -1, 426, 427, 428, -1, -1, 431, -1, -1, + -1, 435, 436, 437, 438, 439, -1, -1, 442, 443, + 444, 445, 446, -1, 448, 449, -1, 451, 452, 453, + -1, -1, 456, -1, 458, -1, 460, 461, -1, 463, + 464, -1, 466, -1, 468, -1, -1, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, -1, + 484, 485, -1, -1, -1, 489, 490, 491, 492, -1, + -1, -1, 496, -1, -1, -1, 500, -1, 502, 503, + 504, 505, 506, 507, -1, 509, 510, 511, 512, 513, + 514, -1, -1, -1, -1, -1, -1, 521, 522, -1, + 524, -1, -1, 527, -1, -1, -1, 531, 532, 533, + -1, -1, -1, 537, -1, -1, 540, 541, -1, 543, + 544, 545, 546, 547, 548, -1, -1, 551, 552, 553, + 554, -1, 556, 557, -1, -1, 560, 561, 562, 563, + -1, 565, 566, 567, -1, 569, 570, 571, 572, -1, + -1, -1, -1, -1, 578, 579, 580, -1, -1, -1, + 584, 585, 586, 587, 588, 589, 590, -1, 592, 593, + -1, 595, 596, -1, -1, 599, -1, -1, 602, -1, + 604, -1, 606, 607, -1, -1, -1, -1, -1, -1, + 614, -1, -1, 617, -1, -1, -1, 621, 622, 623, + 624, 625, 626, 627, -1, -1, -1, -1, -1, -1, + 634, 635, -1, 637, 638, 639, -1, 5, 642, 7, + 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, + -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, + 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, + -1, 49, -1, 51, 52, -1, -1, 55, -1, -1, + 58, 59, -1, 61, 62, -1, 64, 65, -1, 67, + 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, + 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, + 88, 89, -1, 91, 92, -1, 94, 95, 96, 97, + 98, -1, 100, -1, -1, 103, -1, -1, 106, -1, + 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, + 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, + 128, 129, -1, -1, 132, 133, -1, 135, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, 146, -1, + -1, -1, -1, 151, -1, -1, 154, 155, 156, -1, + -1, -1, 160, -1, 162, 163, -1, 165, 166, 167, + -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, + 178, -1, -1, 181, 182, 183, 184, -1, -1, 187, + 188, -1, 190, 191, 192, 193, -1, 195, -1, -1, + -1, 199, 200, -1, 202, -1, 204, -1, 206, 207, + 208, 209, 210, 211, 212, -1, 214, -1, -1, 217, + 218, 219, -1, 221, 222, -1, -1, 225, 226, -1, + -1, -1, 230, 231, 232, 233, 234, -1, -1, -1, + 238, 239, 240, -1, -1, 243, -1, -1, -1, -1, + 248, 249, -1, -1, -1, 253, -1, 255, 256, -1, + 258, 259, -1, -1, -1, 263, -1, -1, 266, 267, + 268, -1, -1, 271, -1, -1, 274, 275, -1, -1, + -1, -1, -1, 281, 282, -1, 284, -1, 286, -1, + 288, 289, -1, -1, 292, -1, -1, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, -1, 313, 314, 315, 316, -1, + 318, 319, 320, 321, -1, 323, 324, 325, -1, -1, + -1, -1, 330, 331, 332, 333, 334, 335, -1, -1, + 338, 339, -1, 341, -1, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, -1, -1, 357, + -1, -1, 360, 361, 362, 363, -1, -1, -1, 367, + 368, -1, -1, 371, 372, -1, 374, 375, 376, -1, + 378, 379, 380, 381, -1, 383, 384, -1, -1, -1, + -1, -1, -1, -1, -1, 393, 394, 395, -1, -1, + 398, -1, 400, -1, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, 416, -1, + 418, -1, 420, 421, 422, 423, 424, -1, 426, 427, + 428, -1, -1, 431, -1, -1, -1, 435, 436, 437, + 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, + 448, 449, -1, 451, 452, 453, -1, -1, 456, -1, + 458, -1, 460, 461, -1, 463, 464, -1, 466, -1, + 468, -1, -1, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, -1, 484, 485, -1, -1, + -1, 489, 490, 491, 492, -1, -1, -1, 496, -1, + -1, -1, 500, -1, 502, 503, 504, 505, 506, 507, + -1, 509, 510, 511, 512, 513, 514, -1, -1, -1, + -1, -1, -1, 521, 522, -1, 524, -1, -1, 527, + -1, -1, -1, 531, 532, 533, -1, -1, -1, 537, + -1, -1, 540, 541, -1, 543, 544, 545, 546, 547, + 548, -1, -1, 551, 552, 553, 554, -1, 556, 557, + -1, -1, 560, 561, 562, 563, -1, 565, 566, 567, + -1, 569, 570, 571, 572, -1, -1, -1, -1, -1, + 578, 579, 580, -1, -1, -1, 584, 585, 586, 587, + 588, 589, 590, -1, 592, 593, -1, 595, 596, -1, + -1, 599, -1, -1, 602, -1, 604, -1, 606, 607, + -1, -1, -1, -1, -1, -1, 614, -1, -1, 617, + -1, -1, -1, 621, 622, 623, 624, 625, 626, 627, + -1, -1, -1, -1, -1, -1, 634, 635, -1, 637, + 638, 639, -1, 5, 642, 7, 8, 9, 10, 11, + 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, + 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, 34, -1, -1, -1, 38, -1, -1, -1, + 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, + 52, -1, -1, 55, -1, -1, 58, 59, -1, 61, + 62, -1, 64, 65, -1, 67, 68, 69, 70, 71, + 72, -1, 74, 75, 76, 77, 78, 79, 80, -1, + 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, + 92, -1, 94, 95, 96, 97, 98, -1, 100, -1, + -1, 103, -1, -1, 106, -1, 108, 109, 110, 111, + -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, + 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, + -1, 133, -1, 135, -1, -1, -1, -1, 140, -1, + 142, 143, 144, 145, 146, -1, -1, -1, -1, 151, + -1, -1, 154, 155, 156, -1, -1, -1, 160, -1, + 162, 163, -1, 165, 166, 167, -1, 169, 170, -1, + 172, 173, 174, 175, 176, 177, 178, -1, -1, 181, + 182, 183, 184, -1, -1, 187, 188, -1, 190, 191, + 192, -1, -1, 195, -1, -1, -1, 199, 200, -1, + 202, -1, 204, -1, 206, 207, 208, 209, 210, 211, + 212, -1, 214, -1, -1, 217, 218, 219, -1, 221, + -1, -1, -1, 225, 226, -1, -1, -1, 230, 231, + 232, 233, 234, -1, -1, -1, 238, 239, 240, -1, + -1, 243, -1, -1, -1, -1, 248, 249, -1, -1, + -1, 253, -1, 255, 256, -1, 258, 259, -1, -1, + -1, 263, -1, -1, 266, 267, 268, -1, -1, 271, + -1, -1, 274, 275, 276, -1, -1, -1, -1, 281, + 282, -1, 284, -1, 286, -1, 288, 289, -1, -1, + -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + -1, 313, 314, 315, 316, -1, 318, 319, 320, 321, + -1, 323, 324, 325, -1, -1, -1, -1, 330, 331, + 332, 333, 334, 335, -1, -1, 338, 339, -1, 341, + -1, 343, -1, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, -1, -1, 357, -1, -1, 360, 361, + 362, 363, -1, -1, -1, 367, 368, -1, -1, -1, + 372, -1, 374, 375, 376, -1, 378, 379, 380, 381, + -1, 383, 384, -1, -1, -1, -1, -1, -1, -1, + -1, 393, 394, 395, -1, -1, 398, -1, 400, -1, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + -1, -1, 414, 415, 416, -1, 418, -1, 420, 421, + 422, 423, 424, -1, 426, 427, 428, -1, -1, 431, + -1, -1, -1, 435, 436, 437, 438, 439, -1, -1, + 442, 443, 444, 445, 446, -1, 448, 449, -1, 451, + 452, 453, -1, -1, 456, -1, 458, -1, 460, 461, + -1, 463, 464, -1, 466, -1, 468, -1, -1, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, -1, 484, 485, -1, -1, -1, 489, 490, 491, + 492, -1, -1, -1, 496, -1, -1, -1, 500, -1, + 502, 503, 504, 505, 506, 507, -1, 509, 510, 511, + 512, 513, 514, -1, -1, -1, -1, -1, -1, 521, + 522, -1, 524, -1, -1, 527, -1, -1, -1, 531, + 532, 533, -1, -1, -1, 537, -1, -1, 540, 541, + -1, 543, 544, 545, 546, 547, 548, -1, -1, 551, + 552, 553, 554, -1, 556, 557, -1, -1, 560, 561, + 562, 563, -1, 565, 566, 567, -1, 569, 570, 571, + 572, -1, -1, -1, -1, -1, 578, 579, 580, -1, + -1, -1, 584, 585, 586, 587, -1, 589, 590, -1, + 592, 593, -1, 595, 596, -1, -1, 599, -1, -1, + 602, -1, 604, -1, 606, 607, -1, -1, -1, -1, + -1, -1, 614, -1, -1, 617, -1, -1, -1, 621, + 622, 623, 624, 625, 626, 627, -1, -1, -1, -1, + -1, -1, 634, 635, -1, 637, 638, 639, -1, 5, + 642, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, - -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, + -1, 37, 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, @@ -16630,121 +15662,312 @@ static const yytype_int16 yycheck[] = 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, 132, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, -1, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, -1, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, -1, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, -1, -1, 295, + -1, -1, -1, -1, 140, -1, 142, 143, 144, 145, + 146, -1, -1, -1, -1, 151, -1, -1, 154, 155, + 156, -1, -1, -1, 160, -1, 162, 163, -1, 165, + 166, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, 178, -1, -1, 181, 182, 183, 184, -1, + -1, 187, 188, -1, 190, 191, 192, -1, -1, 195, + -1, -1, -1, 199, 200, -1, 202, -1, 204, -1, + 206, 207, 208, 209, 210, 211, 212, -1, 214, -1, + -1, 217, 218, 219, -1, 221, -1, -1, -1, 225, + 226, -1, -1, -1, 230, 231, 232, 233, 234, -1, + -1, -1, 238, 239, 240, -1, -1, 243, -1, -1, + -1, -1, 248, 249, -1, -1, -1, 253, -1, 255, + 256, -1, 258, 259, -1, -1, -1, 263, -1, -1, + 266, 267, 268, -1, -1, 271, -1, -1, 274, 275, + 276, -1, -1, -1, -1, 281, 282, -1, 284, -1, + 286, -1, 288, 289, -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, -1, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, -1, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, - 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, - 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, - -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, 97, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, - -1, 132, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, 150, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, 176, 177, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, -1, -1, 194, -1, -1, -1, 198, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, 210, - 211, -1, 213, -1, -1, 216, 217, 218, -1, 220, - -1, -1, -1, 224, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, 248, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, 265, 266, 267, -1, -1, 270, - -1, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, -1, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, 366, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, 382, 383, -1, -1, -1, -1, -1, -1, -1, - -1, 392, 393, 394, -1, -1, 397, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - -1, -1, 413, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, 448, -1, 450, - 451, 452, -1, -1, 455, -1, 457, -1, 459, 460, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, -1, 483, 484, -1, -1, -1, 488, 489, 490, - 491, -1, -1, -1, 495, -1, -1, -1, 499, -1, - 501, 502, 503, 504, 505, 506, -1, 508, 509, 510, - 511, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - 531, 532, -1, -1, -1, 536, -1, -1, 539, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, -1, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, 583, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, 594, 595, -1, -1, 598, -1, -1, - 601, -1, 603, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, 634, -1, 636, 637, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, + 306, 307, 308, 309, 310, 311, -1, 313, 314, 315, + 316, -1, 318, 319, 320, 321, -1, 323, 324, 325, + -1, -1, -1, -1, 330, 331, 332, 333, 334, 335, + -1, -1, 338, 339, -1, 341, -1, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, -1, + -1, 357, -1, -1, 360, 361, 362, 363, -1, -1, + -1, 367, 368, -1, -1, -1, 372, -1, 374, 375, + 376, -1, 378, 379, 380, 381, -1, 383, 384, -1, + -1, -1, -1, -1, -1, -1, -1, 393, 394, 395, + -1, -1, 398, -1, 400, -1, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + 416, -1, 418, -1, 420, 421, 422, 423, 424, -1, + 426, 427, 428, -1, -1, 431, -1, -1, -1, 435, + 436, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, -1, 451, 452, 453, -1, -1, + 456, -1, 458, -1, 460, 461, -1, 463, 464, -1, + 466, -1, 468, -1, -1, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, -1, 484, 485, + -1, -1, -1, 489, 490, 491, 492, -1, -1, -1, + 496, -1, -1, -1, 500, -1, 502, 503, 504, 505, + 506, 507, -1, 509, 510, 511, 512, 513, 514, -1, + -1, -1, -1, -1, -1, 521, 522, -1, 524, -1, + -1, 527, -1, -1, -1, 531, 532, 533, -1, -1, + -1, 537, -1, -1, 540, 541, -1, 543, 544, 545, + 546, 547, 548, -1, -1, 551, 552, 553, 554, -1, + 556, 557, -1, -1, 560, 561, 562, 563, -1, 565, + 566, 567, -1, 569, 570, 571, 572, -1, -1, -1, + -1, -1, 578, 579, 580, -1, -1, -1, 584, 585, + 586, 587, -1, 589, 590, -1, 592, 593, -1, 595, + 596, -1, -1, 599, -1, -1, 602, -1, 604, -1, + 606, 607, -1, -1, -1, -1, -1, -1, 614, -1, + -1, 617, -1, -1, -1, 621, 622, 623, 624, 625, + 626, 627, -1, -1, -1, -1, -1, -1, 634, 635, + -1, 637, 638, 639, -1, 5, 642, 7, 8, 9, + 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, + -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, 34, -1, -1, -1, 38, 39, + -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, + -1, 51, 52, -1, -1, 55, -1, -1, 58, 59, + -1, 61, 62, -1, 64, 65, -1, 67, 68, 69, + 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, + 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, + -1, 91, 92, -1, 94, 95, 96, 97, 98, -1, + 100, -1, -1, 103, -1, -1, 106, -1, 108, -1, + -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, + -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, + -1, -1, -1, 133, -1, 135, -1, -1, -1, -1, + 140, -1, 142, 143, 144, 145, 146, -1, -1, -1, + -1, 151, -1, -1, 154, 155, 156, -1, -1, -1, + 160, -1, 162, 163, -1, 165, 166, 167, -1, 169, + 170, -1, 172, 173, 174, 175, 176, 177, 178, -1, + -1, 181, 182, 183, 184, -1, -1, 187, 188, -1, + 190, 191, 192, -1, -1, 195, -1, -1, -1, 199, + 200, -1, 202, -1, 204, -1, 206, 207, 208, 209, + 210, 211, 212, -1, 214, -1, -1, 217, 218, 219, + -1, 221, 222, 223, -1, 225, 226, -1, -1, -1, + 230, 231, 232, 233, 234, -1, -1, -1, 238, 239, + 240, -1, -1, 243, -1, -1, -1, -1, 248, 249, + -1, -1, -1, 253, -1, 255, 256, -1, 258, 259, + -1, -1, -1, 263, -1, -1, 266, 267, 268, -1, + -1, 271, -1, -1, 274, 275, -1, -1, -1, -1, + -1, 281, 282, -1, 284, -1, 286, -1, 288, 289, + -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, -1, 313, 314, 315, 316, -1, 318, 319, + 320, 321, -1, 323, 324, 325, -1, -1, -1, -1, + 330, 331, 332, 333, 334, 335, -1, -1, 338, 339, + -1, 341, -1, 343, -1, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, -1, -1, 357, -1, -1, + 360, 361, 362, 363, -1, -1, -1, 367, 368, -1, + -1, -1, 372, -1, 374, 375, 376, -1, 378, 379, + 380, 381, -1, 383, 384, -1, -1, -1, -1, -1, + -1, -1, -1, 393, 394, 395, -1, -1, 398, -1, + 400, -1, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, -1, 414, 415, 416, -1, 418, -1, + 420, 421, 422, 423, 424, -1, 426, 427, 428, -1, + -1, 431, -1, -1, -1, 435, 436, 437, 438, 439, + -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, + -1, 451, 452, 453, -1, -1, 456, -1, 458, -1, + 460, 461, -1, 463, 464, -1, 466, -1, 468, -1, + -1, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, -1, 484, 485, -1, -1, -1, 489, + 490, 491, 492, -1, -1, -1, 496, -1, -1, -1, + 500, -1, 502, 503, 504, 505, 506, 507, -1, 509, + 510, 511, 512, 513, 514, -1, -1, -1, -1, -1, + -1, 521, 522, -1, 524, -1, -1, 527, -1, -1, + -1, 531, 532, 533, -1, -1, -1, 537, -1, -1, + 540, 541, -1, 543, 544, 545, 546, 547, 548, -1, + -1, 551, 552, 553, 554, -1, 556, 557, -1, -1, + 560, 561, 562, 563, -1, 565, 566, 567, -1, 569, + 570, 571, 572, -1, -1, -1, -1, -1, 578, 579, + 580, -1, -1, -1, 584, 585, 586, 587, -1, 589, + 590, -1, 592, 593, -1, 595, 596, -1, -1, 599, + -1, -1, 602, -1, 604, -1, 606, 607, -1, -1, + -1, -1, -1, -1, 614, -1, -1, 617, -1, -1, + -1, 621, 622, 623, 624, 625, 626, 627, -1, -1, + -1, -1, -1, -1, 634, 635, -1, 637, 638, 639, + -1, 5, 642, 7, 8, 9, 10, 11, 12, -1, + -1, 15, -1, -1, -1, 19, -1, -1, 22, -1, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, + -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, + -1, 55, -1, -1, 58, 59, -1, 61, 62, -1, + 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, + 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, + 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, + 94, 95, 96, 97, 98, -1, 100, -1, -1, 103, + -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, + -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, + -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, + -1, 135, -1, -1, -1, -1, 140, -1, 142, 143, + 144, 145, 146, -1, -1, -1, -1, 151, -1, -1, + 154, 155, 156, -1, -1, -1, 160, -1, 162, 163, + -1, 165, 166, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, 178, -1, -1, 181, 182, 183, + 184, -1, -1, 187, 188, -1, 190, 191, 192, -1, + -1, 195, -1, -1, -1, 199, 200, -1, 202, -1, + 204, -1, 206, 207, 208, 209, 210, 211, 212, -1, + 214, -1, -1, 217, 218, 219, -1, 221, -1, -1, + -1, 225, 226, -1, -1, -1, 230, 231, 232, 233, + 234, -1, -1, -1, 238, 239, 240, -1, -1, 243, + -1, -1, -1, -1, 248, 249, -1, -1, -1, 253, + -1, 255, 256, -1, 258, 259, -1, -1, -1, 263, + -1, -1, 266, 267, 268, -1, -1, 271, -1, -1, + 274, 275, -1, -1, -1, -1, -1, 281, 282, -1, + 284, -1, 286, -1, 288, 289, -1, -1, 292, -1, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, -1, 313, + 314, 315, 316, -1, 318, 319, 320, 321, -1, 323, + 324, 325, -1, -1, -1, -1, 330, 331, 332, 333, + 334, 335, -1, -1, 338, 339, -1, 341, -1, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, -1, -1, 357, -1, -1, 360, 361, 362, 363, + -1, -1, -1, 367, 368, -1, -1, 371, 372, -1, + 374, 375, 376, -1, 378, 379, 380, 381, -1, 383, + 384, -1, -1, -1, -1, -1, -1, -1, -1, 393, + 394, 395, -1, 397, 398, -1, 400, -1, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, 416, -1, 418, -1, 420, 421, 422, 423, + 424, -1, 426, 427, 428, -1, -1, 431, -1, -1, + -1, 435, 436, 437, 438, 439, -1, -1, 442, 443, + 444, 445, 446, -1, 448, 449, -1, 451, 452, 453, + -1, -1, 456, -1, 458, -1, 460, 461, -1, 463, + 464, -1, 466, -1, 468, -1, -1, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, -1, + 484, 485, -1, -1, -1, 489, 490, 491, 492, -1, + -1, -1, 496, -1, -1, -1, 500, -1, 502, 503, + 504, 505, 506, 507, -1, 509, 510, 511, 512, 513, + 514, -1, -1, -1, -1, -1, -1, 521, 522, -1, + 524, -1, -1, 527, -1, -1, -1, 531, 532, 533, + -1, -1, -1, 537, -1, -1, 540, 541, -1, 543, + 544, 545, 546, 547, 548, -1, -1, 551, 552, 553, + 554, -1, 556, 557, -1, -1, 560, 561, 562, 563, + -1, -1, 566, 567, -1, 569, 570, 571, 572, -1, + -1, -1, -1, -1, 578, 579, 580, -1, -1, -1, + 584, 585, 586, 587, 588, 589, 590, -1, 592, 593, + -1, 595, 596, -1, -1, 599, -1, -1, 602, -1, + 604, -1, 606, 607, -1, -1, -1, -1, -1, -1, + 614, -1, -1, 617, -1, -1, -1, 621, 622, 623, + 624, 625, 626, 627, -1, -1, -1, -1, -1, -1, + 634, 635, -1, 637, 638, 639, -1, 5, 642, 7, + 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, + -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, + 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, + -1, 49, -1, 51, 52, -1, -1, 55, -1, -1, + 58, 59, -1, 61, 62, -1, 64, 65, -1, 67, + 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, + 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, + 88, 89, -1, 91, 92, -1, 94, 95, 96, 97, + 98, -1, 100, -1, -1, 103, -1, -1, 106, -1, + 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, + 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, + 128, -1, -1, -1, -1, 133, -1, 135, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, 146, -1, + -1, -1, -1, 151, -1, -1, 154, 155, 156, -1, + -1, -1, 160, -1, 162, 163, -1, 165, 166, 167, + -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, + 178, -1, -1, 181, 182, 183, 184, -1, -1, 187, + 188, -1, 190, 191, 192, -1, -1, 195, -1, -1, + -1, 199, 200, -1, 202, -1, 204, -1, 206, 207, + 208, 209, 210, 211, 212, -1, 214, -1, -1, 217, + 218, 219, -1, 221, -1, -1, -1, 225, 226, -1, + -1, -1, 230, 231, 232, 233, 234, -1, -1, -1, + 238, 239, 240, -1, -1, 243, -1, -1, -1, -1, + 248, 249, -1, -1, -1, 253, -1, 255, 256, -1, + 258, 259, -1, -1, -1, 263, -1, -1, 266, 267, + 268, -1, -1, 271, -1, -1, 274, 275, -1, -1, + -1, -1, -1, 281, 282, -1, 284, -1, 286, -1, + 288, 289, -1, -1, 292, -1, -1, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, -1, 313, 314, 315, 316, -1, + 318, 319, 320, 321, -1, 323, 324, 325, -1, -1, + -1, -1, 330, 331, 332, 333, 334, 335, -1, -1, + 338, 339, -1, 341, -1, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, -1, -1, 357, + -1, -1, 360, 361, 362, 363, -1, -1, -1, 367, + 368, -1, -1, 371, 372, -1, 374, 375, 376, -1, + 378, 379, 380, 381, -1, 383, 384, -1, -1, -1, + -1, -1, -1, -1, -1, 393, 394, 395, -1, 397, + 398, -1, 400, -1, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, 416, -1, + 418, -1, 420, 421, 422, 423, 424, -1, 426, 427, + 428, -1, -1, 431, -1, -1, -1, 435, 436, 437, + 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, + 448, 449, -1, 451, 452, 453, -1, -1, 456, -1, + 458, -1, 460, 461, -1, 463, 464, -1, 466, -1, + 468, -1, -1, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, -1, 484, 485, -1, -1, + -1, 489, 490, 491, 492, -1, -1, -1, 496, -1, + -1, -1, 500, -1, 502, 503, 504, 505, 506, 507, + -1, 509, 510, 511, 512, 513, 514, -1, -1, -1, + -1, -1, -1, 521, 522, -1, 524, -1, -1, 527, + -1, -1, -1, 531, 532, 533, -1, -1, -1, 537, + -1, -1, 540, 541, -1, 543, 544, 545, 546, 547, + 548, -1, -1, 551, 552, 553, 554, -1, 556, 557, + -1, -1, 560, 561, 562, 563, -1, -1, 566, 567, + -1, 569, 570, 571, 572, -1, -1, -1, -1, -1, + 578, 579, 580, -1, -1, -1, 584, 585, 586, 587, + 588, 589, 590, -1, 592, 593, -1, 595, 596, -1, + -1, 599, -1, -1, 602, -1, 604, -1, 606, 607, + -1, -1, -1, -1, -1, -1, 614, -1, -1, 617, + -1, -1, -1, 621, 622, 623, 624, 625, 626, 627, + -1, -1, -1, -1, -1, -1, 634, 635, -1, 637, + 638, 639, -1, 5, 642, 7, 8, 9, 10, 11, + 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, + 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, 34, -1, -1, 37, 38, -1, -1, -1, + 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, + 52, -1, -1, 55, -1, -1, 58, 59, -1, 61, + 62, -1, 64, 65, -1, 67, 68, 69, 70, 71, + 72, -1, 74, 75, 76, 77, 78, 79, 80, -1, + 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, + 92, -1, 94, 95, 96, 97, 98, -1, 100, -1, + -1, 103, -1, -1, 106, -1, 108, -1, -1, 111, + -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, + 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, + 132, 133, -1, 135, -1, -1, -1, -1, 140, -1, + 142, 143, 144, 145, 146, -1, -1, -1, -1, 151, + -1, -1, 154, 155, 156, -1, -1, -1, 160, -1, + 162, 163, -1, 165, 166, 167, -1, 169, 170, -1, + 172, 173, 174, 175, 176, 177, 178, -1, -1, 181, + 182, 183, 184, -1, -1, 187, 188, -1, 190, 191, + 192, -1, -1, 195, -1, -1, -1, 199, 200, -1, + 202, -1, 204, -1, 206, 207, 208, 209, 210, 211, + 212, -1, 214, -1, -1, 217, 218, 219, -1, 221, + -1, -1, -1, 225, 226, -1, -1, -1, 230, 231, + 232, 233, 234, -1, -1, -1, 238, 239, 240, -1, + -1, 243, -1, -1, -1, -1, 248, 249, -1, -1, + -1, 253, -1, 255, 256, -1, 258, 259, -1, -1, + -1, 263, -1, -1, 266, 267, 268, -1, -1, 271, + -1, -1, 274, 275, 276, -1, -1, -1, -1, 281, + 282, -1, 284, -1, 286, -1, 288, 289, -1, -1, + -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + -1, 313, 314, 315, 316, -1, 318, 319, 320, 321, + -1, 323, 324, 325, -1, -1, -1, -1, 330, 331, + 332, 333, 334, 335, -1, -1, 338, 339, -1, 341, + -1, 343, -1, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, -1, -1, 357, -1, -1, 360, 361, + 362, 363, -1, -1, -1, 367, 368, -1, -1, -1, + 372, -1, 374, 375, 376, -1, 378, 379, 380, 381, + -1, 383, 384, -1, -1, -1, -1, -1, -1, -1, + -1, 393, 394, 395, -1, -1, 398, -1, 400, -1, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + -1, -1, 414, 415, 416, -1, 418, -1, 420, 421, + 422, 423, 424, -1, 426, 427, 428, -1, -1, 431, + -1, -1, -1, 435, 436, 437, 438, 439, -1, -1, + 442, 443, 444, 445, 446, -1, 448, 449, -1, 451, + 452, 453, -1, -1, 456, -1, 458, -1, 460, 461, + -1, 463, 464, -1, 466, -1, 468, -1, -1, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, -1, 484, 485, -1, -1, -1, 489, 490, 491, + 492, -1, -1, -1, 496, -1, -1, -1, 500, -1, + 502, 503, 504, 505, 506, 507, -1, 509, 510, 511, + 512, 513, 514, -1, -1, -1, -1, -1, -1, 521, + 522, -1, 524, -1, -1, 527, -1, -1, -1, 531, + 532, 533, -1, -1, -1, 537, -1, -1, 540, 541, + -1, 543, 544, 545, 546, 547, 548, -1, -1, 551, + 552, 553, 554, -1, 556, 557, -1, -1, 560, 561, + 562, 563, -1, 565, 566, 567, -1, 569, 570, 571, + 572, -1, -1, -1, -1, -1, 578, 579, 580, -1, + -1, -1, 584, 585, 586, 587, -1, 589, 590, -1, + 592, 593, -1, 595, 596, -1, -1, 599, -1, -1, + 602, -1, 604, -1, 606, 607, -1, -1, -1, -1, + -1, -1, 614, -1, -1, 617, -1, -1, -1, 621, + 622, 623, 624, 625, 626, 627, -1, -1, -1, -1, + -1, -1, 634, 635, -1, 637, 638, 639, -1, 5, + 642, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, @@ -16756,125 +15979,316 @@ static const yytype_int16 yycheck[] = 96, 97, 98, -1, 100, -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, - -1, 127, 128, -1, -1, -1, 132, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, -1, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, -1, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, -1, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, -1, -1, 295, + -1, 127, 128, -1, -1, -1, -1, 133, -1, 135, + -1, -1, -1, -1, 140, -1, 142, 143, 144, 145, + 146, -1, -1, -1, -1, 151, -1, -1, 154, 155, + 156, -1, -1, -1, 160, -1, 162, 163, -1, 165, + 166, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, 178, -1, -1, 181, 182, 183, 184, -1, + -1, 187, 188, -1, 190, 191, 192, -1, -1, 195, + -1, -1, -1, 199, 200, -1, 202, -1, 204, -1, + 206, 207, 208, 209, 210, 211, 212, -1, 214, -1, + -1, 217, 218, 219, -1, 221, -1, -1, -1, 225, + 226, -1, -1, -1, 230, 231, 232, 233, 234, -1, + -1, -1, 238, 239, 240, -1, -1, 243, -1, -1, + -1, -1, 248, 249, -1, -1, -1, 253, -1, 255, + 256, -1, 258, 259, -1, -1, -1, 263, -1, -1, + 266, 267, 268, -1, -1, 271, -1, -1, 274, 275, + -1, -1, -1, -1, -1, 281, 282, -1, 284, -1, + 286, -1, 288, 289, -1, -1, 292, -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, -1, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, -1, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, - 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, - 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, - -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, 97, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, - -1, -1, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, 150, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, 176, 177, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, -1, -1, 194, -1, -1, -1, 198, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, 210, - 211, -1, 213, -1, -1, 216, 217, 218, -1, 220, - -1, -1, -1, 224, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, 248, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, 265, 266, 267, -1, -1, 270, - -1, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, -1, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, 366, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, 382, 383, -1, -1, -1, -1, -1, -1, -1, - -1, 392, 393, 394, -1, -1, 397, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - -1, -1, 413, 414, 415, 416, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, 448, -1, 450, - 451, 452, -1, -1, 455, -1, 457, -1, 459, 460, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, -1, 483, 484, -1, -1, -1, 488, 489, 490, - 491, -1, -1, -1, 495, -1, -1, -1, 499, -1, - 501, 502, 503, 504, 505, 506, -1, 508, 509, 510, - 511, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - 531, 532, -1, -1, -1, 536, -1, -1, 539, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, -1, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, 583, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, 594, 595, -1, -1, 598, -1, -1, - 601, -1, 603, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, 634, -1, 636, 637, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, + 306, 307, 308, 309, 310, 311, -1, 313, 314, 315, + 316, -1, 318, 319, 320, 321, -1, 323, 324, 325, + -1, -1, -1, -1, 330, 331, 332, 333, 334, 335, + -1, -1, 338, 339, -1, 341, -1, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, -1, + -1, 357, -1, -1, 360, 361, 362, 363, -1, -1, + -1, 367, 368, -1, -1, 371, 372, -1, 374, 375, + 376, -1, 378, 379, 380, 381, -1, 383, 384, -1, + -1, -1, -1, -1, -1, -1, -1, 393, 394, 395, + -1, 397, 398, -1, 400, -1, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + 416, -1, 418, -1, 420, 421, 422, 423, 424, -1, + 426, 427, 428, -1, -1, 431, -1, -1, -1, 435, + 436, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, -1, 451, 452, 453, -1, -1, + 456, -1, 458, -1, 460, 461, -1, 463, 464, -1, + 466, -1, 468, -1, -1, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, -1, 484, 485, + -1, -1, -1, 489, 490, 491, 492, -1, -1, -1, + 496, -1, -1, -1, 500, -1, 502, 503, 504, 505, + 506, 507, -1, 509, 510, 511, 512, 513, 514, -1, + -1, -1, -1, -1, -1, 521, 522, -1, 524, -1, + -1, 527, -1, -1, -1, 531, 532, 533, -1, -1, + -1, 537, -1, -1, 540, 541, -1, 543, 544, 545, + 546, 547, 548, -1, -1, 551, 552, 553, 554, -1, + 556, 557, -1, -1, 560, 561, 562, 563, -1, -1, + 566, 567, -1, 569, 570, 571, 572, -1, -1, -1, + -1, -1, 578, 579, 580, -1, -1, -1, 584, 585, + 586, 587, 588, 589, 590, -1, 592, 593, -1, 595, + 596, -1, -1, 599, -1, -1, 602, -1, 604, -1, + 606, 607, -1, -1, -1, -1, -1, -1, 614, -1, + -1, 617, -1, -1, -1, 621, 622, 623, 624, 625, + 626, 627, -1, -1, -1, -1, -1, -1, 634, 635, + -1, 637, 638, 639, -1, 5, 642, 7, 8, 9, + 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, + -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, + -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, + -1, 51, 52, -1, -1, 55, -1, -1, 58, 59, + -1, 61, 62, -1, 64, 65, -1, 67, 68, 69, + 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, + 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, + -1, 91, 92, -1, 94, 95, 96, 97, 98, -1, + 100, -1, -1, 103, -1, -1, 106, -1, 108, 109, + -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, + -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, + -1, -1, -1, 133, -1, 135, -1, -1, -1, -1, + 140, -1, 142, 143, 144, 145, 146, -1, -1, -1, + -1, 151, -1, -1, 154, 155, 156, -1, -1, -1, + 160, -1, 162, 163, -1, 165, 166, 167, -1, 169, + 170, -1, 172, 173, 174, 175, 176, 177, 178, -1, + -1, 181, 182, 183, 184, -1, -1, 187, 188, -1, + 190, 191, 192, -1, -1, 195, -1, -1, -1, 199, + 200, -1, 202, -1, 204, -1, 206, 207, 208, 209, + 210, 211, 212, -1, 214, -1, -1, 217, 218, 219, + -1, 221, -1, -1, -1, 225, 226, -1, -1, -1, + 230, 231, 232, 233, 234, -1, -1, -1, 238, 239, + 240, -1, -1, 243, -1, -1, -1, -1, 248, 249, + -1, -1, -1, 253, -1, 255, 256, -1, 258, 259, + -1, -1, -1, 263, -1, -1, 266, 267, 268, -1, + -1, 271, -1, -1, 274, 275, 276, -1, -1, -1, + -1, 281, 282, -1, 284, -1, 286, -1, 288, 289, + -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, -1, 313, 314, 315, 316, -1, 318, 319, + 320, 321, -1, 323, 324, 325, -1, -1, -1, -1, + 330, 331, 332, 333, 334, 335, -1, -1, 338, 339, + -1, 341, -1, 343, -1, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, -1, -1, 357, -1, -1, + 360, 361, 362, 363, -1, -1, -1, 367, 368, -1, + -1, -1, 372, -1, 374, 375, 376, -1, 378, 379, + 380, 381, -1, 383, 384, -1, -1, -1, -1, -1, + -1, -1, -1, 393, 394, 395, -1, -1, 398, -1, + 400, -1, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, -1, 414, 415, 416, -1, 418, -1, + 420, 421, 422, 423, 424, -1, 426, 427, 428, -1, + -1, 431, -1, -1, -1, 435, 436, 437, 438, 439, + -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, + -1, 451, 452, 453, -1, -1, 456, -1, 458, -1, + 460, 461, -1, 463, 464, -1, 466, -1, 468, -1, + -1, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, -1, 484, 485, -1, -1, -1, 489, + 490, 491, 492, -1, -1, -1, 496, -1, -1, -1, + 500, -1, 502, 503, 504, 505, 506, 507, -1, 509, + 510, 511, 512, 513, 514, -1, -1, -1, -1, -1, + -1, 521, 522, -1, 524, -1, -1, 527, -1, -1, + -1, 531, 532, 533, -1, -1, -1, 537, -1, -1, + 540, 541, -1, 543, 544, 545, 546, 547, 548, -1, + -1, 551, 552, 553, 554, -1, 556, 557, -1, -1, + 560, 561, 562, 563, -1, 565, 566, 567, -1, 569, + 570, 571, 572, -1, -1, -1, -1, -1, 578, 579, + 580, -1, -1, -1, 584, 585, 586, 587, -1, 589, + 590, -1, 592, 593, -1, 595, 596, -1, -1, 599, + -1, -1, 602, -1, 604, -1, 606, 607, -1, -1, + -1, -1, -1, -1, 614, -1, -1, 617, -1, -1, + -1, 621, 622, 623, 624, 625, 626, 627, -1, -1, + -1, -1, -1, -1, 634, 635, -1, 637, 638, 639, + -1, 5, 642, 7, 8, 9, 10, 11, 12, 13, + -1, 15, -1, -1, -1, 19, -1, -1, 22, -1, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, + -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, + -1, 55, -1, -1, 58, 59, -1, 61, 62, -1, + 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, + 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, + 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, + 94, 95, 96, 97, 98, -1, 100, -1, -1, 103, + -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, + -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, + -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, + -1, 135, -1, -1, -1, -1, 140, -1, 142, 143, + 144, 145, 146, -1, -1, -1, -1, 151, -1, -1, + 154, 155, 156, -1, -1, -1, 160, -1, 162, 163, + -1, 165, 166, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, 178, -1, -1, 181, 182, 183, + 184, -1, -1, 187, 188, -1, 190, 191, 192, -1, + -1, 195, -1, -1, -1, 199, 200, -1, 202, -1, + 204, -1, 206, 207, 208, 209, 210, 211, 212, -1, + 214, -1, -1, 217, 218, 219, -1, 221, -1, -1, + -1, 225, 226, -1, -1, -1, 230, 231, 232, 233, + 234, -1, -1, -1, 238, 239, 240, -1, -1, 243, + -1, -1, -1, -1, 248, 249, -1, -1, -1, 253, + -1, 255, 256, -1, 258, 259, -1, -1, -1, 263, + -1, -1, 266, 267, 268, -1, -1, 271, -1, -1, + 274, 275, 276, -1, -1, -1, -1, 281, 282, -1, + 284, -1, 286, -1, 288, 289, -1, -1, -1, -1, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, -1, 313, + 314, 315, 316, -1, 318, 319, 320, 321, -1, 323, + 324, 325, -1, -1, -1, -1, 330, 331, 332, 333, + 334, 335, -1, -1, 338, 339, -1, 341, -1, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, -1, -1, 357, -1, -1, 360, 361, 362, 363, + -1, -1, -1, 367, 368, -1, -1, -1, 372, -1, + 374, 375, 376, -1, 378, 379, 380, 381, -1, 383, + 384, -1, -1, -1, -1, -1, -1, -1, -1, 393, + 394, 395, -1, -1, 398, -1, 400, -1, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, 416, -1, 418, -1, 420, 421, 422, 423, + 424, -1, 426, 427, 428, -1, -1, 431, -1, -1, + -1, 435, 436, 437, 438, 439, -1, -1, 442, 443, + 444, 445, 446, -1, 448, 449, -1, 451, 452, 453, + -1, -1, 456, -1, 458, -1, 460, 461, -1, 463, + 464, -1, 466, -1, 468, -1, -1, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, -1, + 484, 485, -1, -1, -1, 489, 490, 491, 492, -1, + -1, -1, 496, -1, -1, -1, 500, -1, 502, 503, + 504, 505, 506, 507, -1, 509, 510, 511, 512, 513, + 514, -1, -1, -1, -1, -1, -1, 521, 522, -1, + 524, -1, -1, 527, -1, -1, -1, 531, 532, 533, + -1, -1, -1, 537, -1, -1, 540, 541, -1, 543, + 544, 545, 546, 547, 548, -1, -1, 551, 552, 553, + 554, -1, 556, 557, -1, -1, 560, 561, 562, 563, + -1, 565, 566, 567, -1, 569, 570, 571, 572, -1, + -1, -1, -1, -1, 578, 579, 580, -1, -1, -1, + 584, 585, 586, 587, -1, 589, 590, -1, 592, 593, + -1, 595, 596, -1, -1, 599, -1, -1, 602, -1, + 604, -1, 606, 607, -1, -1, -1, -1, -1, -1, + 614, -1, -1, 617, -1, -1, -1, 621, 622, 623, + 624, 625, 626, 627, -1, -1, -1, -1, -1, -1, + 634, 635, -1, 637, 638, 639, -1, 5, 642, 7, + 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, + -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, + 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, + -1, 49, -1, 51, 52, -1, -1, 55, -1, -1, + 58, 59, -1, 61, 62, -1, 64, 65, -1, 67, + 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, + 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, + 88, 89, -1, 91, 92, -1, 94, 95, 96, 97, + 98, -1, 100, -1, -1, 103, -1, -1, 106, -1, + 108, -1, 110, 111, -1, 113, -1, -1, -1, 117, + 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, + 128, -1, -1, -1, -1, 133, -1, 135, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, 146, -1, + -1, -1, -1, 151, -1, -1, 154, 155, 156, -1, + -1, -1, 160, -1, 162, 163, -1, 165, 166, 167, + -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, + 178, -1, -1, 181, 182, 183, 184, -1, -1, 187, + 188, -1, 190, 191, 192, -1, -1, 195, -1, -1, + -1, 199, 200, -1, 202, -1, 204, -1, 206, 207, + 208, 209, 210, 211, 212, -1, 214, -1, -1, 217, + 218, 219, -1, 221, -1, -1, -1, 225, 226, -1, + -1, -1, 230, 231, 232, 233, 234, -1, -1, -1, + 238, 239, 240, -1, -1, 243, -1, -1, -1, -1, + 248, 249, -1, -1, -1, 253, -1, 255, 256, -1, + 258, 259, -1, -1, -1, 263, -1, -1, 266, 267, + 268, -1, -1, 271, -1, -1, 274, 275, 276, -1, + -1, -1, -1, 281, 282, -1, 284, -1, 286, -1, + 288, 289, -1, -1, -1, -1, -1, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, -1, 313, 314, 315, 316, -1, + 318, 319, 320, 321, -1, 323, 324, 325, -1, -1, + -1, -1, 330, 331, 332, 333, 334, 335, -1, -1, + 338, 339, -1, 341, -1, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, -1, -1, 357, + -1, -1, 360, 361, 362, 363, -1, -1, -1, 367, + 368, -1, -1, -1, 372, -1, 374, 375, 376, -1, + 378, 379, 380, 381, -1, 383, 384, -1, -1, -1, + -1, -1, -1, -1, -1, 393, 394, 395, -1, -1, + 398, -1, 400, -1, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, 416, -1, + 418, -1, 420, 421, 422, 423, 424, -1, 426, 427, + 428, -1, -1, 431, -1, -1, -1, 435, 436, 437, + 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, + 448, 449, -1, 451, 452, 453, -1, -1, 456, -1, + 458, -1, 460, 461, -1, 463, 464, -1, 466, -1, + 468, -1, -1, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, -1, 484, 485, -1, -1, + -1, 489, 490, 491, 492, -1, -1, -1, 496, -1, + -1, -1, 500, -1, 502, 503, 504, 505, 506, 507, + -1, 509, 510, 511, 512, 513, 514, -1, -1, -1, + -1, -1, -1, 521, 522, -1, 524, -1, -1, 527, + -1, -1, -1, 531, 532, 533, -1, -1, -1, 537, + -1, -1, 540, 541, -1, 543, 544, 545, 546, 547, + 548, -1, -1, 551, 552, 553, 554, -1, 556, 557, + -1, -1, 560, 561, 562, 563, -1, 565, 566, 567, + -1, 569, 570, 571, 572, -1, -1, -1, -1, -1, + 578, 579, 580, -1, -1, -1, 584, 585, 586, 587, + -1, 589, 590, -1, 592, 593, -1, 595, 596, -1, + -1, 599, -1, -1, 602, -1, 604, -1, 606, 607, + -1, -1, -1, -1, -1, -1, 614, -1, -1, 617, + -1, -1, -1, 621, 622, 623, 624, 625, 626, 627, + -1, -1, -1, -1, -1, -1, 634, 635, -1, 637, + 638, 639, -1, 5, 642, 7, 8, 9, 10, 11, + 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, + 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, 34, -1, -1, -1, 38, -1, -1, -1, + 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, + 52, -1, -1, 55, -1, -1, 58, 59, -1, 61, + 62, -1, 64, 65, -1, 67, 68, 69, 70, 71, + 72, -1, 74, 75, 76, 77, 78, 79, 80, -1, + 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, + 92, -1, 94, 95, 96, 97, 98, -1, 100, -1, + -1, 103, -1, -1, 106, -1, 108, -1, -1, 111, + -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, + 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, + 132, 133, -1, 135, -1, -1, -1, -1, 140, -1, + 142, 143, 144, 145, 146, -1, -1, -1, -1, 151, + -1, -1, 154, 155, 156, -1, -1, -1, 160, -1, + 162, 163, -1, 165, 166, 167, -1, 169, 170, -1, + 172, 173, 174, 175, 176, 177, 178, -1, -1, 181, + 182, 183, 184, -1, -1, 187, 188, -1, 190, 191, + 192, -1, -1, 195, -1, -1, -1, 199, 200, -1, + 202, -1, 204, -1, 206, 207, 208, 209, 210, 211, + 212, -1, 214, -1, -1, 217, 218, 219, -1, 221, + -1, -1, -1, 225, 226, -1, -1, -1, 230, 231, + 232, 233, 234, -1, -1, -1, 238, 239, 240, -1, + -1, 243, -1, -1, -1, -1, 248, 249, -1, -1, + -1, 253, -1, 255, 256, -1, 258, 259, -1, -1, + -1, 263, -1, -1, 266, 267, 268, -1, -1, 271, + -1, -1, 274, 275, 276, -1, -1, -1, -1, 281, + 282, -1, 284, -1, 286, -1, 288, 289, -1, -1, + -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + -1, 313, 314, 315, 316, -1, 318, 319, 320, 321, + -1, 323, 324, 325, -1, -1, -1, -1, 330, 331, + 332, 333, 334, 335, -1, -1, 338, 339, -1, 341, + -1, 343, -1, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, -1, -1, 357, -1, -1, 360, 361, + 362, 363, -1, -1, -1, 367, 368, -1, -1, -1, + 372, -1, 374, 375, 376, -1, 378, 379, 380, 381, + -1, 383, 384, -1, -1, -1, -1, -1, -1, -1, + -1, 393, 394, 395, -1, -1, 398, -1, 400, -1, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + -1, -1, 414, 415, 416, -1, 418, -1, 420, 421, + 422, 423, 424, -1, 426, 427, 428, -1, -1, 431, + -1, -1, -1, 435, 436, 437, 438, 439, -1, -1, + 442, 443, 444, 445, 446, -1, 448, 449, -1, 451, + 452, 453, -1, -1, 456, -1, 458, -1, 460, 461, + -1, 463, 464, -1, 466, -1, 468, -1, -1, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, -1, 484, 485, -1, -1, -1, 489, 490, 491, + 492, -1, -1, -1, 496, -1, -1, -1, 500, -1, + 502, 503, 504, 505, 506, 507, -1, 509, 510, 511, + 512, 513, 514, -1, -1, -1, -1, -1, -1, 521, + 522, -1, 524, -1, -1, 527, -1, -1, -1, 531, + 532, 533, -1, -1, -1, 537, -1, -1, 540, 541, + -1, 543, 544, 545, 546, 547, 548, -1, -1, 551, + 552, 553, 554, -1, 556, 557, -1, -1, 560, 561, + 562, 563, -1, 565, 566, 567, -1, 569, 570, 571, + 572, -1, -1, -1, -1, -1, 578, 579, 580, -1, + -1, -1, 584, 585, 586, 587, -1, 589, 590, -1, + 592, 593, -1, 595, 596, -1, -1, 599, -1, -1, + 602, -1, 604, -1, 606, 607, -1, -1, -1, -1, + -1, -1, 614, -1, -1, 617, -1, -1, -1, 621, + 622, 623, 624, 625, 626, 627, -1, -1, -1, -1, + -1, -1, 634, 635, -1, 637, 638, 639, -1, 5, + 642, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, - -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, + -1, 37, 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, @@ -16884,121 +16298,312 @@ static const yytype_int16 yycheck[] = 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, -1, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, -1, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, -1, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, -1, -1, 295, + -1, -1, -1, -1, 140, -1, 142, 143, 144, 145, + 146, -1, -1, -1, -1, 151, -1, -1, 154, 155, + 156, -1, -1, -1, 160, -1, 162, 163, -1, 165, + 166, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, 178, -1, -1, 181, 182, 183, 184, -1, + -1, 187, 188, -1, 190, 191, 192, -1, -1, 195, + -1, -1, -1, 199, 200, -1, 202, -1, 204, -1, + 206, 207, 208, 209, 210, 211, 212, -1, 214, -1, + -1, 217, 218, 219, -1, 221, -1, -1, -1, 225, + 226, -1, -1, -1, 230, 231, 232, 233, 234, -1, + -1, -1, 238, 239, 240, -1, -1, 243, -1, -1, + -1, -1, 248, 249, -1, -1, -1, 253, -1, 255, + 256, -1, 258, 259, -1, -1, -1, 263, -1, -1, + 266, 267, 268, -1, -1, 271, -1, -1, 274, 275, + 276, -1, -1, -1, -1, 281, 282, -1, 284, -1, + 286, -1, 288, 289, -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, -1, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, 564, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, - 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, - 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, - -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, 97, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, - -1, 132, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, 150, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, 176, 177, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, -1, -1, 194, -1, -1, -1, 198, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, 210, - 211, -1, 213, -1, -1, 216, 217, 218, -1, 220, - -1, -1, -1, 224, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, 248, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, 265, 266, 267, -1, -1, 270, - -1, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, -1, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, 366, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, 382, 383, -1, -1, -1, -1, -1, -1, -1, - -1, 392, 393, 394, -1, -1, 397, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - -1, -1, 413, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, 448, -1, 450, - 451, 452, -1, -1, 455, -1, 457, -1, 459, 460, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, -1, 483, 484, -1, -1, -1, 488, 489, 490, - 491, -1, -1, -1, 495, -1, -1, -1, 499, -1, - 501, 502, 503, 504, 505, 506, -1, 508, 509, 510, - 511, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - 531, 532, -1, -1, -1, 536, -1, -1, 539, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, -1, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, 583, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, 594, 595, -1, -1, 598, -1, -1, - 601, -1, 603, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, 634, -1, 636, 637, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, 13, -1, 15, + 306, 307, 308, 309, 310, 311, -1, 313, 314, 315, + 316, -1, 318, 319, 320, 321, -1, 323, 324, 325, + -1, -1, -1, -1, 330, 331, 332, 333, 334, 335, + -1, -1, 338, 339, -1, 341, -1, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, -1, + -1, 357, -1, -1, 360, 361, 362, 363, -1, -1, + -1, 367, 368, -1, -1, -1, 372, -1, 374, 375, + 376, -1, 378, 379, 380, 381, -1, 383, 384, -1, + -1, -1, -1, -1, -1, -1, -1, 393, 394, 395, + -1, -1, 398, -1, 400, -1, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + 416, -1, 418, -1, 420, 421, 422, 423, 424, -1, + 426, 427, 428, -1, -1, 431, -1, -1, -1, 435, + 436, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, -1, 451, 452, 453, -1, -1, + 456, -1, 458, -1, 460, 461, -1, 463, 464, -1, + 466, -1, 468, -1, -1, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, -1, 484, 485, + -1, -1, -1, 489, 490, 491, 492, -1, -1, -1, + 496, -1, -1, -1, 500, -1, 502, 503, 504, 505, + 506, 507, -1, 509, 510, 511, 512, 513, 514, -1, + -1, -1, -1, -1, -1, 521, 522, -1, 524, -1, + -1, 527, -1, -1, -1, 531, 532, 533, -1, -1, + -1, 537, -1, -1, 540, 541, -1, 543, 544, 545, + 546, 547, 548, -1, -1, 551, 552, 553, 554, -1, + 556, 557, -1, -1, 560, 561, 562, 563, -1, 565, + 566, 567, -1, 569, 570, 571, 572, -1, -1, -1, + -1, -1, 578, 579, 580, -1, -1, -1, 584, 585, + 586, 587, -1, 589, 590, -1, 592, 593, -1, 595, + 596, -1, -1, 599, -1, -1, 602, -1, 604, -1, + 606, 607, -1, -1, -1, -1, -1, -1, 614, -1, + -1, 617, -1, -1, -1, 621, 622, 623, 624, 625, + 626, 627, -1, -1, -1, -1, -1, -1, 634, 635, + -1, 637, 638, 639, -1, 5, 642, 7, 8, 9, + 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, + -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, + -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, + -1, 51, 52, -1, -1, 55, -1, -1, 58, 59, + -1, 61, 62, -1, 64, 65, -1, 67, 68, 69, + 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, + 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, + -1, 91, 92, -1, 94, 95, 96, 97, 98, -1, + 100, -1, -1, 103, -1, -1, 106, -1, 108, -1, + -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, + -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, + -1, -1, -1, 133, -1, 135, -1, -1, -1, -1, + 140, -1, 142, 143, 144, 145, 146, -1, -1, -1, + -1, 151, -1, -1, 154, 155, 156, -1, -1, -1, + 160, -1, 162, 163, -1, 165, 166, 167, -1, 169, + 170, -1, 172, 173, 174, 175, 176, 177, 178, -1, + -1, 181, 182, 183, 184, -1, -1, 187, 188, -1, + 190, 191, 192, -1, -1, 195, -1, -1, -1, 199, + 200, -1, 202, -1, 204, -1, 206, 207, 208, 209, + 210, 211, 212, -1, 214, -1, -1, 217, 218, 219, + -1, 221, -1, -1, -1, 225, 226, -1, -1, -1, + 230, 231, 232, 233, 234, -1, -1, -1, 238, 239, + 240, -1, -1, 243, -1, -1, -1, -1, 248, 249, + -1, -1, -1, 253, -1, 255, 256, -1, 258, 259, + -1, -1, -1, 263, -1, -1, 266, 267, 268, -1, + -1, 271, -1, -1, 274, 275, 276, -1, -1, -1, + -1, 281, 282, -1, 284, -1, 286, -1, 288, 289, + -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, -1, 313, 314, 315, 316, -1, 318, 319, + 320, 321, -1, 323, 324, 325, -1, -1, -1, -1, + 330, 331, 332, 333, 334, 335, -1, -1, 338, 339, + -1, 341, -1, 343, -1, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, -1, -1, 357, -1, -1, + 360, 361, 362, 363, -1, -1, -1, 367, 368, -1, + -1, -1, 372, -1, 374, 375, 376, -1, 378, 379, + 380, 381, -1, 383, 384, -1, -1, -1, -1, -1, + -1, -1, -1, 393, 394, 395, -1, -1, 398, -1, + 400, -1, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, -1, 414, 415, 416, -1, 418, -1, + 420, 421, 422, 423, 424, -1, 426, 427, 428, -1, + -1, 431, -1, -1, -1, 435, 436, 437, 438, 439, + -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, + -1, 451, 452, 453, -1, -1, 456, -1, 458, -1, + 460, 461, -1, 463, 464, -1, 466, -1, 468, -1, + -1, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, -1, 484, 485, -1, -1, -1, 489, + 490, 491, 492, -1, -1, -1, 496, -1, -1, -1, + 500, -1, 502, 503, 504, 505, 506, 507, -1, 509, + 510, 511, 512, 513, 514, -1, -1, -1, -1, -1, + -1, 521, 522, -1, 524, -1, -1, 527, -1, -1, + -1, 531, 532, 533, -1, -1, -1, 537, -1, -1, + 540, 541, -1, 543, 544, 545, 546, 547, 548, -1, + -1, 551, 552, 553, 554, -1, 556, 557, -1, -1, + 560, 561, 562, 563, -1, 565, 566, 567, -1, 569, + 570, 571, 572, -1, -1, -1, -1, -1, 578, 579, + 580, -1, -1, -1, 584, 585, 586, 587, -1, 589, + 590, -1, 592, 593, -1, 595, 596, -1, -1, 599, + -1, -1, 602, -1, 604, -1, 606, 607, -1, -1, + -1, -1, -1, -1, 614, -1, -1, 617, -1, -1, + -1, 621, 622, 623, 624, 625, 626, 627, -1, -1, + -1, -1, -1, -1, 634, 635, -1, 637, 638, 639, + -1, 5, 642, 7, 8, 9, 10, 11, 12, -1, + -1, 15, -1, -1, -1, 19, 20, -1, 22, -1, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, + -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, + -1, 55, -1, -1, 58, 59, -1, 61, 62, -1, + 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, + 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, + 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, + 94, 95, 96, 97, 98, -1, 100, -1, -1, 103, + -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, + -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, + -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, + -1, 135, -1, -1, -1, -1, 140, -1, 142, 143, + 144, 145, 146, -1, -1, -1, -1, 151, -1, -1, + 154, 155, 156, -1, -1, -1, 160, -1, 162, 163, + -1, 165, 166, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, 178, -1, -1, 181, 182, 183, + 184, -1, -1, 187, 188, -1, 190, 191, 192, -1, + -1, 195, -1, -1, -1, 199, 200, -1, 202, -1, + 204, -1, 206, 207, 208, 209, 210, 211, 212, -1, + 214, -1, -1, 217, 218, 219, -1, 221, -1, -1, + -1, 225, 226, -1, -1, -1, 230, 231, 232, 233, + 234, -1, -1, -1, 238, 239, 240, -1, -1, 243, + -1, -1, -1, -1, 248, 249, -1, -1, -1, 253, + -1, 255, 256, -1, 258, 259, -1, -1, -1, 263, + -1, -1, 266, 267, 268, -1, -1, 271, -1, -1, + 274, 275, -1, -1, -1, -1, -1, 281, 282, -1, + 284, -1, 286, -1, 288, 289, -1, -1, -1, -1, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, -1, 313, + 314, 315, 316, -1, 318, 319, 320, 321, -1, 323, + 324, 325, -1, -1, -1, -1, 330, 331, 332, 333, + 334, 335, -1, -1, 338, 339, -1, 341, -1, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, -1, -1, 357, -1, -1, 360, 361, 362, 363, + -1, -1, -1, 367, 368, -1, -1, -1, 372, -1, + 374, 375, 376, -1, 378, 379, 380, 381, -1, 383, + 384, -1, -1, -1, -1, -1, -1, -1, -1, 393, + 394, 395, -1, -1, 398, -1, 400, -1, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, 416, -1, 418, -1, 420, 421, 422, 423, + 424, -1, 426, 427, 428, -1, -1, 431, -1, -1, + -1, 435, 436, 437, 438, 439, -1, -1, 442, 443, + 444, 445, 446, -1, 448, 449, -1, 451, 452, 453, + -1, -1, 456, -1, 458, -1, 460, 461, -1, 463, + 464, -1, 466, -1, 468, -1, -1, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, -1, + 484, 485, -1, -1, -1, 489, 490, 491, 492, -1, + -1, -1, 496, -1, -1, -1, 500, -1, 502, 503, + 504, 505, 506, 507, -1, 509, 510, 511, 512, 513, + 514, -1, -1, -1, -1, -1, -1, 521, 522, -1, + 524, -1, -1, 527, -1, -1, -1, 531, 532, 533, + -1, -1, -1, 537, -1, -1, 540, 541, -1, 543, + 544, 545, 546, 547, 548, -1, -1, 551, 552, 553, + 554, -1, 556, 557, -1, -1, 560, 561, 562, 563, + -1, 565, 566, 567, -1, 569, 570, 571, 572, -1, + -1, -1, -1, -1, 578, 579, 580, -1, -1, -1, + 584, 585, 586, 587, -1, 589, 590, -1, 592, 593, + -1, 595, 596, -1, -1, 599, -1, -1, 602, -1, + 604, -1, 606, 607, -1, -1, -1, -1, -1, -1, + 614, -1, -1, 617, -1, -1, -1, 621, 622, 623, + 624, 625, 626, 627, -1, -1, -1, -1, -1, -1, + 634, 635, -1, 637, 638, 639, -1, 5, 642, 7, + 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, + -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, + 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, + -1, 49, -1, 51, 52, -1, -1, 55, -1, -1, + 58, 59, -1, 61, 62, -1, 64, 65, -1, 67, + 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, + 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, + 88, 89, -1, 91, 92, -1, 94, 95, 96, 97, + 98, 99, 100, -1, -1, 103, -1, -1, 106, -1, + 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, + 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, + 128, -1, -1, -1, -1, 133, -1, 135, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, 146, -1, + -1, -1, -1, 151, -1, -1, 154, 155, 156, -1, + -1, -1, 160, -1, 162, 163, -1, 165, 166, 167, + -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, + 178, -1, 180, 181, 182, 183, 184, -1, -1, 187, + 188, -1, 190, 191, 192, -1, -1, 195, -1, -1, + -1, 199, 200, -1, 202, -1, 204, -1, 206, 207, + 208, 209, 210, 211, 212, -1, 214, -1, -1, 217, + 218, 219, -1, 221, -1, -1, -1, 225, 226, -1, + -1, -1, 230, 231, 232, 233, 234, -1, -1, -1, + 238, 239, 240, -1, -1, 243, -1, -1, -1, -1, + 248, 249, -1, -1, -1, 253, -1, 255, 256, -1, + 258, 259, -1, -1, -1, 263, -1, -1, 266, 267, + 268, -1, -1, 271, -1, -1, 274, 275, -1, -1, + -1, -1, -1, 281, 282, -1, 284, -1, 286, -1, + 288, 289, -1, -1, -1, -1, -1, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, -1, 313, 314, 315, 316, -1, + 318, 319, 320, 321, -1, 323, 324, 325, -1, -1, + -1, -1, 330, 331, 332, 333, 334, 335, -1, -1, + 338, 339, -1, 341, -1, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, -1, -1, 357, + -1, -1, 360, 361, 362, 363, -1, -1, -1, 367, + 368, -1, -1, -1, 372, -1, 374, 375, 376, -1, + 378, 379, 380, 381, -1, 383, 384, -1, -1, -1, + -1, -1, -1, -1, -1, 393, 394, 395, -1, -1, + 398, -1, 400, -1, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, 416, -1, + 418, -1, 420, 421, 422, 423, 424, -1, 426, 427, + 428, -1, -1, 431, -1, -1, -1, 435, 436, 437, + 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, + 448, 449, -1, 451, 452, 453, -1, -1, 456, -1, + 458, -1, 460, 461, -1, 463, 464, -1, 466, -1, + 468, -1, -1, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, -1, 484, 485, -1, -1, + -1, 489, 490, 491, 492, -1, -1, -1, 496, -1, + -1, -1, 500, -1, 502, 503, 504, 505, 506, 507, + -1, 509, 510, 511, 512, 513, 514, -1, -1, -1, + -1, -1, -1, 521, 522, -1, 524, -1, -1, 527, + -1, -1, -1, 531, 532, 533, -1, -1, -1, 537, + -1, -1, 540, 541, -1, 543, 544, 545, 546, 547, + 548, -1, -1, 551, 552, 553, 554, -1, 556, 557, + -1, -1, 560, 561, 562, 563, -1, -1, 566, 567, + -1, 569, 570, 571, 572, -1, -1, -1, -1, -1, + 578, 579, 580, -1, -1, -1, 584, 585, 586, 587, + -1, 589, 590, -1, 592, 593, -1, 595, 596, -1, + -1, 599, -1, -1, 602, -1, 604, -1, 606, 607, + -1, -1, -1, -1, -1, -1, 614, -1, -1, 617, + -1, -1, -1, 621, 622, 623, 624, 625, 626, 627, + -1, -1, -1, -1, -1, -1, 634, 635, -1, 637, + 638, 639, -1, 5, 642, 7, 8, 9, 10, 11, + 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, + 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, 34, -1, -1, -1, 38, -1, -1, -1, + 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, + 52, -1, -1, 55, -1, -1, 58, 59, -1, 61, + 62, -1, 64, 65, -1, 67, 68, 69, 70, 71, + 72, -1, 74, 75, 76, 77, 78, 79, 80, -1, + 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, + 92, -1, 94, 95, 96, 97, 98, -1, 100, -1, + -1, 103, -1, -1, 106, -1, 108, -1, -1, 111, + -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, + 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, + -1, 133, -1, 135, -1, -1, -1, -1, 140, -1, + 142, 143, 144, 145, 146, -1, -1, -1, -1, 151, + -1, -1, 154, 155, 156, -1, -1, -1, 160, -1, + 162, 163, -1, 165, 166, 167, -1, 169, 170, -1, + 172, 173, 174, 175, 176, 177, 178, -1, -1, 181, + 182, 183, 184, -1, -1, 187, 188, -1, 190, 191, + 192, -1, -1, 195, -1, -1, -1, 199, 200, -1, + 202, -1, 204, -1, 206, 207, 208, 209, 210, 211, + 212, -1, 214, -1, -1, 217, 218, 219, -1, 221, + -1, -1, -1, 225, 226, -1, -1, -1, 230, 231, + 232, 233, 234, -1, -1, -1, 238, 239, 240, -1, + -1, 243, -1, -1, -1, -1, 248, 249, -1, -1, + -1, 253, -1, 255, 256, -1, 258, 259, -1, -1, + -1, 263, -1, -1, 266, 267, 268, -1, -1, 271, + -1, -1, 274, 275, -1, -1, -1, -1, -1, 281, + 282, -1, 284, -1, 286, -1, 288, 289, -1, -1, + -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + -1, 313, 314, 315, 316, -1, 318, 319, 320, 321, + -1, 323, 324, 325, -1, -1, -1, -1, 330, 331, + 332, 333, 334, 335, -1, -1, 338, 339, -1, 341, + -1, 343, -1, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, -1, -1, 357, -1, -1, 360, 361, + 362, 363, -1, -1, -1, 367, 368, -1, -1, -1, + 372, -1, 374, 375, 376, -1, 378, 379, 380, 381, + -1, 383, 384, -1, -1, -1, -1, -1, -1, -1, + -1, 393, 394, 395, -1, -1, 398, -1, 400, -1, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + -1, -1, 414, 415, 416, -1, 418, -1, 420, 421, + 422, 423, 424, -1, 426, 427, 428, -1, -1, 431, + -1, -1, -1, 435, 436, 437, 438, 439, -1, -1, + 442, 443, 444, 445, 446, -1, 448, 449, -1, 451, + 452, 453, -1, -1, 456, -1, 458, -1, 460, 461, + -1, 463, 464, -1, 466, -1, 468, -1, -1, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, -1, 484, 485, -1, -1, -1, 489, 490, 491, + 492, -1, -1, -1, 496, -1, -1, -1, 500, -1, + 502, 503, 504, 505, 506, 507, -1, 509, 510, 511, + 512, 513, 514, -1, -1, -1, 518, -1, -1, 521, + 522, -1, 524, -1, -1, 527, -1, -1, -1, 531, + 532, 533, -1, -1, -1, 537, -1, -1, 540, 541, + -1, 543, 544, 545, 546, 547, 548, -1, -1, 551, + 552, 553, 554, -1, 556, 557, -1, -1, 560, 561, + 562, 563, -1, -1, 566, 567, -1, 569, 570, 571, + 572, -1, -1, -1, -1, -1, 578, 579, 580, -1, + -1, -1, 584, 585, 586, 587, -1, 589, 590, -1, + 592, 593, -1, 595, 596, -1, -1, 599, -1, -1, + 602, -1, 604, -1, 606, 607, -1, -1, -1, -1, + -1, -1, 614, -1, -1, 617, -1, -1, -1, 621, + 622, 623, 624, 625, 626, 627, -1, -1, -1, -1, + -1, -1, 634, 635, -1, 637, 638, 639, -1, 5, + 642, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, @@ -17011,121 +16616,312 @@ static const yytype_int16 yycheck[] = 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, -1, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, -1, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, -1, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, -1, -1, 295, + -1, -1, -1, -1, 140, -1, 142, 143, 144, 145, + 146, -1, -1, -1, -1, 151, -1, -1, 154, 155, + 156, -1, -1, -1, 160, -1, 162, 163, -1, 165, + 166, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, 178, -1, -1, 181, 182, 183, 184, -1, + -1, 187, 188, -1, 190, 191, 192, -1, -1, 195, + -1, -1, -1, 199, 200, 201, 202, -1, 204, -1, + 206, 207, 208, 209, 210, 211, 212, -1, 214, -1, + -1, 217, 218, 219, -1, 221, -1, -1, -1, 225, + 226, -1, -1, -1, 230, 231, 232, 233, 234, -1, + -1, -1, 238, 239, 240, -1, -1, 243, -1, -1, + -1, -1, 248, 249, -1, -1, -1, 253, -1, 255, + 256, -1, 258, 259, -1, -1, -1, 263, -1, -1, + 266, 267, 268, -1, -1, 271, -1, -1, 274, 275, + -1, -1, -1, -1, -1, 281, 282, -1, 284, -1, + 286, -1, 288, 289, -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, -1, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, -1, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, - 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, - 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, - -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, 97, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, - -1, 132, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, 150, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, 176, 177, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, -1, -1, 194, -1, -1, -1, 198, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, 210, - 211, -1, 213, -1, -1, 216, 217, 218, -1, 220, - -1, -1, -1, 224, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, 248, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, 265, 266, 267, -1, -1, 270, - -1, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, -1, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, 366, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, 382, 383, -1, -1, -1, -1, -1, -1, -1, - -1, 392, 393, 394, -1, -1, 397, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - -1, -1, 413, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, 448, -1, 450, - 451, 452, -1, -1, 455, -1, 457, -1, 459, 460, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, -1, 483, 484, -1, -1, -1, 488, 489, 490, - 491, -1, -1, -1, 495, -1, -1, -1, 499, -1, - 501, 502, 503, 504, 505, 506, -1, 508, 509, 510, - 511, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - 531, 532, -1, -1, -1, 536, -1, -1, 539, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, -1, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, 583, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, 594, 595, -1, -1, 598, -1, -1, - 601, -1, 603, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, 634, -1, 636, 637, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, + 306, 307, 308, 309, 310, 311, -1, 313, 314, 315, + 316, -1, 318, 319, 320, 321, -1, 323, 324, 325, + -1, -1, -1, -1, 330, 331, 332, 333, 334, 335, + -1, -1, 338, 339, -1, 341, -1, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, -1, + -1, 357, -1, -1, 360, 361, 362, 363, -1, -1, + -1, 367, 368, -1, -1, -1, 372, -1, 374, 375, + 376, -1, 378, 379, 380, 381, -1, 383, 384, -1, + -1, -1, -1, -1, -1, -1, -1, 393, 394, 395, + -1, -1, 398, -1, 400, -1, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + 416, -1, 418, -1, 420, 421, 422, 423, 424, -1, + 426, 427, 428, -1, -1, 431, -1, -1, -1, 435, + 436, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, -1, 451, 452, 453, -1, -1, + 456, -1, 458, -1, 460, 461, -1, 463, 464, -1, + 466, -1, 468, -1, -1, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, -1, 484, 485, + -1, -1, -1, 489, 490, 491, 492, -1, -1, -1, + 496, -1, -1, -1, 500, -1, 502, 503, 504, 505, + 506, 507, -1, 509, 510, 511, 512, 513, 514, -1, + -1, -1, -1, -1, -1, 521, 522, -1, 524, -1, + -1, 527, -1, -1, -1, 531, 532, 533, -1, -1, + -1, 537, -1, -1, 540, 541, -1, 543, 544, 545, + 546, 547, 548, -1, -1, 551, 552, 553, 554, -1, + 556, 557, -1, -1, 560, 561, 562, 563, -1, -1, + 566, 567, -1, 569, 570, 571, 572, -1, -1, -1, + -1, -1, 578, 579, 580, -1, -1, -1, 584, 585, + 586, 587, -1, 589, 590, -1, 592, 593, -1, 595, + 596, -1, -1, 599, -1, -1, 602, -1, 604, -1, + 606, 607, -1, -1, -1, -1, -1, -1, 614, -1, + -1, 617, -1, -1, -1, 621, 622, 623, 624, 625, + 626, 627, -1, -1, -1, -1, -1, -1, 634, 635, + -1, 637, 638, 639, -1, 5, 642, 7, 8, 9, + 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, + -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, + -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, + -1, 51, 52, -1, -1, 55, -1, -1, 58, 59, + -1, 61, 62, -1, 64, 65, -1, 67, 68, 69, + 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, + 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, + -1, 91, 92, -1, 94, 95, 96, 97, 98, -1, + 100, -1, -1, 103, -1, -1, 106, -1, 108, -1, + -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, + -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, + -1, -1, 132, 133, -1, 135, -1, -1, -1, -1, + 140, -1, 142, 143, 144, 145, 146, -1, -1, -1, + -1, 151, -1, -1, 154, 155, 156, -1, -1, -1, + 160, -1, 162, 163, -1, 165, 166, 167, -1, 169, + 170, -1, 172, 173, 174, 175, 176, 177, 178, -1, + -1, 181, 182, 183, 184, -1, -1, 187, 188, -1, + 190, 191, 192, -1, -1, 195, -1, -1, -1, 199, + 200, -1, 202, -1, 204, -1, 206, 207, 208, 209, + 210, 211, 212, -1, 214, -1, -1, 217, 218, 219, + -1, 221, -1, -1, -1, 225, 226, -1, -1, -1, + 230, 231, 232, 233, 234, -1, -1, -1, 238, 239, + 240, -1, -1, 243, -1, -1, -1, -1, 248, 249, + -1, -1, -1, 253, -1, 255, 256, -1, 258, 259, + -1, -1, -1, 263, -1, -1, 266, 267, 268, -1, + -1, 271, -1, -1, 274, 275, -1, -1, -1, -1, + -1, 281, 282, -1, 284, -1, 286, -1, 288, 289, + -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, -1, 313, 314, 315, 316, -1, 318, 319, + 320, 321, -1, 323, 324, 325, -1, -1, -1, -1, + 330, 331, 332, 333, 334, 335, -1, -1, 338, 339, + -1, 341, -1, 343, -1, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, -1, -1, 357, -1, -1, + 360, 361, 362, 363, -1, -1, -1, 367, 368, -1, + -1, -1, 372, -1, 374, 375, 376, -1, 378, 379, + 380, 381, -1, 383, 384, -1, -1, -1, -1, -1, + -1, -1, -1, 393, 394, 395, -1, -1, 398, -1, + 400, -1, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, -1, 414, 415, 416, -1, 418, -1, + 420, 421, 422, 423, 424, -1, 426, 427, 428, -1, + -1, 431, -1, -1, -1, 435, 436, 437, 438, 439, + -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, + -1, 451, 452, 453, -1, -1, 456, -1, 458, -1, + 460, 461, -1, 463, 464, -1, 466, -1, 468, -1, + -1, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, -1, 484, 485, -1, -1, -1, 489, + 490, 491, 492, -1, -1, -1, 496, -1, -1, -1, + 500, -1, 502, 503, 504, 505, 506, 507, -1, 509, + 510, 511, 512, 513, 514, -1, -1, -1, -1, -1, + -1, 521, 522, -1, 524, -1, -1, 527, -1, -1, + -1, 531, 532, 533, -1, -1, -1, 537, -1, -1, + 540, 541, -1, 543, 544, 545, 546, 547, 548, -1, + -1, 551, 552, 553, 554, -1, 556, 557, -1, -1, + 560, 561, 562, 563, -1, -1, 566, 567, -1, 569, + 570, 571, 572, -1, -1, -1, -1, -1, 578, 579, + 580, -1, -1, -1, 584, 585, 586, 587, -1, 589, + 590, -1, 592, 593, -1, 595, 596, -1, -1, 599, + -1, -1, 602, -1, 604, -1, 606, 607, -1, -1, + -1, -1, -1, -1, 614, -1, -1, 617, -1, -1, + -1, 621, 622, 623, 624, 625, 626, 627, -1, -1, + -1, -1, -1, -1, 634, 635, -1, 637, 638, 639, + -1, 5, 642, 7, 8, 9, 10, 11, 12, -1, + -1, 15, -1, -1, -1, 19, -1, -1, 22, -1, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, + -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, + -1, 55, -1, -1, 58, 59, -1, 61, 62, -1, + 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, + 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, + 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, + 94, 95, 96, 97, 98, -1, 100, -1, -1, 103, + -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, + -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, + -1, -1, -1, 127, 128, -1, -1, -1, 132, 133, + -1, 135, -1, -1, -1, -1, 140, -1, 142, 143, + 144, 145, 146, -1, -1, -1, -1, 151, -1, -1, + 154, 155, 156, -1, -1, -1, 160, -1, 162, 163, + -1, 165, 166, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, 178, -1, -1, 181, 182, 183, + 184, -1, -1, 187, 188, -1, 190, 191, 192, -1, + -1, 195, -1, -1, -1, 199, 200, -1, 202, -1, + 204, -1, 206, 207, 208, 209, 210, 211, 212, -1, + 214, -1, -1, 217, 218, 219, -1, 221, -1, -1, + -1, 225, 226, -1, -1, -1, 230, 231, 232, 233, + 234, -1, -1, -1, 238, 239, 240, -1, -1, 243, + -1, -1, -1, -1, 248, 249, -1, -1, -1, 253, + -1, 255, 256, -1, 258, 259, -1, -1, -1, 263, + -1, -1, 266, 267, 268, -1, -1, 271, -1, -1, + 274, 275, -1, -1, -1, -1, -1, 281, 282, -1, + 284, -1, 286, -1, 288, 289, -1, -1, -1, -1, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, -1, 313, + 314, 315, 316, -1, 318, 319, 320, 321, -1, 323, + 324, 325, -1, -1, -1, -1, 330, 331, 332, 333, + 334, 335, -1, -1, 338, 339, -1, 341, -1, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, -1, -1, 357, -1, -1, 360, 361, 362, 363, + -1, -1, -1, 367, 368, -1, -1, -1, 372, -1, + 374, 375, 376, -1, 378, 379, 380, 381, -1, 383, + 384, -1, -1, -1, -1, -1, -1, -1, -1, 393, + 394, 395, -1, -1, 398, -1, 400, -1, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, 416, -1, 418, -1, 420, 421, 422, 423, + 424, -1, 426, 427, 428, -1, -1, 431, -1, -1, + -1, 435, 436, 437, 438, 439, -1, -1, 442, 443, + 444, 445, 446, -1, 448, 449, -1, 451, 452, 453, + -1, -1, 456, -1, 458, -1, 460, 461, -1, 463, + 464, -1, 466, -1, 468, -1, -1, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, -1, + 484, 485, -1, -1, -1, 489, 490, 491, 492, -1, + -1, -1, 496, -1, -1, -1, 500, -1, 502, 503, + 504, 505, 506, 507, -1, 509, 510, 511, 512, 513, + 514, -1, -1, -1, -1, -1, -1, 521, 522, -1, + 524, -1, -1, 527, -1, -1, -1, 531, 532, 533, + -1, -1, -1, 537, -1, -1, 540, 541, -1, 543, + 544, 545, 546, 547, 548, -1, -1, 551, 552, 553, + 554, -1, 556, 557, -1, -1, 560, 561, 562, 563, + -1, -1, 566, 567, -1, 569, 570, 571, 572, -1, + -1, -1, -1, -1, 578, 579, 580, -1, -1, -1, + 584, 585, 586, 587, -1, 589, 590, -1, 592, 593, + -1, 595, 596, -1, -1, 599, -1, -1, 602, -1, + 604, -1, 606, 607, -1, -1, -1, -1, -1, -1, + 614, -1, -1, 617, -1, -1, -1, 621, 622, 623, + 624, 625, 626, 627, -1, -1, -1, -1, -1, -1, + 634, 635, -1, 637, 638, 639, -1, 5, 642, 7, + 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, + -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, + 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, + -1, 49, -1, 51, 52, -1, -1, 55, -1, -1, + 58, 59, -1, 61, 62, -1, 64, 65, -1, 67, + 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, + 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, + 88, 89, -1, 91, 92, -1, 94, 95, 96, 97, + 98, -1, 100, -1, -1, 103, -1, -1, 106, -1, + 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, + 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, + 128, -1, -1, -1, 132, 133, -1, 135, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, 146, -1, + -1, -1, -1, 151, -1, -1, 154, 155, 156, -1, + -1, -1, 160, -1, 162, 163, -1, 165, 166, 167, + -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, + 178, -1, -1, 181, 182, 183, 184, -1, -1, 187, + 188, -1, 190, 191, 192, -1, -1, 195, -1, -1, + -1, 199, 200, -1, 202, -1, 204, -1, 206, 207, + 208, 209, 210, 211, 212, -1, 214, -1, -1, 217, + 218, 219, -1, 221, -1, -1, -1, 225, 226, -1, + -1, -1, 230, 231, 232, 233, 234, -1, -1, -1, + 238, 239, 240, -1, -1, 243, -1, -1, -1, -1, + 248, 249, -1, -1, -1, 253, -1, 255, 256, -1, + 258, 259, -1, -1, -1, 263, -1, -1, 266, 267, + 268, -1, -1, 271, -1, -1, 274, 275, -1, -1, + -1, -1, -1, 281, 282, -1, 284, -1, 286, -1, + 288, 289, -1, -1, -1, -1, -1, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, -1, 313, 314, 315, 316, -1, + 318, 319, 320, 321, -1, 323, 324, 325, -1, -1, + -1, -1, 330, 331, 332, 333, 334, 335, -1, -1, + 338, 339, -1, 341, -1, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, -1, -1, 357, + -1, -1, 360, 361, 362, 363, -1, -1, -1, 367, + 368, -1, -1, -1, 372, -1, 374, 375, 376, -1, + 378, 379, 380, 381, -1, 383, 384, -1, -1, -1, + -1, -1, -1, -1, -1, 393, 394, 395, -1, -1, + 398, -1, 400, -1, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, 416, -1, + 418, -1, 420, 421, 422, 423, 424, -1, 426, 427, + 428, -1, -1, 431, -1, -1, -1, 435, 436, 437, + 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, + 448, 449, -1, 451, 452, 453, -1, -1, 456, -1, + 458, -1, 460, 461, -1, 463, 464, -1, 466, -1, + 468, -1, -1, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, -1, 484, 485, -1, -1, + -1, 489, 490, 491, 492, -1, -1, -1, 496, -1, + -1, -1, 500, -1, 502, 503, 504, 505, 506, 507, + -1, 509, 510, 511, 512, 513, 514, -1, -1, -1, + -1, -1, -1, 521, 522, -1, 524, -1, -1, 527, + -1, -1, -1, 531, 532, 533, -1, -1, -1, 537, + -1, -1, 540, 541, -1, 543, 544, 545, 546, 547, + 548, -1, -1, 551, 552, 553, 554, -1, 556, 557, + -1, -1, 560, 561, 562, 563, -1, -1, 566, 567, + -1, 569, 570, 571, 572, -1, -1, -1, -1, -1, + 578, 579, 580, -1, -1, -1, 584, 585, 586, 587, + -1, 589, 590, -1, 592, 593, -1, 595, 596, -1, + -1, 599, -1, -1, 602, -1, 604, -1, 606, 607, + -1, -1, -1, -1, -1, -1, 614, -1, -1, 617, + -1, -1, -1, 621, 622, 623, 624, 625, 626, 627, + -1, -1, -1, -1, -1, -1, 634, 635, -1, 637, + 638, 639, -1, 5, 642, 7, 8, 9, 10, 11, + 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, + 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, 34, -1, -1, -1, 38, -1, -1, -1, + 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, + 52, -1, -1, 55, -1, -1, 58, 59, -1, 61, + 62, -1, 64, 65, -1, 67, 68, 69, 70, 71, + 72, -1, 74, 75, 76, 77, 78, 79, 80, -1, + 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, + 92, -1, 94, 95, 96, 97, 98, -1, 100, -1, + -1, 103, -1, -1, 106, -1, 108, -1, -1, 111, + -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, + 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, + -1, 133, -1, 135, -1, -1, -1, -1, 140, -1, + 142, 143, 144, 145, 146, -1, -1, -1, -1, 151, + -1, -1, 154, 155, 156, -1, -1, -1, 160, -1, + 162, 163, -1, 165, 166, 167, -1, 169, 170, -1, + 172, 173, 174, 175, 176, 177, 178, -1, -1, 181, + 182, 183, 184, -1, -1, 187, 188, -1, 190, 191, + 192, -1, -1, 195, -1, -1, -1, 199, 200, -1, + 202, -1, 204, -1, 206, 207, 208, 209, 210, 211, + 212, -1, 214, -1, -1, 217, 218, 219, -1, 221, + -1, -1, -1, 225, 226, -1, -1, -1, 230, 231, + 232, 233, 234, -1, -1, -1, 238, 239, 240, -1, + -1, 243, -1, -1, -1, -1, 248, 249, -1, -1, + -1, 253, -1, 255, 256, -1, 258, 259, -1, -1, + -1, 263, -1, -1, 266, 267, 268, -1, -1, 271, + -1, -1, 274, 275, -1, -1, -1, -1, -1, 281, + 282, -1, 284, -1, 286, -1, 288, 289, -1, -1, + -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + -1, 313, 314, 315, 316, -1, 318, 319, 320, 321, + -1, 323, 324, 325, -1, -1, -1, -1, 330, 331, + 332, 333, 334, 335, -1, -1, 338, 339, -1, 341, + -1, 343, -1, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, -1, -1, 357, -1, -1, 360, 361, + 362, 363, -1, -1, -1, 367, 368, -1, -1, -1, + 372, -1, 374, 375, 376, -1, 378, 379, 380, 381, + -1, 383, 384, -1, -1, -1, -1, -1, -1, -1, + -1, 393, 394, 395, -1, -1, 398, -1, 400, -1, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + -1, -1, 414, 415, 416, 417, 418, -1, 420, 421, + 422, 423, 424, -1, 426, 427, 428, -1, -1, 431, + -1, -1, -1, 435, 436, 437, 438, 439, -1, -1, + 442, 443, 444, 445, 446, -1, 448, 449, -1, 451, + 452, 453, -1, -1, 456, -1, 458, -1, 460, 461, + -1, 463, 464, -1, 466, -1, 468, -1, -1, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, -1, 484, 485, -1, -1, -1, 489, 490, 491, + 492, -1, -1, -1, 496, -1, -1, -1, 500, -1, + 502, 503, 504, 505, 506, 507, -1, 509, 510, 511, + 512, 513, 514, -1, -1, -1, -1, -1, -1, 521, + 522, -1, 524, -1, -1, 527, -1, -1, -1, 531, + 532, 533, -1, -1, -1, 537, -1, -1, 540, 541, + -1, 543, 544, 545, 546, 547, 548, -1, -1, 551, + 552, 553, 554, -1, 556, 557, -1, -1, 560, 561, + 562, 563, -1, -1, 566, 567, -1, 569, 570, 571, + 572, -1, -1, -1, -1, -1, 578, 579, 580, -1, + -1, -1, 584, 585, 586, 587, -1, 589, 590, -1, + 592, 593, -1, 595, 596, -1, -1, 599, -1, -1, + 602, -1, 604, -1, 606, 607, -1, -1, -1, -1, + -1, -1, 614, -1, -1, 617, -1, -1, -1, 621, + 622, 623, 624, 625, 626, 627, -1, -1, -1, -1, + -1, -1, 634, 635, -1, 637, 638, 639, -1, 5, + 642, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, @@ -17138,121 +16934,312 @@ static const yytype_int16 yycheck[] = 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, -1, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, -1, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, -1, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, -1, -1, 295, + -1, -1, -1, -1, 140, -1, 142, 143, 144, 145, + 146, -1, -1, -1, -1, 151, -1, -1, 154, 155, + 156, -1, -1, -1, 160, -1, 162, 163, -1, 165, + 166, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, 178, -1, -1, 181, 182, 183, 184, -1, + -1, 187, 188, -1, 190, 191, 192, -1, -1, 195, + -1, -1, -1, 199, 200, -1, 202, -1, 204, -1, + 206, 207, 208, 209, 210, 211, 212, -1, 214, -1, + -1, 217, 218, 219, -1, 221, -1, -1, -1, 225, + 226, -1, -1, -1, 230, 231, 232, 233, 234, -1, + -1, -1, 238, 239, 240, -1, -1, 243, -1, -1, + -1, -1, 248, 249, -1, -1, -1, 253, -1, 255, + 256, -1, 258, 259, -1, -1, -1, 263, -1, -1, + 266, 267, 268, -1, -1, 271, -1, -1, 274, 275, + -1, -1, -1, -1, -1, 281, 282, -1, 284, -1, + 286, -1, 288, 289, -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - 416, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, -1, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, -1, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, - 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - 51, 52, -1, -1, 55, -1, -1, 58, 59, -1, - 61, 62, -1, 64, 65, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, 76, 77, 78, 79, 80, - -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, 97, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, - -1, -1, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, 150, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, 176, 177, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, -1, -1, 194, -1, -1, -1, 198, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, 210, - 211, -1, 213, -1, -1, 216, 217, 218, -1, 220, - -1, -1, -1, 224, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, 248, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, 265, 266, 267, -1, -1, 270, - -1, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, -1, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, 366, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, 382, 383, -1, -1, -1, -1, -1, -1, -1, - -1, 392, 393, 394, -1, -1, 397, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - -1, -1, 413, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, 448, -1, 450, - 451, 452, -1, -1, 455, -1, 457, -1, 459, 460, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, -1, 483, 484, -1, -1, -1, 488, 489, 490, - 491, -1, -1, -1, 495, -1, -1, -1, 499, -1, - 501, 502, 503, 504, 505, 506, -1, 508, 509, 510, - 511, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - 531, 532, -1, -1, -1, 536, -1, -1, 539, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, -1, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, 583, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, 594, 595, -1, -1, 598, -1, -1, - 601, -1, 603, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, 634, -1, 636, 637, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, + 306, 307, 308, 309, 310, 311, -1, 313, 314, 315, + 316, -1, 318, 319, 320, 321, -1, 323, 324, 325, + -1, -1, -1, -1, 330, 331, 332, 333, 334, 335, + -1, -1, 338, 339, -1, 341, -1, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, -1, + -1, 357, -1, -1, 360, 361, 362, 363, -1, -1, + -1, 367, 368, -1, -1, -1, 372, -1, 374, 375, + 376, -1, 378, 379, 380, 381, -1, 383, 384, -1, + -1, -1, -1, -1, -1, -1, -1, 393, 394, 395, + -1, -1, 398, -1, 400, -1, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + 416, -1, 418, -1, 420, 421, 422, 423, 424, -1, + 426, 427, 428, -1, -1, 431, -1, -1, -1, 435, + 436, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, -1, 451, 452, 453, -1, -1, + 456, -1, 458, -1, 460, 461, -1, 463, 464, -1, + 466, -1, 468, -1, -1, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, -1, 484, 485, + -1, -1, -1, 489, 490, 491, 492, -1, -1, -1, + 496, -1, -1, -1, 500, -1, 502, 503, 504, 505, + 506, 507, -1, 509, 510, 511, 512, 513, 514, -1, + -1, -1, -1, -1, -1, 521, 522, -1, 524, -1, + -1, 527, -1, -1, -1, 531, 532, 533, -1, -1, + -1, 537, -1, -1, 540, 541, -1, 543, 544, 545, + 546, 547, 548, -1, -1, 551, 552, 553, 554, -1, + 556, 557, -1, -1, 560, 561, 562, 563, -1, 565, + 566, 567, -1, 569, 570, 571, 572, -1, -1, -1, + -1, -1, 578, 579, 580, -1, -1, -1, 584, 585, + 586, 587, -1, 589, 590, -1, 592, 593, -1, 595, + 596, -1, -1, 599, -1, -1, 602, -1, 604, -1, + 606, 607, -1, -1, -1, -1, -1, -1, 614, -1, + -1, 617, -1, -1, -1, 621, 622, 623, 624, 625, + 626, 627, -1, -1, -1, -1, -1, -1, 634, 635, + -1, 637, 638, 639, -1, 5, 642, 7, 8, 9, + 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, + -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, + -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, + -1, 51, 52, -1, -1, 55, -1, -1, 58, 59, + -1, 61, 62, -1, 64, 65, -1, 67, 68, 69, + 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, + 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, + -1, 91, 92, -1, 94, 95, 96, 97, 98, -1, + 100, -1, -1, 103, -1, -1, 106, -1, 108, -1, + -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, + -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, + -1, -1, 132, 133, -1, 135, -1, -1, -1, -1, + 140, -1, 142, 143, 144, 145, 146, -1, -1, -1, + -1, 151, -1, -1, 154, 155, 156, -1, -1, -1, + 160, -1, 162, 163, -1, 165, 166, 167, -1, 169, + 170, -1, 172, 173, 174, 175, 176, 177, 178, -1, + -1, 181, 182, 183, 184, -1, -1, 187, 188, -1, + 190, 191, 192, -1, -1, 195, -1, -1, -1, 199, + 200, -1, 202, -1, 204, -1, 206, 207, 208, 209, + 210, 211, 212, -1, 214, -1, -1, 217, 218, 219, + -1, 221, -1, -1, -1, 225, 226, -1, -1, -1, + 230, 231, 232, 233, 234, -1, -1, -1, 238, 239, + 240, -1, -1, 243, -1, -1, -1, -1, 248, 249, + -1, -1, -1, 253, -1, 255, 256, -1, 258, 259, + -1, -1, -1, 263, -1, -1, 266, 267, 268, -1, + -1, 271, -1, -1, 274, 275, -1, -1, -1, -1, + -1, 281, 282, -1, 284, -1, 286, -1, 288, 289, + -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, -1, 313, 314, 315, 316, -1, 318, 319, + 320, 321, -1, 323, 324, 325, -1, -1, -1, -1, + 330, 331, 332, 333, 334, 335, -1, -1, 338, 339, + -1, 341, -1, 343, -1, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, -1, -1, 357, -1, -1, + 360, 361, 362, 363, -1, -1, -1, 367, 368, -1, + -1, -1, 372, -1, 374, 375, 376, -1, 378, 379, + 380, 381, -1, 383, 384, -1, -1, -1, -1, -1, + -1, -1, -1, 393, 394, 395, -1, -1, 398, -1, + 400, -1, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, -1, 414, 415, 416, -1, 418, -1, + 420, 421, 422, 423, 424, -1, 426, 427, 428, -1, + -1, 431, -1, -1, -1, 435, 436, 437, 438, 439, + -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, + -1, 451, 452, 453, -1, -1, 456, -1, 458, -1, + 460, 461, -1, 463, 464, -1, 466, -1, 468, -1, + -1, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, -1, 484, 485, -1, -1, -1, 489, + 490, 491, 492, -1, -1, -1, 496, -1, -1, -1, + 500, -1, 502, 503, 504, 505, 506, 507, -1, 509, + 510, 511, 512, 513, 514, -1, -1, -1, -1, -1, + -1, 521, 522, -1, 524, -1, -1, 527, -1, -1, + -1, 531, 532, 533, -1, -1, -1, 537, -1, -1, + 540, 541, -1, 543, 544, 545, 546, 547, 548, -1, + -1, 551, 552, 553, 554, -1, 556, 557, -1, -1, + 560, 561, 562, 563, -1, -1, 566, 567, -1, 569, + 570, 571, 572, -1, -1, -1, -1, -1, 578, 579, + 580, -1, -1, -1, 584, 585, 586, 587, -1, 589, + 590, -1, 592, 593, -1, 595, 596, -1, -1, 599, + -1, -1, 602, -1, 604, -1, 606, 607, -1, -1, + -1, -1, -1, -1, 614, -1, -1, 617, -1, -1, + -1, 621, 622, 623, 624, 625, 626, 627, -1, -1, + -1, -1, -1, -1, 634, 635, -1, 637, 638, 639, + -1, 5, 642, 7, 8, 9, 10, 11, 12, 13, + -1, 15, -1, -1, -1, 19, -1, -1, 22, -1, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, + -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, + -1, 55, -1, -1, 58, 59, -1, 61, 62, -1, + 64, 65, -1, 67, 68, 69, 70, 71, 72, -1, + 74, 75, 76, 77, 78, 79, 80, -1, 82, 83, + 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, + 94, 95, 96, 97, 98, -1, 100, -1, -1, 103, + -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, + -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, + -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, + -1, 135, -1, -1, -1, -1, 140, -1, 142, 143, + 144, 145, 146, -1, -1, -1, -1, 151, -1, -1, + 154, 155, 156, -1, -1, -1, 160, -1, 162, 163, + -1, 165, 166, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, 177, 178, -1, -1, 181, 182, 183, + 184, -1, -1, 187, 188, -1, 190, 191, 192, -1, + -1, 195, -1, -1, -1, 199, 200, -1, 202, -1, + 204, -1, 206, 207, 208, 209, 210, 211, 212, -1, + 214, -1, -1, 217, 218, 219, -1, 221, -1, -1, + -1, 225, 226, -1, -1, -1, 230, 231, 232, 233, + 234, -1, -1, -1, 238, 239, 240, -1, -1, 243, + -1, -1, -1, -1, 248, 249, -1, -1, -1, 253, + -1, 255, 256, -1, 258, 259, -1, -1, -1, 263, + -1, -1, 266, 267, 268, -1, -1, 271, -1, -1, + 274, 275, -1, -1, -1, -1, -1, 281, 282, -1, + 284, -1, 286, -1, 288, 289, -1, -1, -1, -1, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, -1, 313, + 314, 315, 316, -1, 318, 319, 320, 321, -1, 323, + 324, 325, -1, -1, -1, -1, 330, 331, 332, 333, + 334, 335, -1, -1, 338, 339, -1, 341, -1, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, -1, -1, 357, -1, -1, 360, 361, 362, 363, + -1, -1, -1, 367, 368, -1, -1, -1, 372, -1, + 374, 375, 376, -1, 378, 379, 380, 381, -1, 383, + 384, -1, -1, -1, -1, -1, -1, -1, -1, 393, + 394, 395, -1, -1, 398, -1, 400, -1, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, -1, + 414, 415, 416, -1, 418, -1, 420, 421, 422, 423, + 424, -1, 426, 427, 428, -1, -1, 431, -1, -1, + -1, 435, 436, 437, 438, 439, -1, -1, 442, 443, + 444, 445, 446, -1, 448, 449, -1, 451, 452, 453, + -1, -1, 456, -1, 458, -1, 460, 461, -1, 463, + 464, -1, 466, -1, 468, -1, -1, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, -1, + 484, 485, -1, -1, -1, 489, 490, 491, 492, -1, + -1, -1, 496, -1, -1, -1, 500, -1, 502, 503, + 504, 505, 506, 507, -1, 509, 510, 511, 512, 513, + 514, -1, -1, -1, -1, -1, -1, 521, 522, -1, + 524, -1, -1, 527, -1, -1, -1, 531, 532, 533, + -1, -1, -1, 537, -1, -1, 540, 541, -1, 543, + 544, 545, 546, 547, 548, -1, -1, 551, 552, 553, + 554, -1, 556, 557, -1, -1, 560, 561, 562, 563, + -1, -1, 566, 567, -1, 569, 570, 571, 572, -1, + -1, -1, -1, -1, 578, 579, 580, -1, -1, -1, + 584, 585, 586, 587, -1, 589, 590, -1, 592, 593, + -1, 595, 596, -1, -1, 599, -1, -1, 602, -1, + 604, -1, 606, 607, -1, -1, -1, -1, -1, -1, + 614, -1, -1, 617, -1, -1, -1, 621, 622, 623, + 624, 625, 626, 627, -1, -1, -1, -1, -1, -1, + 634, 635, -1, 637, 638, 639, -1, 5, 642, 7, + 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, + -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, + 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, + -1, 49, -1, 51, 52, -1, -1, 55, -1, -1, + 58, 59, -1, 61, 62, -1, 64, 65, -1, 67, + 68, 69, 70, 71, 72, -1, 74, 75, 76, 77, + 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, + 88, 89, -1, 91, 92, -1, 94, 95, 96, 97, + 98, -1, 100, -1, -1, 103, -1, -1, 106, -1, + 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, + 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, + 128, -1, -1, -1, 132, 133, -1, 135, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, 146, -1, + -1, -1, -1, 151, -1, -1, 154, 155, 156, -1, + -1, -1, 160, -1, 162, 163, -1, 165, 166, 167, + -1, 169, 170, -1, 172, 173, 174, 175, 176, 177, + 178, -1, -1, 181, 182, 183, 184, -1, -1, 187, + 188, -1, 190, 191, 192, -1, -1, 195, -1, -1, + -1, 199, 200, -1, 202, -1, 204, -1, 206, 207, + 208, 209, 210, 211, 212, -1, 214, -1, -1, 217, + 218, 219, -1, 221, -1, -1, -1, 225, 226, -1, + -1, -1, 230, 231, 232, 233, 234, -1, -1, -1, + 238, 239, 240, -1, -1, 243, -1, -1, -1, -1, + 248, 249, -1, -1, -1, 253, -1, 255, 256, -1, + 258, 259, -1, -1, -1, 263, -1, -1, 266, 267, + 268, -1, -1, 271, -1, -1, 274, 275, -1, -1, + -1, -1, -1, 281, 282, -1, 284, -1, 286, -1, + 288, 289, -1, -1, -1, -1, -1, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, -1, 313, 314, 315, 316, -1, + 318, 319, 320, 321, -1, 323, 324, 325, -1, -1, + -1, -1, 330, 331, 332, 333, 334, 335, -1, -1, + 338, 339, -1, 341, -1, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, -1, -1, 357, + -1, -1, 360, 361, 362, 363, -1, -1, -1, 367, + 368, -1, -1, -1, 372, -1, 374, 375, 376, -1, + 378, 379, 380, 381, -1, 383, 384, -1, -1, -1, + -1, -1, -1, -1, -1, 393, 394, 395, -1, -1, + 398, -1, 400, -1, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, -1, 414, 415, 416, -1, + 418, -1, 420, 421, 422, 423, 424, -1, 426, 427, + 428, -1, -1, 431, -1, -1, -1, 435, 436, 437, + 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, + 448, 449, -1, 451, 452, 453, -1, -1, 456, -1, + 458, -1, 460, 461, -1, 463, 464, -1, 466, -1, + 468, -1, -1, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, -1, 484, 485, -1, -1, + -1, 489, 490, 491, 492, -1, -1, -1, 496, -1, + -1, -1, 500, -1, 502, 503, 504, 505, 506, 507, + -1, 509, 510, 511, 512, 513, 514, -1, -1, -1, + -1, -1, -1, 521, 522, -1, 524, -1, -1, 527, + -1, -1, -1, 531, 532, 533, -1, -1, -1, 537, + -1, -1, 540, 541, -1, 543, 544, 545, 546, 547, + 548, -1, -1, 551, 552, 553, 554, -1, 556, 557, + -1, -1, 560, 561, 562, 563, -1, -1, 566, 567, + -1, 569, 570, 571, 572, -1, -1, -1, -1, -1, + 578, 579, 580, -1, -1, -1, 584, 585, 586, 587, + -1, 589, 590, -1, 592, 593, -1, 595, 596, -1, + -1, 599, -1, -1, 602, -1, 604, -1, 606, 607, + -1, -1, -1, -1, -1, -1, 614, -1, -1, 617, + -1, -1, -1, 621, 622, 623, 624, 625, 626, 627, + -1, -1, -1, -1, -1, -1, 634, 635, -1, 637, + 638, 639, -1, 5, 642, 7, 8, 9, 10, 11, + 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, + 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, 34, -1, -1, -1, 38, -1, -1, -1, + 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, + 52, -1, -1, 55, -1, -1, 58, 59, -1, 61, + 62, -1, 64, 65, -1, 67, 68, 69, 70, 71, + 72, -1, 74, 75, 76, 77, 78, 79, 80, -1, + 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, + 92, -1, 94, 95, 96, 97, 98, -1, 100, -1, + -1, 103, -1, -1, 106, -1, 108, -1, -1, 111, + -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, + 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, + -1, 133, -1, 135, -1, -1, -1, -1, 140, -1, + 142, 143, 144, 145, 146, -1, -1, -1, -1, 151, + -1, -1, 154, 155, 156, -1, -1, -1, 160, -1, + 162, 163, -1, 165, 166, 167, -1, 169, 170, -1, + 172, 173, 174, 175, 176, 177, 178, -1, -1, 181, + 182, 183, 184, -1, -1, 187, 188, -1, 190, 191, + 192, -1, -1, 195, -1, -1, -1, 199, 200, -1, + 202, -1, 204, -1, 206, 207, 208, 209, 210, 211, + 212, -1, 214, -1, -1, 217, 218, 219, -1, 221, + -1, -1, -1, 225, 226, -1, -1, -1, 230, 231, + 232, 233, 234, -1, -1, -1, 238, 239, 240, -1, + -1, 243, -1, -1, -1, -1, 248, 249, -1, -1, + -1, 253, -1, 255, 256, -1, 258, 259, -1, -1, + -1, 263, -1, -1, 266, 267, 268, -1, -1, 271, + -1, -1, 274, 275, -1, -1, -1, -1, -1, 281, + 282, -1, 284, -1, 286, -1, 288, 289, -1, -1, + -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + -1, 313, 314, 315, 316, -1, 318, 319, 320, 321, + -1, 323, 324, 325, -1, -1, -1, -1, 330, 331, + 332, 333, 334, 335, -1, -1, 338, 339, -1, 341, + -1, 343, -1, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, -1, -1, 357, -1, -1, 360, 361, + 362, 363, -1, -1, -1, 367, 368, -1, -1, -1, + 372, -1, 374, 375, 376, -1, 378, 379, 380, 381, + -1, 383, 384, -1, -1, -1, -1, -1, -1, -1, + -1, 393, 394, 395, -1, -1, 398, -1, 400, -1, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + -1, -1, 414, 415, 416, 417, 418, -1, 420, 421, + 422, 423, 424, -1, 426, 427, 428, -1, -1, 431, + -1, -1, -1, 435, 436, 437, 438, 439, -1, -1, + 442, 443, 444, 445, 446, -1, 448, 449, -1, 451, + 452, 453, -1, -1, 456, -1, 458, -1, 460, 461, + -1, 463, 464, -1, 466, -1, 468, -1, -1, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, -1, 484, 485, -1, -1, -1, 489, 490, 491, + 492, -1, -1, -1, 496, -1, -1, -1, 500, -1, + 502, 503, 504, 505, 506, 507, -1, 509, 510, 511, + 512, 513, 514, -1, -1, -1, -1, -1, -1, 521, + 522, -1, 524, -1, -1, 527, -1, -1, -1, 531, + 532, 533, -1, -1, -1, 537, -1, -1, 540, 541, + -1, 543, 544, 545, 546, 547, 548, -1, -1, 551, + 552, 553, 554, -1, 556, 557, -1, -1, 560, 561, + 562, 563, -1, -1, 566, 567, -1, 569, 570, 571, + 572, -1, -1, -1, -1, -1, 578, 579, 580, -1, + -1, -1, 584, 585, 586, 587, -1, 589, 590, -1, + 592, 593, -1, 595, 596, -1, -1, 599, -1, -1, + 602, -1, 604, -1, 606, 607, -1, -1, -1, -1, + -1, -1, 614, -1, -1, 617, -1, -1, -1, 621, + 622, 623, 624, 625, 626, 627, -1, -1, -1, -1, + -1, -1, 634, 635, -1, 637, 638, 639, -1, 5, + 642, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, @@ -17265,375 +17252,312 @@ static const yytype_int16 yycheck[] = 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, -1, -1, -1, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, 150, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - 176, 177, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, -1, 189, 190, 191, -1, -1, 194, -1, - -1, -1, 198, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, 210, 211, -1, 213, -1, -1, - 216, 217, 218, -1, 220, -1, -1, -1, 224, 225, - -1, -1, -1, 229, 230, 231, 232, 233, -1, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, 248, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, -1, -1, -1, 262, -1, -1, 265, - 266, 267, -1, -1, 270, -1, -1, 273, 274, -1, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, -1, -1, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - 366, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, 382, 383, -1, -1, - -1, -1, -1, -1, -1, -1, 392, 393, 394, -1, - -1, 397, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, 410, -1, -1, 413, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, 448, -1, 450, 451, 452, -1, -1, 455, - -1, 457, -1, 459, 460, -1, 462, 463, -1, 465, - -1, 467, -1, -1, 470, 471, 472, 473, 474, 475, - 476, 477, 478, 479, 480, 481, -1, 483, 484, -1, - -1, -1, 488, 489, 490, 491, -1, -1, -1, 495, - -1, -1, -1, 499, -1, 501, 502, 503, 504, 505, - 506, -1, 508, 509, 510, 511, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, 531, 532, -1, -1, -1, - 536, -1, -1, 539, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, -1, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, 583, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, 594, 595, - -1, -1, 598, -1, -1, 601, -1, 603, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, -1, -1, -1, -1, 633, 634, -1, - 636, 637, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, -1, -1, 24, 25, 26, 27, 28, 29, 30, - 31, -1, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - -1, -1, -1, -1, 55, 56, -1, 58, 59, -1, - 61, -1, -1, -1, -1, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, -1, -1, -1, -1, -1, - -1, 82, -1, 84, -1, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, -1, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, -1, -1, -1, - -1, -1, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, -1, - -1, -1, 153, 154, 155, -1, 157, 158, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, -1, -1, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, 188, 189, 190, - 191, -1, -1, -1, -1, -1, -1, -1, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, -1, - 211, -1, 213, -1, -1, -1, 217, 218, -1, -1, - -1, -1, -1, -1, 225, -1, -1, -1, 229, 230, - 231, 232, 233, 234, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, -1, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, 259, -1, - -1, 262, -1, -1, -1, 266, 267, -1, -1, 270, - 271, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, 293, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, -1, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 393, 394, -1, -1, -1, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, -1, - -1, -1, -1, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, -1, -1, 450, - -1, 452, 453, -1, 455, -1, -1, -1, 459, -1, - -1, 462, 463, -1, 465, 466, 467, -1, -1, 470, - -1, 472, 473, 474, 475, 476, 477, 478, -1, 480, - 481, -1, 483, -1, -1, -1, -1, 488, 489, 490, - -1, -1, -1, -1, 495, -1, -1, -1, -1, -1, - -1, 502, -1, -1, 505, 506, -1, 508, -1, 510, - -1, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - -1, 532, -1, -1, -1, 536, -1, -1, -1, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, -1, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, -1, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, -1, -1, -1, -1, 598, -1, -1, - 601, -1, -1, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, 629, -1, - -1, -1, 633, -1, -1, 636, -1, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, - -1, -1, -1, 19, -1, -1, -1, -1, 24, 25, - 26, 27, 28, 29, 30, 31, -1, -1, 34, -1, - -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, - 46, 47, -1, 49, -1, -1, -1, -1, -1, 55, - 56, -1, 58, 59, -1, 61, -1, -1, -1, -1, - -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, - -1, -1, -1, -1, -1, -1, 82, -1, 84, -1, - 86, 87, 88, 89, -1, 91, 92, -1, 94, 95, - 96, -1, 98, -1, 100, -1, -1, 103, -1, -1, - 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, - -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, - -1, 127, -1, -1, -1, -1, -1, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, -1, -1, -1, 153, 154, 155, - -1, 157, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - -1, -1, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, - -1, -1, -1, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, -1, 211, -1, 213, -1, -1, - -1, 217, 218, -1, -1, -1, -1, -1, -1, 225, - -1, -1, -1, 229, 230, 231, 232, 233, 234, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, -1, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, 259, -1, -1, 262, -1, -1, -1, - 266, 267, -1, -1, 270, 271, -1, 273, 274, -1, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, 293, -1, 295, + -1, -1, -1, -1, 140, -1, 142, 143, 144, 145, + 146, -1, -1, -1, -1, 151, -1, -1, 154, 155, + 156, -1, -1, -1, 160, -1, 162, 163, -1, 165, + 166, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, 177, 178, -1, -1, 181, 182, 183, 184, -1, + -1, 187, 188, -1, 190, 191, 192, -1, -1, 195, + -1, -1, -1, 199, 200, -1, 202, -1, 204, -1, + 206, 207, 208, 209, 210, 211, 212, -1, 214, -1, + -1, 217, 218, 219, -1, 221, -1, -1, -1, 225, + 226, -1, -1, -1, 230, 231, 232, 233, 234, -1, + -1, -1, 238, 239, 240, -1, -1, 243, -1, -1, + -1, -1, 248, 249, -1, -1, -1, 253, -1, 255, + 256, -1, 258, 259, -1, -1, -1, 263, -1, -1, + 266, 267, 268, -1, -1, 271, -1, -1, 274, 275, + -1, -1, -1, -1, -1, 281, 282, -1, 284, -1, + 286, -1, 288, 289, -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - -1, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 393, 394, -1, - -1, -1, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, -1, -1, -1, -1, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, -1, -1, 450, -1, 452, 453, -1, 455, - -1, -1, -1, 459, -1, -1, 462, 463, -1, 465, - 466, 467, -1, -1, 470, -1, 472, 473, 474, 475, - 476, 477, 478, -1, 480, 481, -1, 483, -1, -1, - -1, -1, 488, 489, 490, -1, -1, -1, -1, 495, - -1, -1, -1, -1, -1, -1, 502, -1, -1, 505, - 506, -1, 508, -1, 510, -1, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, -1, 532, -1, -1, -1, - 536, -1, -1, -1, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, -1, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, -1, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, -1, -1, - -1, -1, 598, -1, -1, 601, -1, -1, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, 627, -1, 629, -1, -1, -1, 633, -1, -1, - 636, -1, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, -1, -1, 24, 25, 26, 27, 28, 29, 30, - 31, -1, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - -1, -1, -1, -1, 55, 56, -1, 58, 59, -1, - 61, -1, -1, -1, -1, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, -1, -1, -1, -1, -1, - -1, 82, -1, 84, -1, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, -1, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, -1, -1, -1, - -1, -1, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, -1, - -1, -1, 153, 154, 155, -1, 157, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, -1, -1, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, 188, 189, 190, - 191, -1, -1, -1, -1, -1, -1, -1, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, -1, - 211, -1, 213, -1, -1, -1, 217, 218, -1, -1, - -1, -1, -1, -1, 225, -1, -1, -1, 229, 230, - 231, 232, 233, 234, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, -1, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, 259, -1, - -1, 262, -1, -1, -1, 266, 267, -1, -1, 270, - 271, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, 293, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, -1, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, + 306, 307, 308, 309, 310, 311, -1, 313, 314, 315, + 316, -1, 318, 319, 320, 321, -1, 323, 324, 325, + -1, -1, -1, -1, 330, 331, 332, 333, 334, 335, + -1, -1, 338, 339, -1, 341, -1, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, -1, + -1, 357, -1, -1, 360, 361, 362, 363, -1, -1, + -1, 367, 368, -1, -1, -1, 372, -1, 374, 375, + 376, -1, 378, 379, 380, 381, -1, 383, 384, -1, + -1, -1, -1, -1, -1, -1, -1, 393, 394, 395, + -1, -1, 398, -1, 400, -1, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, -1, 414, 415, + 416, -1, 418, -1, 420, 421, 422, 423, 424, -1, + 426, 427, 428, -1, -1, 431, -1, -1, -1, 435, + 436, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, -1, 451, 452, 453, -1, -1, + 456, -1, 458, -1, 460, 461, -1, 463, 464, -1, + 466, -1, 468, -1, -1, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, -1, 484, 485, + -1, -1, -1, 489, 490, 491, 492, -1, -1, -1, + 496, -1, -1, -1, 500, -1, 502, 503, 504, 505, + 506, 507, -1, 509, 510, 511, 512, 513, 514, -1, + -1, -1, -1, -1, -1, 521, 522, -1, 524, -1, + -1, 527, -1, -1, -1, 531, 532, 533, -1, -1, + -1, 537, -1, -1, 540, 541, -1, 543, 544, 545, + 546, 547, 548, -1, -1, 551, 552, 553, 554, -1, + 556, 557, -1, -1, 560, 561, 562, 563, -1, -1, + 566, 567, -1, 569, 570, 571, 572, -1, -1, -1, + -1, -1, 578, 579, 580, -1, -1, -1, 584, 585, + 586, 587, -1, 589, 590, -1, 592, 593, -1, 595, + 596, -1, -1, 599, -1, -1, 602, -1, 604, -1, + 606, 607, -1, -1, -1, -1, -1, -1, 614, -1, + -1, 617, -1, -1, -1, 621, 622, 623, 624, 625, + 626, 627, -1, -1, -1, -1, -1, -1, 634, 635, + -1, 637, 638, 639, -1, 5, 642, 7, 8, 9, + 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, + -1, -1, 22, -1, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, 34, -1, -1, -1, 38, -1, + -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, + -1, 51, 52, -1, -1, 55, -1, -1, 58, 59, + -1, 61, 62, -1, 64, 65, -1, 67, 68, 69, + 70, 71, 72, -1, 74, 75, 76, 77, 78, 79, + 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, + -1, 91, 92, -1, 94, 95, 96, 97, 98, -1, + 100, -1, -1, 103, -1, -1, 106, -1, 108, -1, + -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, + -1, -1, 122, -1, -1, -1, -1, 127, 128, -1, + -1, -1, -1, 133, -1, 135, -1, -1, -1, -1, + 140, -1, 142, 143, 144, 145, 146, -1, -1, -1, + -1, 151, -1, -1, 154, 155, 156, -1, -1, -1, + 160, -1, 162, 163, -1, 165, 166, 167, -1, 169, + 170, -1, 172, 173, 174, 175, 176, 177, 178, -1, + -1, 181, 182, 183, 184, -1, -1, 187, 188, -1, + 190, 191, 192, -1, -1, 195, -1, -1, -1, 199, + 200, -1, 202, -1, 204, -1, 206, 207, 208, 209, + 210, 211, 212, -1, 214, -1, -1, 217, 218, 219, + -1, 221, -1, -1, -1, 225, 226, -1, -1, -1, + 230, 231, 232, 233, 234, -1, -1, -1, 238, 239, + 240, -1, -1, 243, -1, -1, -1, -1, 248, 249, + -1, -1, -1, 253, -1, 255, 256, -1, 258, 259, + -1, -1, -1, 263, -1, -1, 266, 267, 268, -1, + -1, 271, -1, -1, 274, 275, -1, -1, -1, -1, + -1, 281, 282, -1, 284, -1, 286, -1, 288, 289, + -1, -1, -1, -1, -1, -1, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, -1, 313, 314, 315, 316, -1, 318, 319, + 320, 321, -1, 323, 324, 325, -1, -1, -1, -1, + 330, 331, 332, 333, 334, 335, -1, -1, 338, 339, + -1, 341, -1, 343, -1, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, -1, -1, 357, -1, -1, + 360, 361, 362, 363, -1, -1, -1, 367, 368, -1, + -1, -1, 372, -1, 374, 375, 376, -1, 378, 379, + 380, 381, -1, 383, 384, -1, -1, -1, -1, -1, + -1, -1, -1, 393, 394, 395, -1, -1, 398, -1, + 400, -1, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, -1, 414, 415, 416, -1, 418, -1, + 420, 421, 422, 423, 424, -1, 426, 427, 428, -1, + -1, 431, -1, -1, -1, 435, 436, 437, 438, 439, + -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, + -1, 451, 452, 453, -1, -1, 456, -1, 458, -1, + 460, 461, -1, 463, 464, -1, 466, -1, 468, -1, + -1, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, -1, 484, 485, -1, -1, -1, 489, + 490, 491, 492, -1, -1, -1, 496, -1, -1, -1, + 500, -1, 502, 503, 504, 505, 506, 507, -1, 509, + 510, 511, 512, 513, 514, -1, -1, -1, -1, -1, + -1, 521, 522, -1, 524, -1, -1, 527, -1, -1, + -1, 531, 532, 533, -1, -1, -1, 537, -1, -1, + 540, 541, -1, 543, 544, 545, 546, 547, 548, -1, + -1, 551, 552, 553, 554, -1, 556, 557, -1, -1, + 560, 561, 562, 563, -1, -1, 566, 567, -1, 569, + 570, 571, 572, -1, -1, -1, -1, -1, 578, 579, + 580, -1, -1, -1, 584, 585, 586, 587, -1, 589, + 590, -1, 592, 593, -1, 595, 596, -1, -1, 599, + -1, -1, 602, -1, 604, -1, 606, 607, -1, -1, + -1, -1, -1, -1, 614, -1, -1, 617, -1, -1, + -1, 621, 622, 623, 624, 625, 626, 627, -1, -1, + -1, -1, -1, -1, 634, 635, -1, 637, 638, 639, + -1, 5, 642, 7, 8, 9, 10, 11, 12, -1, + -1, 15, -1, -1, -1, 19, -1, -1, -1, -1, + 24, 25, 26, 27, 28, 29, 30, 31, -1, -1, + 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, + -1, 45, 46, 47, -1, 49, -1, -1, -1, -1, + -1, 55, 56, -1, 58, 59, -1, 61, -1, -1, + -1, -1, -1, 67, 68, 69, 70, 71, 72, -1, + 74, 75, -1, -1, -1, -1, -1, -1, 82, -1, + 84, -1, 86, 87, 88, 89, -1, 91, 92, -1, + 94, 95, 96, -1, 98, -1, 100, -1, -1, 103, + -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, + -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, + -1, -1, -1, 127, -1, -1, -1, -1, -1, 133, + -1, 135, -1, -1, -1, -1, 140, -1, 142, 143, + 144, 145, 146, -1, -1, -1, -1, -1, -1, -1, + 154, 155, 156, -1, 158, 159, 160, -1, 162, 163, + -1, 165, 166, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, -1, -1, -1, -1, 181, 182, 183, + 184, -1, -1, 187, 188, 189, 190, 191, 192, -1, + -1, -1, -1, -1, -1, -1, 200, -1, 202, -1, + 204, -1, 206, 207, 208, 209, 210, -1, 212, -1, + 214, -1, -1, -1, 218, 219, -1, -1, -1, -1, + -1, -1, 226, -1, -1, -1, 230, 231, 232, 233, + 234, 235, -1, -1, 238, 239, 240, -1, -1, 243, + -1, -1, -1, -1, 248, -1, -1, -1, -1, 253, + -1, 255, 256, -1, 258, 259, 260, -1, -1, 263, + -1, -1, -1, 267, 268, -1, -1, 271, 272, -1, + 274, 275, -1, -1, -1, -1, -1, 281, 282, -1, + 284, -1, 286, -1, 288, 289, -1, -1, -1, -1, + 294, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, -1, 313, + 314, 315, 316, -1, 318, 319, 320, 321, -1, 323, + 324, 325, -1, -1, -1, -1, 330, 331, 332, 333, + 334, 335, -1, -1, 338, 339, -1, 341, -1, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, -1, -1, 357, -1, -1, 360, 361, 362, 363, + -1, -1, -1, -1, 368, -1, -1, -1, 372, -1, + 374, 375, 376, -1, 378, 379, 380, 381, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 393, 394, -1, -1, -1, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, -1, - -1, -1, -1, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, -1, -1, 450, - -1, 452, 453, -1, 455, -1, -1, -1, 459, -1, - -1, 462, 463, -1, 465, 466, 467, -1, -1, 470, - -1, 472, 473, 474, 475, 476, 477, 478, -1, 480, - 481, -1, 483, -1, -1, -1, -1, 488, 489, 490, - -1, -1, -1, -1, 495, -1, -1, -1, -1, -1, - -1, 502, -1, -1, 505, 506, -1, 508, -1, 510, - -1, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - -1, 532, -1, -1, -1, 536, -1, -1, -1, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, -1, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, -1, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, -1, -1, -1, -1, 598, -1, -1, - 601, -1, -1, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, 627, -1, 629, -1, - -1, -1, 633, -1, -1, 636, -1, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, - -1, -1, -1, 19, -1, -1, -1, -1, 24, 25, - 26, 27, 28, 29, 30, 31, -1, -1, 34, -1, - -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, - 46, 47, -1, 49, -1, -1, -1, -1, -1, 55, - 56, -1, 58, 59, -1, 61, -1, -1, -1, -1, - -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, - -1, -1, -1, -1, -1, -1, 82, -1, 84, -1, - 86, 87, 88, 89, -1, 91, 92, -1, 94, 95, - 96, -1, 98, -1, 100, -1, -1, 103, -1, -1, - 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, - -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, - -1, 127, -1, -1, -1, -1, -1, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, -1, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - -1, -1, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, - -1, -1, -1, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, -1, 211, -1, 213, -1, -1, - -1, 217, 218, -1, -1, -1, -1, -1, -1, 225, - -1, -1, -1, 229, 230, 231, 232, 233, 234, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, -1, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, 259, -1, -1, 262, -1, -1, -1, - 266, 267, -1, -1, 270, 271, -1, 273, 274, -1, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, 293, -1, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - -1, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 393, 394, -1, - -1, -1, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, -1, -1, -1, -1, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, -1, -1, 450, -1, 452, 453, -1, 455, - -1, -1, -1, 459, -1, -1, 462, 463, -1, 465, - 466, 467, -1, -1, 470, -1, 472, 473, 474, 475, - 476, 477, 478, -1, 480, 481, -1, 483, -1, -1, - -1, -1, 488, 489, 490, -1, -1, -1, -1, 495, - -1, -1, -1, -1, -1, -1, 502, -1, -1, 505, - 506, -1, 508, -1, 510, -1, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, -1, 532, -1, -1, -1, - 536, -1, -1, -1, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, -1, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, -1, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, -1, -1, - -1, -1, 598, -1, -1, 601, -1, -1, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, 629, -1, -1, -1, 633, -1, -1, - 636, -1, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, -1, -1, 24, 25, 26, 27, 28, 29, 30, - 31, -1, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - -1, -1, -1, -1, 55, 56, -1, 58, 59, -1, - 61, -1, -1, -1, -1, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, -1, -1, -1, -1, -1, - -1, 82, -1, 84, -1, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, -1, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, -1, -1, -1, - -1, -1, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, -1, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, -1, -1, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, 188, 189, 190, - 191, -1, -1, -1, -1, -1, -1, -1, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, -1, - 211, -1, 213, -1, -1, -1, 217, 218, -1, -1, - -1, -1, -1, -1, 225, -1, -1, -1, 229, 230, - 231, 232, 233, 234, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, -1, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, 259, -1, - -1, 262, -1, -1, -1, 266, 267, -1, -1, 270, - 271, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, 293, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, -1, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, + 394, 395, -1, -1, -1, -1, 400, -1, 402, 403, + 404, 405, 406, 407, 408, 409, 410, -1, -1, -1, + -1, 415, 416, -1, 418, -1, 420, 421, 422, 423, + 424, -1, 426, 427, 428, -1, -1, 431, -1, -1, + -1, 435, 436, 437, 438, 439, -1, -1, 442, 443, + 444, 445, 446, -1, 448, -1, -1, 451, -1, 453, + 454, -1, 456, -1, -1, -1, 460, -1, -1, 463, + 464, -1, 466, 467, 468, -1, -1, 471, -1, 473, + 474, 475, 476, 477, 478, 479, -1, 481, 482, -1, + 484, -1, -1, -1, -1, 489, 490, 491, -1, -1, + -1, -1, 496, -1, -1, -1, -1, -1, -1, 503, + -1, -1, 506, 507, -1, 509, -1, 511, -1, 513, + 514, -1, -1, -1, -1, -1, -1, 521, 522, -1, + 524, -1, -1, 527, -1, -1, -1, 531, -1, 533, + -1, -1, -1, 537, -1, -1, -1, 541, -1, 543, + 544, 545, 546, 547, 548, -1, -1, 551, 552, 553, + 554, -1, 556, 557, -1, -1, 560, 561, 562, 563, + -1, -1, 566, 567, -1, 569, 570, 571, 572, -1, + -1, -1, -1, -1, 578, 579, 580, -1, -1, -1, + -1, 585, 586, 587, -1, 589, 590, -1, 592, 593, + -1, -1, -1, -1, -1, 599, -1, -1, 602, -1, + -1, -1, 606, 607, -1, -1, -1, -1, -1, -1, + 614, -1, -1, 617, -1, -1, -1, 621, 622, 623, + 624, 625, 626, 627, -1, -1, 630, -1, -1, -1, + 634, -1, -1, 637, -1, 639, -1, 5, 642, 7, + 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, + -1, 19, -1, -1, -1, -1, 24, 25, 26, 27, + 28, 29, 30, 31, -1, -1, 34, -1, -1, -1, + 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, + -1, 49, -1, -1, -1, -1, -1, 55, 56, -1, + 58, 59, -1, 61, -1, -1, -1, -1, -1, 67, + 68, 69, 70, 71, 72, -1, 74, 75, -1, -1, + -1, -1, -1, -1, 82, -1, 84, -1, 86, 87, + 88, 89, -1, 91, 92, -1, 94, 95, 96, -1, + 98, -1, 100, -1, -1, 103, -1, -1, 106, -1, + 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, + 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, + -1, -1, -1, -1, -1, 133, -1, 135, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, 146, -1, + -1, -1, -1, -1, -1, -1, 154, 155, 156, -1, + 158, -1, 160, -1, 162, 163, -1, 165, 166, 167, + -1, 169, 170, -1, 172, 173, 174, 175, 176, -1, + -1, -1, -1, 181, 182, 183, 184, -1, -1, 187, + 188, 189, 190, 191, 192, -1, -1, -1, -1, -1, + -1, -1, 200, -1, 202, -1, 204, -1, 206, 207, + 208, 209, 210, -1, 212, -1, 214, -1, -1, -1, + 218, 219, -1, -1, -1, -1, -1, -1, 226, -1, + -1, -1, 230, 231, 232, 233, 234, 235, -1, -1, + 238, 239, 240, -1, -1, 243, -1, -1, -1, -1, + 248, -1, -1, -1, -1, 253, -1, 255, 256, -1, + 258, 259, 260, -1, -1, 263, -1, -1, -1, 267, + 268, -1, -1, 271, 272, -1, 274, 275, -1, -1, + -1, -1, -1, 281, 282, -1, 284, -1, 286, -1, + 288, 289, -1, -1, -1, -1, 294, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, -1, 313, 314, 315, 316, -1, + 318, 319, 320, 321, -1, 323, 324, 325, -1, -1, + -1, -1, 330, 331, 332, 333, 334, 335, -1, -1, + 338, 339, -1, 341, -1, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, -1, -1, 357, + -1, -1, 360, 361, 362, 363, -1, -1, -1, -1, + 368, -1, -1, -1, 372, -1, 374, 375, 376, -1, + 378, 379, 380, 381, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 394, 395, -1, -1, + -1, -1, 400, -1, 402, 403, 404, 405, 406, 407, + 408, 409, 410, -1, -1, -1, -1, 415, 416, -1, + 418, -1, 420, 421, 422, 423, 424, -1, 426, 427, + 428, -1, -1, 431, -1, -1, -1, 435, 436, 437, + 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, + 448, -1, -1, 451, -1, 453, 454, -1, 456, -1, + -1, -1, 460, -1, -1, 463, 464, -1, 466, 467, + 468, -1, -1, 471, -1, 473, 474, 475, 476, 477, + 478, 479, -1, 481, 482, -1, 484, -1, -1, -1, + -1, 489, 490, 491, -1, -1, -1, -1, 496, -1, + -1, -1, -1, -1, -1, 503, -1, -1, 506, 507, + -1, 509, -1, 511, -1, 513, 514, -1, -1, -1, + -1, -1, -1, 521, 522, -1, 524, -1, -1, 527, + -1, -1, -1, 531, -1, 533, -1, -1, -1, 537, + -1, -1, -1, 541, -1, 543, 544, 545, 546, 547, + 548, -1, -1, 551, 552, 553, 554, -1, 556, 557, + -1, -1, 560, 561, 562, 563, -1, -1, 566, 567, + -1, 569, 570, 571, 572, -1, -1, -1, -1, -1, + 578, 579, 580, -1, -1, -1, -1, 585, 586, 587, + -1, 589, 590, -1, 592, 593, -1, -1, -1, -1, + -1, 599, -1, -1, 602, -1, -1, -1, 606, 607, + -1, -1, -1, -1, -1, -1, 614, -1, -1, 617, + -1, -1, -1, 621, 622, 623, 624, 625, 626, 627, + 628, -1, 630, -1, -1, -1, 634, -1, -1, 637, + -1, 639, -1, 5, 642, 7, 8, 9, 10, 11, + 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, + -1, -1, 24, 25, 26, 27, 28, 29, 30, 31, + -1, -1, 34, -1, -1, -1, 38, -1, -1, -1, + 42, -1, -1, 45, 46, 47, -1, 49, -1, -1, + -1, -1, -1, 55, 56, -1, 58, 59, -1, 61, + -1, -1, -1, -1, -1, 67, 68, 69, 70, 71, + 72, -1, 74, 75, -1, -1, -1, -1, -1, -1, + 82, -1, 84, -1, 86, 87, 88, 89, -1, 91, + 92, -1, 94, 95, 96, -1, 98, -1, 100, -1, + -1, 103, -1, -1, 106, -1, 108, -1, -1, 111, + -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, + 122, -1, -1, -1, -1, 127, -1, -1, -1, -1, + -1, 133, -1, 135, -1, -1, -1, -1, 140, -1, + 142, 143, 144, 145, 146, -1, -1, -1, -1, -1, + -1, -1, 154, 155, 156, -1, 158, -1, 160, -1, + 162, 163, -1, 165, 166, 167, -1, 169, 170, -1, + 172, 173, 174, 175, 176, -1, -1, -1, -1, 181, + 182, 183, 184, -1, -1, 187, 188, 189, 190, 191, + 192, -1, -1, -1, -1, -1, -1, -1, 200, -1, + 202, -1, 204, -1, 206, 207, 208, 209, 210, -1, + 212, -1, 214, -1, -1, -1, 218, 219, -1, -1, + -1, -1, -1, -1, 226, -1, -1, -1, 230, 231, + 232, 233, 234, 235, -1, -1, 238, 239, 240, -1, + -1, 243, -1, -1, -1, -1, 248, -1, -1, -1, + -1, 253, -1, 255, 256, -1, 258, 259, 260, -1, + -1, 263, -1, -1, -1, 267, 268, -1, -1, 271, + 272, -1, 274, 275, -1, -1, -1, -1, -1, 281, + 282, -1, 284, -1, 286, -1, 288, 289, -1, -1, + -1, -1, 294, -1, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + -1, 313, 314, 315, 316, -1, 318, 319, 320, 321, + -1, 323, 324, 325, -1, -1, -1, -1, 330, 331, + 332, 333, 334, 335, -1, -1, 338, 339, -1, 341, + -1, 343, -1, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, -1, -1, 357, -1, -1, 360, 361, + 362, 363, -1, -1, -1, -1, 368, -1, -1, -1, + 372, -1, 374, 375, 376, -1, 378, 379, 380, 381, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 393, 394, -1, -1, -1, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, -1, - -1, -1, -1, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, -1, -1, 450, - -1, 452, 453, -1, 455, -1, -1, -1, 459, -1, - -1, 462, 463, -1, 465, 466, 467, -1, -1, 470, - -1, 472, 473, 474, 475, 476, 477, 478, -1, 480, - 481, -1, 483, -1, -1, -1, -1, 488, 489, 490, - -1, -1, -1, -1, 495, -1, -1, -1, -1, -1, - -1, 502, -1, -1, 505, 506, -1, 508, -1, 510, - -1, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - -1, 532, -1, -1, -1, 536, -1, -1, -1, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, -1, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, -1, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, -1, -1, -1, -1, 598, -1, -1, - 601, -1, -1, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, 629, -1, - -1, -1, 633, -1, -1, 636, -1, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, + -1, -1, 394, 395, -1, -1, -1, -1, 400, -1, + 402, 403, 404, 405, 406, 407, 408, 409, 410, -1, + -1, -1, -1, 415, 416, -1, 418, -1, 420, 421, + 422, 423, 424, -1, 426, 427, 428, -1, -1, 431, + -1, -1, -1, 435, 436, 437, 438, 439, -1, -1, + 442, 443, 444, 445, 446, -1, 448, -1, -1, 451, + -1, 453, 454, -1, 456, -1, -1, -1, 460, -1, + -1, 463, 464, -1, 466, 467, 468, -1, -1, 471, + -1, 473, 474, 475, 476, 477, 478, 479, -1, 481, + 482, -1, 484, -1, -1, -1, -1, 489, 490, 491, + -1, -1, -1, -1, 496, -1, -1, -1, -1, -1, + -1, 503, -1, -1, 506, 507, -1, 509, -1, 511, + -1, 513, 514, -1, -1, -1, -1, -1, -1, 521, + 522, -1, 524, -1, -1, 527, -1, -1, -1, 531, + -1, 533, -1, -1, -1, 537, -1, -1, -1, 541, + -1, 543, 544, 545, 546, 547, 548, -1, -1, 551, + 552, 553, 554, -1, 556, 557, -1, -1, 560, 561, + 562, 563, -1, -1, 566, 567, -1, 569, 570, 571, + 572, -1, -1, -1, -1, -1, 578, 579, 580, -1, + -1, -1, -1, 585, 586, 587, -1, 589, 590, -1, + 592, 593, -1, -1, -1, -1, -1, 599, -1, -1, + 602, -1, -1, -1, 606, 607, -1, -1, -1, -1, + -1, -1, 614, -1, -1, 617, -1, -1, -1, 621, + 622, 623, 624, 625, 626, 627, 628, -1, 630, -1, + -1, -1, 634, -1, -1, 637, -1, 639, -1, 5, + 642, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, -1, -1, 24, 25, 26, 27, 28, 29, 30, 31, -1, -1, 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, @@ -17646,248 +17570,312 @@ static const yytype_int16 yycheck[] = 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, -1, -1, -1, -1, -1, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, -1, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - -1, -1, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, - -1, -1, -1, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, -1, 211, -1, 213, -1, -1, - -1, 217, 218, -1, -1, -1, -1, -1, -1, 225, - -1, -1, -1, 229, 230, 231, 232, 233, 234, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, -1, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, 259, -1, -1, 262, -1, -1, -1, - 266, 267, -1, -1, 270, 271, -1, 273, 274, -1, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, 293, -1, 295, + -1, -1, -1, -1, 140, -1, 142, 143, 144, 145, + 146, -1, -1, -1, -1, -1, -1, -1, 154, 155, + 156, -1, -1, -1, 160, -1, 162, 163, -1, 165, + 166, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, -1, -1, -1, -1, 181, 182, 183, 184, -1, + -1, 187, 188, 189, 190, 191, 192, -1, -1, -1, + -1, -1, -1, -1, 200, -1, 202, -1, 204, -1, + 206, 207, 208, 209, 210, -1, 212, -1, 214, -1, + -1, -1, 218, 219, -1, -1, -1, -1, -1, -1, + 226, -1, -1, -1, 230, 231, 232, 233, 234, 235, + -1, -1, 238, 239, 240, -1, -1, 243, -1, -1, + -1, -1, 248, -1, -1, -1, -1, 253, -1, 255, + 256, -1, 258, 259, 260, -1, -1, 263, -1, -1, + -1, 267, 268, -1, -1, 271, 272, -1, 274, 275, + -1, -1, -1, -1, -1, 281, 282, -1, 284, -1, + 286, -1, 288, 289, -1, -1, -1, -1, 294, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - -1, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 393, 394, -1, - -1, -1, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, -1, -1, -1, -1, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, -1, -1, 450, -1, 452, 453, -1, 455, - -1, -1, -1, 459, -1, -1, 462, 463, -1, 465, - 466, 467, -1, -1, 470, -1, 472, 473, 474, 475, - 476, 477, 478, -1, 480, 481, -1, 483, -1, -1, - -1, -1, 488, 489, 490, -1, -1, -1, -1, 495, - -1, -1, -1, -1, -1, -1, 502, -1, -1, 505, - 506, -1, 508, -1, 510, -1, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, -1, 532, -1, -1, -1, - 536, -1, -1, -1, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, -1, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, -1, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, -1, -1, - -1, -1, 598, -1, -1, 601, -1, -1, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, 629, -1, -1, -1, 633, -1, -1, - 636, -1, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, -1, -1, 24, 25, 26, 27, 28, 29, 30, - 31, -1, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - -1, -1, -1, -1, 55, 56, -1, 58, 59, -1, - 61, -1, -1, -1, -1, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, -1, -1, -1, -1, -1, - -1, 82, -1, 84, -1, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, -1, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, -1, -1, -1, - -1, -1, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, -1, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - 161, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, -1, -1, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, 188, 189, 190, - 191, -1, -1, -1, -1, -1, -1, -1, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, -1, - 211, -1, 213, -1, -1, -1, 217, 218, -1, -1, - -1, -1, -1, -1, 225, -1, -1, -1, 229, 230, - 231, 232, 233, 234, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, -1, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, 259, -1, - -1, 262, -1, -1, -1, 266, 267, -1, -1, 270, - 271, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, 293, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, -1, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, + 306, 307, 308, 309, 310, 311, -1, 313, 314, 315, + 316, -1, 318, 319, 320, 321, -1, 323, 324, 325, + -1, -1, -1, -1, 330, 331, 332, 333, 334, 335, + -1, -1, 338, 339, -1, 341, -1, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, -1, + -1, 357, -1, -1, 360, 361, 362, 363, -1, -1, + -1, -1, 368, -1, -1, -1, 372, -1, 374, 375, + 376, -1, 378, 379, 380, 381, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 394, 395, + -1, -1, -1, -1, 400, -1, 402, 403, 404, 405, + 406, 407, 408, 409, 410, -1, -1, -1, -1, 415, + 416, -1, 418, -1, 420, 421, 422, 423, 424, -1, + 426, 427, 428, -1, -1, 431, -1, -1, -1, 435, + 436, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, -1, -1, 451, -1, 453, 454, -1, + 456, -1, -1, -1, 460, -1, -1, 463, 464, -1, + 466, 467, 468, -1, -1, 471, -1, 473, 474, 475, + 476, 477, 478, 479, -1, 481, 482, -1, 484, -1, + -1, -1, -1, 489, 490, 491, -1, -1, -1, -1, + 496, -1, -1, -1, -1, -1, -1, 503, -1, -1, + 506, 507, -1, 509, -1, 511, -1, 513, 514, -1, + -1, -1, -1, -1, -1, 521, 522, -1, 524, -1, + -1, 527, -1, -1, -1, 531, -1, 533, -1, -1, + -1, 537, -1, -1, -1, 541, -1, 543, 544, 545, + 546, 547, 548, -1, -1, 551, 552, 553, 554, -1, + 556, 557, -1, -1, 560, 561, 562, 563, -1, -1, + 566, 567, -1, 569, 570, 571, 572, -1, -1, -1, + -1, -1, 578, 579, 580, -1, -1, -1, -1, 585, + 586, 587, -1, 589, 590, -1, 592, 593, -1, -1, + -1, -1, -1, 599, -1, -1, 602, -1, -1, -1, + 606, 607, -1, -1, -1, -1, -1, -1, 614, -1, + -1, 617, -1, -1, -1, 621, 622, 623, 624, 625, + 626, 627, -1, -1, 630, -1, -1, -1, 634, -1, + -1, 637, -1, 639, -1, 5, 642, 7, 8, 9, + 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, + -1, -1, -1, -1, 24, 25, 26, 27, 28, 29, + 30, 31, -1, -1, 34, -1, -1, -1, 38, -1, + -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, + -1, -1, -1, -1, -1, 55, 56, -1, 58, 59, + -1, 61, -1, -1, -1, -1, -1, 67, 68, 69, + 70, 71, 72, -1, 74, 75, -1, -1, -1, -1, + -1, -1, 82, -1, 84, -1, 86, 87, 88, 89, + -1, 91, 92, -1, 94, 95, 96, -1, 98, -1, + 100, -1, -1, 103, -1, -1, 106, -1, 108, -1, + -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, + -1, -1, 122, -1, -1, -1, -1, 127, -1, -1, + -1, -1, -1, 133, -1, 135, -1, -1, -1, -1, + 140, -1, 142, 143, 144, 145, 146, -1, -1, -1, + -1, -1, -1, -1, 154, 155, 156, -1, -1, -1, + 160, -1, 162, 163, -1, 165, 166, 167, -1, 169, + 170, -1, 172, 173, 174, 175, 176, -1, -1, -1, + -1, 181, 182, 183, 184, -1, -1, 187, 188, 189, + 190, 191, 192, -1, -1, -1, -1, -1, -1, -1, + 200, -1, 202, -1, 204, -1, 206, 207, 208, 209, + 210, -1, 212, -1, 214, -1, -1, -1, 218, 219, + -1, -1, -1, -1, -1, -1, 226, -1, -1, -1, + 230, 231, 232, 233, 234, 235, -1, -1, 238, 239, + 240, -1, -1, 243, -1, -1, -1, -1, 248, -1, + -1, -1, -1, 253, -1, 255, 256, -1, 258, 259, + 260, -1, -1, 263, -1, -1, -1, 267, 268, -1, + -1, 271, 272, -1, 274, 275, -1, -1, -1, -1, + -1, 281, 282, -1, 284, -1, 286, -1, 288, 289, + -1, -1, -1, -1, 294, -1, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, -1, 313, 314, 315, 316, -1, 318, 319, + 320, 321, -1, 323, 324, 325, -1, -1, -1, -1, + 330, 331, 332, 333, 334, 335, -1, -1, 338, 339, + -1, 341, -1, 343, -1, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, -1, -1, 357, -1, -1, + 360, 361, 362, 363, -1, -1, -1, -1, 368, -1, + -1, -1, 372, -1, 374, 375, 376, -1, 378, 379, + 380, 381, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 394, 395, -1, -1, -1, -1, + 400, -1, 402, 403, 404, 405, 406, 407, 408, 409, + 410, -1, -1, -1, -1, 415, 416, -1, 418, -1, + 420, 421, 422, 423, 424, -1, 426, 427, 428, -1, + -1, 431, -1, -1, -1, 435, 436, 437, 438, 439, + -1, -1, 442, 443, 444, 445, 446, -1, 448, -1, + -1, 451, -1, 453, 454, -1, 456, -1, -1, -1, + 460, -1, -1, 463, 464, -1, 466, 467, 468, -1, + -1, 471, -1, 473, 474, 475, 476, 477, 478, 479, + -1, 481, 482, -1, 484, -1, -1, -1, -1, 489, + 490, 491, -1, -1, -1, -1, 496, -1, -1, -1, + -1, -1, -1, 503, -1, -1, 506, 507, -1, 509, + -1, 511, -1, 513, 514, -1, -1, -1, -1, -1, + -1, 521, 522, -1, 524, -1, -1, 527, -1, -1, + -1, 531, -1, 533, -1, -1, -1, 537, -1, -1, + -1, 541, -1, 543, 544, 545, 546, 547, 548, -1, + -1, 551, 552, 553, 554, -1, 556, 557, -1, -1, + 560, 561, 562, 563, -1, -1, 566, 567, -1, 569, + 570, 571, 572, -1, -1, -1, -1, -1, 578, 579, + 580, -1, -1, -1, -1, 585, 586, 587, -1, 589, + 590, -1, 592, 593, -1, -1, -1, -1, -1, 599, + -1, -1, 602, -1, -1, -1, 606, 607, -1, -1, + -1, -1, -1, -1, 614, -1, -1, 617, -1, -1, + -1, 621, 622, 623, 624, 625, 626, 627, -1, -1, + 630, -1, -1, -1, 634, -1, -1, 637, -1, 639, + -1, 5, 642, 7, 8, 9, 10, 11, 12, -1, + -1, 15, -1, -1, -1, 19, -1, -1, -1, -1, + 24, 25, 26, 27, 28, 29, 30, 31, -1, -1, + 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, + -1, 45, 46, 47, -1, 49, -1, -1, -1, -1, + -1, 55, 56, -1, 58, 59, -1, 61, -1, -1, + -1, -1, -1, 67, 68, 69, 70, 71, 72, -1, + 74, 75, -1, -1, -1, -1, -1, -1, 82, -1, + 84, -1, 86, 87, 88, 89, -1, 91, 92, -1, + 94, 95, 96, -1, 98, -1, 100, -1, -1, 103, + -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, + -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, + -1, -1, -1, 127, -1, -1, -1, -1, -1, 133, + -1, 135, -1, -1, -1, -1, 140, -1, 142, 143, + 144, 145, 146, -1, -1, -1, -1, -1, -1, -1, + 154, 155, 156, -1, -1, -1, 160, -1, 162, 163, + -1, 165, 166, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, -1, -1, -1, -1, 181, 182, 183, + 184, -1, -1, 187, 188, 189, 190, 191, 192, -1, + -1, -1, -1, -1, -1, -1, 200, -1, 202, -1, + 204, -1, 206, 207, 208, 209, 210, -1, 212, -1, + 214, -1, -1, -1, 218, 219, -1, -1, -1, -1, + -1, -1, 226, -1, -1, -1, 230, 231, 232, 233, + 234, 235, -1, -1, 238, 239, 240, -1, -1, 243, + -1, -1, -1, -1, 248, -1, -1, -1, -1, 253, + -1, 255, 256, -1, 258, 259, 260, -1, -1, 263, + -1, -1, -1, 267, 268, -1, -1, 271, 272, -1, + 274, 275, -1, -1, -1, -1, -1, 281, 282, -1, + 284, -1, 286, -1, 288, 289, -1, -1, -1, -1, + 294, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, -1, 313, + 314, 315, 316, -1, 318, 319, 320, 321, -1, 323, + 324, 325, -1, -1, -1, -1, 330, 331, 332, 333, + 334, 335, -1, -1, 338, 339, -1, 341, -1, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, -1, -1, 357, -1, -1, 360, 361, 362, 363, + -1, -1, -1, -1, 368, -1, -1, -1, 372, -1, + 374, 375, 376, -1, 378, 379, 380, 381, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 393, 394, -1, -1, -1, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, -1, - -1, -1, -1, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, -1, -1, 450, - -1, 452, 453, -1, 455, -1, -1, -1, 459, -1, - -1, 462, 463, -1, 465, 466, 467, -1, -1, 470, - -1, 472, 473, 474, 475, 476, 477, 478, -1, 480, - 481, -1, 483, -1, -1, -1, -1, 488, 489, 490, - -1, -1, -1, -1, 495, -1, -1, -1, -1, -1, - -1, 502, -1, -1, 505, 506, -1, 508, -1, 510, - -1, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - -1, 532, -1, -1, -1, 536, -1, -1, -1, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, -1, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, -1, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, -1, -1, -1, -1, 598, -1, -1, - 601, -1, -1, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, 629, -1, - -1, -1, 633, -1, -1, 636, -1, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, - -1, -1, -1, 19, -1, -1, -1, -1, 24, 25, - 26, 27, 28, 29, 30, 31, -1, -1, 34, -1, - -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, - 46, 47, -1, 49, -1, -1, -1, -1, -1, 55, - 56, -1, 58, 59, -1, 61, -1, -1, -1, -1, - -1, 67, 68, 69, 70, 71, 72, -1, 74, 75, - -1, -1, -1, -1, -1, -1, 82, -1, 84, -1, - 86, 87, 88, 89, -1, 91, 92, -1, 94, 95, - 96, -1, 98, -1, 100, -1, -1, 103, -1, -1, - 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, - -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, - -1, 127, -1, -1, -1, -1, -1, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, -1, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, 161, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - -1, -1, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, - -1, -1, -1, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, -1, 211, -1, 213, -1, -1, - -1, 217, 218, -1, -1, -1, -1, -1, -1, 225, - -1, -1, -1, 229, 230, 231, 232, 233, 234, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, -1, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, 259, -1, -1, 262, -1, -1, -1, - 266, 267, -1, -1, 270, 271, -1, 273, 274, -1, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, 293, -1, 295, - 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - -1, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 393, 394, -1, - -1, -1, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, -1, -1, -1, -1, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, -1, -1, 450, -1, 452, 453, -1, 455, - -1, -1, -1, 459, -1, -1, 462, 463, -1, 465, - 466, 467, -1, -1, 470, -1, 472, 473, 474, 475, - 476, 477, 478, -1, 480, 481, -1, 483, -1, -1, - -1, -1, 488, 489, 490, -1, -1, -1, -1, 495, - -1, -1, -1, -1, -1, -1, 502, -1, -1, 505, - 506, -1, 508, -1, 510, -1, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, -1, 532, -1, -1, -1, - 536, -1, -1, -1, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, -1, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, -1, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, -1, -1, - -1, -1, 598, -1, -1, 601, -1, -1, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, 629, -1, -1, -1, 633, -1, -1, - 636, -1, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, -1, -1, 24, 25, 26, 27, 28, 29, 30, - 31, -1, -1, 34, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - -1, -1, -1, -1, 55, 56, -1, 58, 59, -1, - 61, -1, -1, -1, -1, -1, 67, 68, 69, 70, - 71, 72, -1, 74, 75, -1, -1, -1, -1, -1, - -1, 82, -1, 84, -1, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, -1, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, -1, -1, -1, - -1, -1, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, -1, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - -1, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, -1, -1, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, 188, 189, 190, - 191, -1, -1, -1, -1, -1, -1, -1, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, -1, - 211, -1, 213, -1, -1, -1, 217, 218, -1, -1, - -1, -1, -1, -1, 225, -1, -1, -1, 229, 230, - 231, 232, 233, 234, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, -1, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, 259, -1, - -1, 262, -1, -1, -1, 266, 267, -1, -1, 270, - 271, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, 293, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, -1, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, 380, + 394, 395, -1, -1, -1, -1, 400, -1, 402, 403, + 404, 405, 406, 407, 408, 409, 410, -1, -1, -1, + -1, 415, 416, -1, 418, -1, 420, 421, 422, 423, + 424, -1, 426, 427, 428, -1, -1, 431, -1, -1, + -1, 435, 436, 437, 438, 439, -1, -1, 442, 443, + 444, 445, 446, -1, 448, -1, -1, 451, -1, 453, + 454, -1, 456, -1, -1, -1, 460, -1, -1, 463, + 464, -1, 466, 467, 468, -1, -1, 471, -1, 473, + 474, 475, 476, 477, 478, 479, -1, 481, 482, -1, + 484, -1, -1, -1, -1, 489, 490, 491, -1, -1, + -1, -1, 496, -1, -1, -1, -1, -1, -1, 503, + -1, -1, 506, 507, -1, 509, -1, 511, -1, 513, + 514, -1, -1, -1, -1, -1, -1, 521, 522, -1, + 524, -1, -1, 527, -1, -1, -1, 531, -1, 533, + -1, -1, -1, 537, -1, -1, -1, 541, -1, 543, + 544, 545, 546, 547, 548, -1, -1, 551, 552, 553, + 554, -1, 556, 557, -1, -1, 560, 561, 562, 563, + -1, -1, 566, 567, -1, 569, 570, 571, 572, -1, + -1, -1, -1, -1, 578, 579, 580, -1, -1, -1, + -1, 585, 586, 587, -1, 589, 590, -1, 592, 593, + -1, -1, -1, -1, -1, 599, -1, -1, 602, -1, + -1, -1, 606, 607, -1, -1, -1, -1, -1, -1, + 614, -1, -1, 617, -1, -1, -1, 621, 622, 623, + 624, 625, 626, 627, -1, -1, 630, -1, -1, -1, + 634, -1, -1, 637, -1, 639, -1, 5, 642, 7, + 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, + -1, 19, -1, -1, -1, -1, 24, 25, 26, 27, + 28, 29, 30, 31, -1, -1, 34, -1, -1, -1, + 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, + -1, 49, -1, -1, -1, -1, -1, 55, 56, -1, + 58, 59, -1, 61, -1, -1, -1, -1, -1, 67, + 68, 69, 70, 71, 72, -1, 74, 75, -1, -1, + -1, -1, -1, -1, 82, -1, 84, -1, 86, 87, + 88, 89, -1, 91, 92, -1, 94, 95, 96, -1, + 98, -1, 100, -1, -1, 103, -1, -1, 106, -1, + 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, + 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, + -1, -1, -1, -1, -1, 133, -1, 135, -1, -1, + -1, -1, 140, -1, 142, 143, 144, 145, 146, -1, + -1, -1, -1, -1, -1, -1, 154, 155, 156, -1, + -1, -1, 160, -1, 162, 163, -1, 165, 166, 167, + -1, 169, 170, -1, 172, 173, 174, 175, 176, -1, + -1, -1, -1, 181, 182, 183, 184, -1, -1, 187, + 188, 189, 190, 191, 192, -1, -1, -1, -1, -1, + -1, -1, 200, -1, 202, -1, 204, -1, 206, 207, + 208, 209, 210, -1, 212, -1, 214, -1, -1, -1, + 218, 219, -1, -1, -1, -1, -1, -1, 226, -1, + -1, -1, 230, 231, 232, 233, 234, 235, -1, -1, + 238, 239, 240, -1, -1, 243, -1, -1, -1, -1, + 248, -1, -1, -1, -1, 253, -1, 255, 256, -1, + 258, 259, 260, -1, -1, 263, -1, -1, -1, 267, + 268, -1, -1, 271, 272, -1, 274, 275, -1, -1, + -1, -1, -1, 281, 282, -1, 284, -1, 286, -1, + 288, 289, -1, -1, -1, -1, 294, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, -1, 313, 314, 315, 316, -1, + 318, 319, 320, 321, -1, 323, 324, 325, -1, -1, + -1, -1, 330, 331, 332, 333, 334, 335, -1, -1, + 338, 339, -1, 341, -1, 343, -1, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, -1, -1, 357, + -1, -1, 360, 361, 362, 363, -1, -1, -1, -1, + 368, -1, -1, -1, 372, -1, 374, 375, 376, -1, + 378, 379, 380, 381, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 394, 395, -1, -1, + -1, -1, 400, -1, 402, 403, 404, 405, 406, 407, + 408, 409, 410, -1, -1, -1, -1, 415, 416, -1, + 418, -1, 420, 421, 422, 423, 424, -1, 426, 427, + 428, -1, -1, 431, -1, -1, -1, 435, 436, 437, + 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, + 448, -1, -1, 451, -1, 453, 454, -1, 456, -1, + -1, -1, 460, -1, -1, 463, 464, -1, 466, 467, + 468, -1, -1, 471, -1, 473, 474, 475, 476, 477, + 478, 479, -1, 481, 482, -1, 484, -1, -1, -1, + -1, 489, 490, 491, -1, -1, -1, -1, 496, -1, + -1, -1, -1, -1, -1, 503, -1, -1, 506, 507, + -1, 509, -1, 511, -1, 513, 514, -1, -1, -1, + -1, -1, -1, 521, 522, -1, 524, -1, -1, 527, + -1, -1, -1, 531, -1, 533, -1, -1, -1, 537, + -1, -1, -1, 541, -1, 543, 544, 545, 546, 547, + 548, -1, -1, 551, 552, 553, 554, -1, 556, 557, + -1, -1, 560, 561, 562, 563, -1, -1, 566, 567, + -1, 569, 570, 571, 572, -1, -1, -1, -1, -1, + 578, 579, 580, -1, -1, -1, -1, 585, 586, 587, + -1, 589, 590, -1, 592, 593, -1, -1, -1, -1, + -1, 599, -1, -1, 602, -1, -1, -1, 606, 607, + -1, -1, -1, -1, -1, -1, 614, -1, -1, 617, + -1, -1, -1, 621, 622, 623, 624, 625, 626, 627, + -1, -1, 630, -1, -1, -1, 634, -1, -1, 637, + -1, 639, -1, 5, 642, 7, 8, 9, 10, 11, + 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, + -1, -1, 24, 25, 26, 27, 28, 29, 30, 31, + -1, -1, 34, -1, -1, -1, 38, -1, -1, -1, + 42, -1, -1, 45, 46, 47, -1, 49, -1, -1, + -1, -1, -1, 55, 56, -1, 58, 59, -1, 61, + -1, -1, -1, -1, -1, 67, 68, 69, 70, 71, + 72, -1, 74, 75, -1, -1, -1, -1, -1, -1, + 82, -1, 84, -1, 86, 87, 88, 89, -1, 91, + 92, -1, 94, 95, 96, -1, 98, -1, 100, -1, + -1, 103, -1, -1, 106, -1, 108, -1, -1, 111, + -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, + 122, -1, -1, -1, -1, 127, -1, -1, -1, -1, + -1, 133, -1, 135, -1, -1, -1, -1, 140, -1, + 142, 143, 144, 145, 146, -1, -1, -1, -1, -1, + -1, -1, 154, 155, 156, -1, -1, -1, 160, -1, + 162, 163, -1, 165, 166, 167, -1, 169, 170, -1, + 172, 173, 174, 175, 176, -1, -1, -1, -1, 181, + 182, 183, 184, -1, -1, 187, 188, 189, 190, 191, + 192, -1, -1, -1, -1, -1, -1, -1, 200, -1, + 202, -1, 204, -1, 206, 207, 208, 209, 210, -1, + 212, -1, 214, -1, -1, -1, 218, 219, -1, -1, + -1, -1, -1, -1, 226, -1, -1, -1, 230, 231, + 232, 233, 234, 235, -1, -1, 238, 239, 240, -1, + -1, 243, -1, -1, -1, -1, 248, -1, -1, -1, + -1, 253, -1, 255, 256, -1, 258, 259, 260, -1, + -1, 263, -1, -1, -1, 267, 268, -1, -1, 271, + 272, -1, 274, 275, -1, -1, -1, -1, -1, 281, + 282, -1, 284, -1, 286, -1, 288, 289, -1, -1, + -1, -1, 294, -1, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + -1, 313, 314, 315, 316, -1, 318, 319, 320, 321, + -1, 323, 324, 325, -1, -1, -1, -1, 330, 331, + 332, 333, 334, 335, -1, -1, 338, 339, -1, 341, + -1, 343, -1, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, -1, -1, 357, -1, -1, 360, 361, + 362, 363, -1, -1, -1, -1, 368, -1, -1, -1, + 372, -1, 374, 375, 376, -1, 378, 379, 380, 381, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 393, 394, -1, -1, -1, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, -1, - -1, -1, -1, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, -1, -1, 450, - -1, 452, 453, -1, 455, -1, -1, -1, 459, -1, - -1, 462, 463, -1, 465, 466, 467, -1, -1, 470, - -1, 472, 473, 474, 475, 476, 477, 478, -1, 480, - 481, -1, 483, -1, -1, -1, -1, 488, 489, 490, - -1, -1, -1, -1, 495, -1, -1, -1, -1, -1, - -1, 502, -1, -1, 505, 506, -1, 508, -1, 510, - -1, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - -1, 532, -1, -1, -1, 536, -1, -1, -1, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, -1, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, -1, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, -1, -1, -1, -1, 598, -1, -1, - 601, -1, -1, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, 629, -1, - -1, -1, 633, -1, -1, 636, -1, 638, -1, 5, - 641, 7, 8, 9, 10, 11, 12, -1, -1, 15, + -1, -1, 394, 395, -1, -1, -1, -1, 400, -1, + 402, 403, 404, 405, 406, 407, 408, 409, 410, -1, + -1, -1, -1, 415, 416, -1, 418, -1, 420, 421, + 422, 423, 424, -1, 426, 427, 428, -1, -1, 431, + -1, -1, -1, 435, 436, 437, 438, 439, -1, -1, + 442, 443, 444, 445, 446, -1, 448, -1, -1, 451, + -1, 453, 454, -1, 456, -1, -1, -1, 460, -1, + -1, 463, 464, -1, 466, 467, 468, -1, -1, 471, + -1, 473, 474, 475, 476, 477, 478, 479, -1, 481, + 482, -1, 484, -1, -1, -1, -1, 489, 490, 491, + -1, -1, -1, -1, 496, -1, -1, -1, -1, -1, + -1, 503, -1, -1, 506, 507, -1, 509, -1, 511, + -1, 513, 514, -1, -1, -1, -1, -1, -1, 521, + 522, -1, 524, -1, -1, 527, -1, -1, -1, 531, + -1, 533, -1, -1, -1, 537, -1, -1, -1, 541, + -1, 543, 544, 545, 546, 547, 548, -1, -1, 551, + 552, 553, 554, -1, 556, 557, -1, -1, 560, 561, + 562, 563, -1, -1, 566, 567, -1, 569, 570, 571, + 572, -1, -1, -1, -1, -1, 578, 579, 580, -1, + -1, -1, -1, 585, 586, 587, -1, 589, 590, -1, + 592, 593, -1, -1, -1, -1, -1, 599, -1, -1, + 602, -1, -1, -1, 606, 607, -1, -1, -1, -1, + -1, -1, 614, -1, -1, 617, -1, -1, -1, 621, + 622, 623, 624, 625, 626, 627, -1, -1, 630, -1, + -1, -1, 634, -1, -1, 637, -1, 639, -1, 5, + 642, 7, 8, 9, 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, -1, -1, -1, 24, 25, 26, 27, 28, 29, 30, 31, -1, -1, 34, -1, -1, -1, 38, -1, -1, -1, 42, -1, -1, 45, @@ -17900,121 +17888,184 @@ static const yytype_int16 yycheck[] = 106, -1, 108, -1, -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, -1, -1, -1, 127, -1, -1, -1, -1, -1, 133, -1, 135, - -1, -1, -1, 139, -1, 141, 142, 143, 144, 145, - -1, -1, -1, -1, -1, -1, -1, 153, 154, 155, - -1, -1, -1, 159, -1, -1, 162, -1, 164, 165, - 166, -1, 168, 169, -1, 171, 172, 173, 174, 175, - -1, -1, -1, -1, 180, 181, 182, 183, -1, -1, - 186, 187, 188, 189, 190, 191, -1, -1, -1, -1, - -1, -1, -1, 199, -1, 201, -1, 203, -1, 205, - 206, 207, 208, 209, -1, 211, -1, 213, -1, -1, - -1, 217, 218, -1, -1, -1, -1, -1, -1, 225, - -1, -1, -1, 229, 230, 231, 232, 233, 234, -1, - -1, 237, 238, 239, -1, -1, 242, -1, -1, -1, - -1, 247, -1, -1, -1, -1, 252, -1, 254, 255, - -1, 257, 258, 259, -1, -1, 262, -1, -1, -1, - 266, 267, -1, -1, 270, 271, -1, 273, 274, -1, - -1, -1, -1, -1, 280, 281, -1, 283, -1, 285, - -1, 287, 288, -1, -1, -1, -1, 293, -1, 295, + -1, -1, -1, -1, 140, -1, 142, 143, 144, 145, + 146, -1, -1, -1, -1, -1, -1, -1, 154, 155, + 156, -1, -1, -1, 160, -1, -1, 163, -1, 165, + 166, 167, -1, 169, 170, -1, 172, 173, 174, 175, + 176, -1, -1, -1, -1, 181, 182, 183, 184, -1, + -1, 187, 188, 189, 190, 191, 192, -1, -1, -1, + -1, -1, -1, -1, 200, -1, 202, -1, 204, -1, + 206, 207, 208, 209, 210, -1, 212, -1, 214, -1, + -1, -1, 218, 219, -1, -1, -1, -1, -1, -1, + 226, -1, -1, -1, 230, 231, 232, 233, 234, 235, + -1, -1, 238, 239, 240, -1, -1, 243, -1, -1, + -1, -1, 248, -1, -1, -1, -1, 253, -1, 255, + 256, -1, 258, 259, 260, -1, -1, 263, -1, -1, + -1, 267, 268, -1, -1, 271, 272, -1, 274, 275, + -1, -1, -1, -1, -1, 281, 282, -1, 284, -1, + 286, -1, 288, 289, -1, -1, -1, -1, 294, -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, - 306, 307, 308, 309, 310, -1, 312, 313, 314, 315, - -1, 317, 318, 319, 320, -1, 322, 323, 324, -1, - -1, -1, -1, 329, 330, 331, 332, 333, 334, -1, - -1, 337, 338, -1, 340, -1, 342, -1, 344, 345, - 346, 347, 348, 349, 350, 351, 352, 353, -1, -1, - 356, -1, -1, 359, 360, 361, 362, -1, -1, -1, - -1, 367, -1, -1, -1, 371, -1, 373, 374, 375, - -1, 377, 378, 379, 380, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 393, 394, -1, - -1, -1, -1, 399, -1, 401, 402, 403, 404, 405, - 406, 407, 408, 409, -1, -1, -1, -1, 414, 415, - -1, 417, -1, 419, 420, 421, 422, 423, -1, 425, - 426, 427, -1, -1, 430, -1, -1, -1, 434, 435, - 436, 437, 438, -1, -1, 441, 442, 443, 444, 445, - -1, 447, -1, -1, 450, -1, 452, 453, -1, 455, - -1, -1, -1, 459, -1, -1, 462, 463, -1, 465, - 466, 467, -1, -1, 470, -1, 472, 473, 474, 475, - 476, 477, 478, -1, 480, 481, -1, 483, -1, -1, - -1, -1, 488, 489, 490, -1, -1, -1, -1, 495, - -1, -1, -1, -1, -1, -1, 502, -1, -1, 505, - 506, -1, 508, -1, 510, -1, 512, 513, -1, -1, - -1, -1, -1, -1, 520, 521, -1, 523, -1, -1, - 526, -1, -1, -1, 530, -1, 532, -1, -1, -1, - 536, -1, -1, -1, 540, -1, 542, 543, 544, 545, - 546, 547, -1, -1, 550, 551, 552, 553, -1, 555, - 556, -1, -1, 559, 560, 561, 562, -1, -1, 565, - 566, -1, 568, 569, 570, 571, -1, -1, -1, -1, - -1, 577, 578, 579, -1, -1, -1, -1, 584, 585, - 586, -1, 588, 589, -1, 591, 592, -1, -1, -1, - -1, -1, 598, -1, -1, 601, -1, -1, -1, 605, - 606, -1, -1, -1, -1, -1, -1, 613, -1, -1, - 616, -1, -1, -1, 620, 621, 622, 623, 624, 625, - 626, -1, -1, 629, -1, -1, -1, 633, -1, -1, - 636, -1, 638, -1, 5, 641, 7, 8, 9, 10, - 11, 12, -1, -1, 15, -1, -1, -1, 19, -1, - -1, -1, -1, 24, 25, 26, 27, 28, 29, 30, - 31, -1, -1, -1, -1, -1, -1, 38, -1, -1, - -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, - -1, -1, -1, -1, 55, -1, -1, 58, 59, -1, - 61, -1, -1, -1, -1, -1, 67, 68, 69, -1, - 71, 72, -1, 74, 75, -1, -1, -1, -1, -1, - -1, 82, -1, 84, -1, 86, 87, 88, 89, -1, - 91, 92, -1, 94, 95, 96, -1, 98, -1, 100, - -1, -1, 103, -1, -1, 106, -1, 108, -1, -1, - 111, -1, 113, -1, -1, -1, 117, 118, 119, -1, - -1, 122, -1, -1, -1, -1, 127, -1, -1, -1, - -1, -1, 133, -1, 135, -1, -1, -1, 139, -1, - 141, 142, 143, 144, 145, -1, -1, -1, -1, -1, - -1, -1, 153, 154, 155, -1, -1, -1, 159, -1, - -1, 162, -1, 164, 165, 166, -1, 168, 169, -1, - 171, 172, 173, 174, 175, -1, -1, -1, -1, 180, - 181, 182, 183, -1, -1, 186, 187, -1, 189, 190, - 191, -1, -1, -1, -1, -1, -1, -1, 199, -1, - 201, -1, 203, -1, 205, 206, 207, 208, 209, -1, - 211, -1, 213, -1, -1, -1, 217, 218, -1, -1, - -1, -1, -1, -1, 225, -1, -1, -1, 229, 230, - 231, 232, 233, -1, -1, -1, 237, 238, 239, -1, - -1, 242, -1, -1, -1, -1, 247, -1, -1, -1, - -1, 252, -1, 254, 255, -1, 257, 258, -1, -1, - -1, 262, -1, -1, -1, 266, 267, -1, -1, 270, - -1, -1, 273, 274, -1, -1, -1, -1, -1, 280, - 281, -1, 283, -1, 285, -1, 287, 288, -1, -1, - -1, -1, -1, -1, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - -1, 312, 313, 314, 315, -1, 317, 318, 319, 320, - -1, 322, 323, 324, -1, -1, -1, -1, 329, 330, - 331, 332, 333, 334, -1, -1, 337, 338, -1, 340, - -1, 342, -1, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, -1, -1, 356, -1, -1, 359, 360, - 361, 362, -1, -1, -1, -1, 367, -1, -1, -1, - 371, -1, 373, 374, 375, -1, 377, 378, 379, -1, + 306, 307, 308, 309, 310, 311, -1, 313, 314, 315, + 316, -1, 318, 319, 320, 321, -1, 323, 324, 325, + -1, -1, -1, -1, 330, 331, 332, 333, 334, 335, + -1, -1, 338, 339, -1, 341, -1, 343, -1, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, -1, + -1, 357, -1, -1, 360, 361, 362, 363, -1, -1, + -1, -1, 368, -1, -1, -1, 372, -1, 374, 375, + 376, -1, 378, 379, 380, 381, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 394, 395, + -1, -1, -1, -1, 400, -1, 402, 403, 404, 405, + 406, 407, 408, 409, 410, -1, -1, -1, -1, 415, + 416, -1, 418, -1, 420, 421, 422, 423, 424, -1, + 426, 427, 428, -1, -1, 431, -1, -1, -1, 435, + 436, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, -1, -1, 451, -1, 453, 454, -1, + 456, -1, -1, -1, 460, -1, -1, 463, 464, -1, + 466, 467, 468, -1, -1, 471, -1, 473, 474, 475, + 476, 477, 478, 479, -1, 481, 482, -1, 484, -1, + -1, -1, -1, 489, 490, 491, -1, -1, -1, -1, + 496, -1, -1, -1, -1, -1, -1, 503, -1, -1, + 506, 507, -1, 509, -1, 511, -1, 513, 514, -1, + -1, -1, -1, -1, -1, 521, 522, -1, 524, -1, + -1, 527, -1, -1, -1, 531, -1, 533, -1, -1, + -1, 537, -1, -1, -1, 541, -1, 543, 544, 545, + 546, 547, 548, -1, -1, 551, 552, 553, 554, -1, + 556, 557, -1, -1, 560, 561, 562, 563, -1, -1, + 566, 567, -1, 569, 570, 571, 572, -1, -1, -1, + -1, -1, 578, 579, 580, -1, -1, -1, -1, 585, + 586, 587, -1, 589, 590, -1, 592, 593, -1, -1, + -1, -1, -1, 599, -1, -1, 602, -1, -1, -1, + 606, 607, -1, -1, -1, -1, -1, -1, 614, -1, + -1, 617, -1, -1, -1, 621, 622, 623, 624, 625, + 626, 627, -1, -1, 630, -1, -1, -1, 634, -1, + -1, 637, -1, 639, -1, 5, 642, 7, 8, 9, + 10, 11, 12, -1, -1, 15, -1, -1, -1, 19, + -1, -1, -1, -1, 24, 25, 26, 27, 28, 29, + 30, 31, -1, -1, 34, -1, -1, -1, 38, -1, + -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, + -1, -1, -1, -1, -1, 55, 56, -1, 58, 59, + -1, 61, -1, -1, -1, -1, -1, 67, 68, 69, + 70, 71, 72, -1, 74, 75, -1, -1, -1, -1, + -1, -1, 82, -1, 84, -1, 86, 87, 88, 89, + -1, 91, 92, -1, 94, 95, 96, -1, 98, -1, + 100, -1, -1, 103, -1, -1, 106, -1, 108, -1, + -1, 111, -1, 113, -1, -1, -1, 117, 118, 119, + -1, -1, 122, -1, -1, -1, -1, 127, -1, -1, + -1, -1, -1, 133, -1, 135, -1, -1, -1, -1, + 140, -1, 142, 143, 144, 145, 146, -1, -1, -1, + -1, -1, -1, -1, 154, 155, 156, -1, -1, -1, + 160, -1, -1, 163, -1, 165, 166, 167, -1, 169, + 170, -1, 172, 173, 174, 175, 176, -1, -1, -1, + -1, 181, 182, 183, 184, -1, -1, 187, 188, 189, + 190, 191, 192, -1, -1, -1, -1, -1, -1, -1, + 200, -1, 202, -1, 204, -1, 206, 207, 208, 209, + 210, -1, 212, -1, 214, -1, -1, -1, 218, 219, + -1, -1, -1, -1, -1, -1, 226, -1, -1, -1, + 230, 231, 232, 233, 234, 235, -1, -1, 238, 239, + 240, -1, -1, 243, -1, -1, -1, -1, 248, -1, + -1, -1, -1, 253, -1, 255, 256, -1, 258, 259, + 260, -1, -1, 263, -1, -1, -1, 267, 268, -1, + -1, 271, 272, -1, 274, 275, -1, -1, -1, -1, + -1, 281, 282, -1, 284, -1, 286, -1, 288, 289, + -1, -1, -1, -1, 294, -1, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, -1, 313, 314, 315, 316, -1, 318, 319, + 320, 321, -1, 323, 324, 325, -1, -1, -1, -1, + 330, 331, 332, 333, 334, 335, -1, -1, 338, 339, + -1, 341, -1, 343, -1, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, -1, -1, 357, -1, -1, + 360, 361, 362, 363, -1, -1, -1, -1, 368, -1, + -1, -1, 372, -1, 374, 375, 376, -1, 378, 379, + 380, 381, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 394, 395, -1, -1, -1, -1, + 400, -1, 402, 403, 404, 405, 406, 407, 408, 409, + 410, -1, -1, -1, -1, 415, 416, -1, 418, -1, + 420, 421, 422, 423, 424, -1, 426, 427, 428, -1, + -1, 431, -1, -1, -1, 435, 436, 437, 438, 439, + -1, -1, 442, 443, 444, 445, 446, -1, 448, -1, + -1, 451, -1, 453, 454, -1, 456, -1, -1, -1, + 460, -1, -1, 463, 464, -1, 466, 467, 468, -1, + -1, 471, -1, 473, 474, 475, 476, 477, 478, 479, + -1, 481, 482, -1, 484, -1, -1, -1, -1, 489, + 490, 491, -1, -1, -1, -1, 496, -1, -1, -1, + -1, -1, -1, 503, -1, -1, 506, 507, -1, 509, + -1, 511, -1, 513, 514, -1, -1, -1, -1, -1, + -1, 521, 522, -1, 524, -1, -1, 527, -1, -1, + -1, 531, -1, 533, -1, -1, -1, 537, -1, -1, + -1, 541, -1, 543, 544, 545, 546, 547, 548, -1, + -1, 551, 552, 553, 554, -1, 556, 557, -1, -1, + 560, 561, 562, 563, -1, -1, 566, 567, -1, 569, + 570, 571, 572, -1, -1, -1, -1, -1, 578, 579, + 580, -1, -1, -1, -1, 585, 586, 587, -1, 589, + 590, -1, 592, 593, -1, -1, -1, -1, -1, 599, + -1, -1, 602, -1, -1, -1, 606, 607, -1, -1, + -1, -1, -1, -1, 614, -1, -1, 617, -1, -1, + -1, 621, 622, 623, 624, 625, 626, 627, -1, -1, + 630, -1, -1, -1, 634, -1, -1, 637, -1, 639, + -1, 5, 642, 7, 8, 9, 10, 11, 12, -1, + -1, 15, -1, -1, -1, 19, -1, -1, -1, -1, + 24, 25, 26, 27, 28, 29, 30, 31, -1, -1, + -1, -1, -1, -1, 38, -1, -1, -1, 42, -1, + -1, 45, 46, 47, -1, 49, -1, -1, -1, -1, + -1, 55, -1, -1, 58, 59, -1, 61, -1, -1, + -1, -1, -1, 67, 68, 69, -1, 71, 72, -1, + 74, 75, -1, -1, -1, -1, -1, -1, 82, -1, + 84, -1, 86, 87, 88, 89, -1, 91, 92, -1, + 94, 95, 96, -1, 98, -1, 100, -1, -1, 103, + -1, -1, 106, -1, 108, -1, -1, 111, -1, 113, + -1, -1, -1, 117, 118, 119, -1, -1, 122, -1, + -1, -1, -1, 127, -1, -1, -1, -1, -1, 133, + -1, 135, -1, -1, -1, -1, 140, -1, 142, 143, + 144, 145, 146, -1, -1, -1, -1, -1, -1, -1, + 154, 155, 156, -1, -1, -1, 160, -1, -1, 163, + -1, 165, 166, 167, -1, 169, 170, -1, 172, 173, + 174, 175, 176, -1, -1, -1, -1, 181, 182, 183, + 184, -1, -1, 187, 188, -1, 190, 191, 192, -1, + -1, -1, -1, -1, -1, -1, 200, -1, 202, -1, + 204, -1, 206, 207, 208, 209, 210, -1, 212, -1, + 214, -1, -1, -1, 218, 219, -1, -1, -1, -1, + -1, -1, 226, -1, -1, -1, 230, 231, 232, 233, + 234, -1, -1, -1, 238, 239, 240, -1, -1, 243, + -1, -1, -1, -1, 248, -1, -1, -1, -1, 253, + -1, 255, 256, -1, 258, 259, -1, -1, -1, 263, + -1, -1, -1, 267, 268, -1, -1, 271, -1, -1, + 274, 275, -1, -1, -1, -1, -1, 281, 282, -1, + 284, -1, 286, -1, 288, 289, -1, -1, -1, -1, + -1, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, -1, 313, + 314, 315, 316, -1, 318, 319, 320, 321, -1, 323, + 324, 325, -1, -1, -1, -1, 330, 331, 332, 333, + 334, 335, -1, -1, 338, 339, -1, 341, -1, 343, + -1, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, -1, -1, 357, -1, -1, 360, 361, 362, 363, + -1, -1, -1, -1, 368, -1, -1, -1, 372, -1, + 374, 375, 376, -1, 378, 379, 380, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 393, 394, -1, -1, -1, -1, 399, -1, - 401, 402, 403, 404, 405, 406, 407, 408, 409, -1, - -1, -1, -1, 414, 415, -1, 417, -1, 419, 420, - 421, 422, 423, -1, 425, 426, 427, -1, -1, 430, - -1, -1, -1, 434, 435, 436, 437, 438, -1, -1, - 441, 442, 443, 444, 445, -1, 447, -1, -1, 450, - -1, 452, -1, -1, 455, -1, -1, -1, 459, -1, - -1, 462, 463, -1, 465, -1, 467, -1, -1, 470, - -1, 472, 473, 474, 475, 476, 477, 478, -1, 480, - 481, -1, 483, -1, -1, -1, -1, 488, 489, 490, - -1, -1, -1, -1, 495, -1, -1, -1, -1, -1, - -1, 502, -1, -1, 505, 506, -1, 508, -1, 510, - -1, 512, 513, -1, -1, -1, -1, -1, -1, 520, - 521, -1, 523, -1, -1, 526, -1, -1, -1, 530, - -1, 532, -1, -1, -1, 536, -1, -1, -1, 540, - -1, 542, 543, 544, 545, 546, 547, -1, -1, 550, - 551, 552, 553, -1, 555, 556, -1, -1, 559, 560, - 561, 562, -1, -1, 565, 566, -1, 568, 569, 570, - 571, -1, -1, -1, -1, -1, 577, 578, 579, -1, - -1, -1, -1, 584, 585, 586, -1, 588, 589, -1, - 591, 592, -1, -1, -1, -1, -1, 598, -1, -1, - 601, -1, -1, -1, 605, 606, -1, -1, -1, -1, - -1, -1, 613, -1, -1, 616, -1, -1, -1, 620, - 621, 622, 623, 624, 625, 626, -1, -1, -1, -1, - -1, -1, 633, -1, -1, 636, -1, 638, -1, -1, - 641 + 394, 395, -1, -1, -1, -1, 400, -1, 402, 403, + 404, 405, 406, 407, 408, 409, 410, -1, -1, -1, + -1, 415, 416, -1, 418, -1, 420, 421, 422, 423, + 424, -1, 426, 427, 428, -1, -1, 431, -1, -1, + -1, 435, 436, 437, 438, 439, -1, -1, 442, 443, + 444, 445, 446, -1, 448, -1, -1, 451, -1, 453, + -1, -1, 456, -1, -1, -1, 460, -1, -1, 463, + 464, -1, 466, -1, 468, -1, -1, 471, -1, 473, + 474, 475, 476, 477, 478, 479, -1, 481, 482, -1, + 484, -1, -1, -1, -1, 489, 490, 491, -1, -1, + -1, -1, 496, -1, -1, -1, -1, -1, -1, 503, + -1, -1, 506, 507, -1, 509, -1, 511, -1, 513, + 514, -1, -1, -1, -1, -1, -1, 521, 522, -1, + 524, -1, -1, 527, -1, -1, -1, 531, -1, 533, + -1, -1, -1, 537, -1, -1, -1, 541, -1, 543, + 544, 545, 546, 547, 548, -1, -1, 551, 552, 553, + 554, -1, 556, 557, -1, -1, 560, 561, 562, 563, + -1, -1, 566, 567, -1, 569, 570, 571, 572, -1, + -1, -1, -1, -1, 578, 579, 580, -1, -1, -1, + -1, 585, 586, 587, -1, 589, 590, -1, 592, 593, + -1, -1, -1, -1, -1, 599, -1, -1, 602, -1, + -1, -1, 606, 607, -1, -1, -1, -1, -1, -1, + 614, -1, -1, 617, -1, -1, -1, 621, 622, 623, + 624, 625, 626, 627, -1, -1, -1, -1, -1, -1, + 634, -1, -1, 637, -1, 639, -1, -1, 642 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -18022,21 +18073,21 @@ static const yytype_int16 yycheck[] = static const yytype_uint16 yystos[] = { 0, 14, 16, 34, 38, 52, 53, 56, 60, 65, - 66, 85, 104, 128, 136, 137, 138, 150, 151, 163, - 177, 194, 210, 212, 216, 220, 234, 246, 248, 264, - 282, 286, 293, 381, 398, 400, 413, 424, 446, 449, - 451, 453, 454, 457, 458, 468, 471, 479, 485, 493, - 498, 499, 500, 531, 539, 583, 595, 599, 602, 607, - 629, 637, 643, 656, 667, 670, 671, 672, 673, 674, - 676, 681, 683, 696, 727, 755, 762, 763, 777, 778, - 797, 816, 831, 891, 945, 983, 1064, 1109, 1112, 1122, - 1127, 1133, 1146, 1149, 1155, 1158, 1163, 1170, 1182, 1183, - 1359, 1361, 1373, 1376, 1401, 1409, 1422, 1429, 1443, 1447, - 1448, 1452, 1463, 1471, 1475, 1480, 1481, 1482, 1536, 1567, - 1573, 1575, 1582, 1585, 1619, 1621, 1627, 1628, 1629, 1630, - 1683, 1691, 1692, 1693, 12, 115, 133, 203, 287, 418, - 491, 556, 1065, 1652, 1653, 1654, 1655, 198, 283, 368, - 1157, 1450, 363, 364, 1216, 1620, 564, 1525, 240, 5, + 66, 85, 104, 128, 136, 138, 139, 151, 152, 164, + 178, 195, 211, 213, 217, 221, 235, 247, 249, 265, + 283, 287, 294, 382, 399, 401, 414, 425, 447, 450, + 452, 454, 455, 458, 459, 469, 472, 480, 486, 494, + 499, 500, 501, 532, 540, 584, 596, 600, 603, 608, + 630, 638, 644, 657, 668, 671, 672, 673, 674, 675, + 677, 682, 684, 697, 728, 756, 763, 764, 778, 779, + 798, 817, 832, 892, 946, 984, 1065, 1110, 1113, 1123, + 1128, 1134, 1147, 1150, 1156, 1159, 1164, 1171, 1183, 1184, + 1360, 1362, 1374, 1377, 1402, 1410, 1423, 1430, 1444, 1448, + 1449, 1453, 1467, 1475, 1479, 1484, 1485, 1486, 1540, 1571, + 1577, 1579, 1586, 1589, 1623, 1625, 1631, 1632, 1633, 1634, + 1687, 1695, 1696, 1697, 12, 115, 133, 204, 288, 419, + 492, 557, 1066, 1656, 1657, 1658, 1659, 199, 284, 369, + 1158, 1451, 364, 365, 1217, 1624, 565, 1529, 241, 5, 7, 8, 9, 10, 11, 12, 15, 19, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 38, 42, 45, 46, 47, 49, 51, 52, 55, 58, 59, @@ -18044,764 +18095,766 @@ static const yytype_uint16 yystos[] = 74, 75, 76, 77, 78, 79, 80, 82, 83, 84, 85, 86, 87, 88, 89, 91, 92, 94, 95, 96, 97, 98, 100, 103, 106, 108, 111, 113, 117, 118, - 119, 122, 127, 128, 133, 135, 139, 141, 142, 143, - 144, 145, 150, 153, 154, 155, 159, 161, 162, 164, - 165, 166, 168, 169, 171, 172, 173, 174, 175, 176, - 177, 180, 181, 182, 183, 186, 187, 189, 190, 191, - 194, 198, 199, 201, 203, 205, 206, 207, 208, 209, - 210, 211, 213, 216, 217, 218, 220, 224, 225, 229, - 230, 231, 232, 233, 237, 238, 239, 242, 247, 248, - 252, 254, 255, 257, 258, 262, 265, 266, 267, 270, - 273, 274, 280, 281, 283, 285, 287, 288, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 310, 312, 313, 314, 315, 317, 318, - 319, 320, 322, 323, 324, 329, 330, 331, 332, 333, - 334, 337, 338, 340, 342, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 356, 359, 360, 361, 362, - 366, 367, 371, 373, 374, 375, 377, 378, 379, 380, - 382, 383, 392, 393, 394, 397, 399, 401, 402, 403, - 404, 405, 406, 407, 408, 409, 410, 413, 414, 415, - 417, 419, 420, 421, 422, 423, 425, 426, 427, 430, - 434, 435, 436, 437, 438, 441, 442, 443, 444, 445, - 447, 448, 450, 451, 452, 455, 457, 459, 460, 462, - 463, 465, 467, 470, 471, 472, 473, 474, 475, 476, - 477, 478, 479, 480, 481, 483, 484, 488, 489, 490, - 491, 495, 499, 501, 502, 503, 504, 505, 506, 508, - 509, 510, 511, 512, 513, 520, 521, 523, 526, 530, - 531, 532, 536, 539, 540, 542, 543, 544, 545, 546, - 547, 550, 551, 552, 553, 555, 556, 559, 560, 561, - 562, 565, 566, 568, 569, 570, 571, 577, 578, 579, - 583, 584, 585, 586, 588, 589, 591, 592, 594, 595, - 598, 601, 603, 605, 606, 613, 616, 620, 621, 622, - 623, 624, 625, 626, 633, 634, 636, 637, 638, 641, - 721, 1524, 1528, 1534, 1535, 798, 312, 555, 558, 1569, - 1150, 633, 1623, 287, 388, 556, 1410, 1360, 115, 173, - 203, 240, 287, 418, 470, 491, 556, 561, 580, 605, - 621, 1372, 1528, 1157, 108, 764, 720, 664, 1521, 1523, - 1528, 682, 779, 1374, 407, 511, 1476, 118, 240, 638, - 1487, 1569, 832, 1157, 656, 892, 1528, 1472, 479, 605, - 1569, 1157, 834, 1377, 1464, 517, 752, 756, 757, 1528, - 720, 1623, 1528, 1188, 1190, 1191, 1192, 532, 1537, 1430, - 756, 13, 503, 577, 13, 503, 558, 1424, 407, 511, - 1574, 1402, 1528, 833, 34, 85, 161, 413, 435, 471, - 531, 1685, 656, 1184, 1185, 0, 163, 668, 413, 115, - 202, 470, 514, 597, 605, 702, 703, 1042, 1043, 1044, - 1372, 182, 198, 401, 1449, 1450, 1521, 1528, 644, 1077, - 1528, 644, 721, 214, 721, 275, 1525, 1528, 1530, 837, - 838, 841, 864, 1528, 1101, 1102, 1071, 1204, 1652, 644, - 1569, 1182, 1373, 1376, 1401, 1409, 1446, 25, 1623, 1164, - 728, 664, 627, 799, 800, 803, 807, 694, 695, 1525, - 1123, 621, 1147, 1569, 18, 1624, 214, 454, 839, 864, - 236, 294, 427, 1420, 1421, 8, 22, 31, 37, 39, + 119, 122, 127, 128, 133, 135, 140, 142, 143, 144, + 145, 146, 151, 154, 155, 156, 160, 162, 163, 165, + 166, 167, 169, 170, 172, 173, 174, 175, 176, 177, + 178, 181, 182, 183, 184, 187, 188, 190, 191, 192, + 195, 199, 200, 202, 204, 206, 207, 208, 209, 210, + 211, 212, 214, 217, 218, 219, 221, 225, 226, 230, + 231, 232, 233, 234, 238, 239, 240, 243, 248, 249, + 253, 255, 256, 258, 259, 263, 266, 267, 268, 271, + 274, 275, 281, 282, 284, 286, 288, 289, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 313, 314, 315, 316, 318, 319, + 320, 321, 323, 324, 325, 330, 331, 332, 333, 334, + 335, 338, 339, 341, 343, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 357, 360, 361, 362, 363, + 367, 368, 372, 374, 375, 376, 378, 379, 380, 381, + 383, 384, 393, 394, 395, 398, 400, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 414, 415, 416, + 418, 420, 421, 422, 423, 424, 426, 427, 428, 431, + 435, 436, 437, 438, 439, 442, 443, 444, 445, 446, + 448, 449, 451, 452, 453, 456, 458, 460, 461, 463, + 464, 466, 468, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 484, 485, 489, 490, 491, + 492, 496, 500, 502, 503, 504, 505, 506, 507, 509, + 510, 511, 512, 513, 514, 521, 522, 524, 527, 531, + 532, 533, 537, 540, 541, 543, 544, 545, 546, 547, + 548, 551, 552, 553, 554, 556, 557, 560, 561, 562, + 563, 566, 567, 569, 570, 571, 572, 578, 579, 580, + 584, 585, 586, 587, 589, 590, 592, 593, 595, 596, + 599, 602, 604, 606, 607, 614, 617, 621, 622, 623, + 624, 625, 626, 627, 634, 635, 637, 638, 639, 642, + 722, 1528, 1532, 1538, 1539, 799, 313, 556, 559, 1573, + 1151, 634, 1627, 288, 389, 557, 1411, 1361, 115, 174, + 204, 241, 288, 419, 471, 492, 557, 562, 581, 606, + 622, 1373, 1532, 1158, 108, 765, 721, 665, 1525, 1527, + 1532, 683, 780, 1375, 408, 512, 1480, 118, 241, 639, + 1491, 1573, 833, 1158, 657, 893, 1532, 1476, 480, 606, + 1573, 1158, 835, 1378, 1468, 518, 753, 757, 758, 1532, + 721, 1627, 1532, 1189, 1191, 1192, 1193, 533, 1541, 1431, + 757, 13, 504, 578, 13, 504, 559, 1425, 408, 512, + 1578, 1403, 1532, 834, 34, 85, 162, 414, 436, 472, + 532, 1689, 657, 1185, 1186, 0, 164, 669, 414, 115, + 203, 471, 515, 598, 606, 703, 704, 1043, 1044, 1045, + 1373, 183, 199, 402, 1450, 1451, 1525, 1532, 645, 1078, + 1532, 645, 722, 215, 722, 276, 1529, 1532, 1534, 838, + 839, 842, 865, 1532, 1102, 1103, 1072, 1205, 1656, 645, + 1573, 1183, 1374, 1377, 1402, 1410, 1447, 25, 1627, 1165, + 729, 665, 628, 800, 801, 804, 808, 695, 696, 1529, + 1124, 622, 1148, 1573, 18, 1628, 215, 455, 840, 865, + 237, 295, 428, 1421, 1422, 8, 22, 31, 37, 39, 40, 41, 43, 56, 57, 62, 63, 71, 74, 76, 77, 78, 79, 80, 97, 101, 102, 107, 109, 110, - 114, 115, 120, 121, 122, 127, 129, 132, 178, 184, - 185, 192, 198, 207, 209, 215, 221, 222, 229, 234, - 246, 249, 267, 272, 280, 291, 316, 321, 333, 337, - 339, 343, 344, 345, 346, 347, 355, 363, 364, 365, - 369, 370, 375, 396, 403, 408, 409, 411, 425, 453, - 454, 467, 469, 476, 477, 483, 537, 538, 544, 548, - 549, 554, 564, 568, 569, 570, 571, 581, 582, 583, - 587, 590, 605, 609, 610, 611, 612, 617, 619, 625, - 626, 641, 649, 650, 655, 656, 659, 660, 663, 664, - 1210, 1211, 1212, 1213, 1217, 1225, 1226, 1227, 1228, 1229, - 1230, 1238, 1242, 1256, 1506, 1509, 1511, 1512, 1513, 1517, - 1519, 1524, 1528, 234, 1371, 1371, 1371, 234, 1370, 214, - 1371, 1371, 1371, 864, 1371, 1371, 1371, 1569, 677, 1453, - 141, 13, 14, 104, 110, 136, 151, 173, 177, 189, - 212, 240, 246, 286, 419, 423, 439, 447, 455, 485, - 498, 499, 550, 580, 602, 604, 1530, 1586, 1590, 1591, - 1593, 1595, 1596, 1528, 380, 70, 431, 664, 1530, 792, - 793, 134, 223, 294, 1379, 1528, 1525, 217, 510, 1477, - 250, 1483, 1568, 34, 70, 188, 259, 271, 380, 466, - 741, 776, 777, 780, 781, 782, 784, 785, 786, 787, - 789, 812, 814, 820, 827, 1524, 1529, 1535, 1569, 984, - 1204, 50, 893, 200, 37, 312, 1435, 1473, 1528, 720, - 1159, 1128, 741, 823, 134, 294, 1380, 1408, 312, 426, - 503, 1465, 1466, 613, 753, 493, 758, 7, 13, 423, - 1583, 1584, 1591, 1593, 575, 1624, 1189, 250, 386, 1323, - 1324, 1353, 1354, 13, 146, 223, 519, 520, 521, 522, - 523, 524, 541, 1197, 1198, 1199, 1648, 1538, 62, 63, - 132, 211, 283, 351, 403, 470, 490, 577, 663, 1007, - 1528, 1541, 1553, 1557, 1558, 13, 26, 38, 62, 74, - 100, 102, 104, 116, 165, 169, 172, 201, 203, 211, - 213, 239, 240, 261, 283, 312, 380, 406, 417, 418, - 421, 422, 442, 490, 503, 540, 558, 624, 1007, 1041, - 1431, 1435, 1436, 1438, 1447, 1524, 1554, 758, 504, 694, - 431, 630, 1113, 1114, 1115, 504, 694, 1423, 1528, 1525, - 1569, 1408, 821, 1210, 39, 221, 222, 564, 1507, 1508, - 1526, 1684, 1684, 1684, 1684, 1684, 1184, 657, 485, 662, - 1528, 234, 944, 944, 944, 1649, 1653, 1654, 1655, 491, - 704, 240, 240, 240, 558, 1445, 1444, 331, 562, 589, - 1067, 603, 109, 1530, 1531, 1532, 1590, 1069, 843, 865, - 1528, 1068, 1073, 6, 60, 151, 364, 430, 432, 866, - 558, 236, 379, 1103, 1104, 1105, 525, 1656, 1657, 173, - 1070, 1530, 1134, 817, 1165, 1166, 1167, 1168, 1521, 656, - 729, 1528, 808, 157, 810, 1210, 807, 575, 1365, 1366, - 1521, 1148, 1365, 59, 366, 366, 446, 1625, 842, 865, - 6, 200, 1411, 1417, 1418, 1528, 1420, 656, 656, 656, - 1225, 656, 656, 656, 1210, 1259, 656, 656, 656, 656, - 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, - 1209, 1209, 1209, 656, 1208, 656, 656, 656, 564, 656, - 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, - 656, 656, 1210, 656, 656, 656, 656, 1257, 1258, 1517, - 1528, 656, 656, 656, 656, 656, 656, 656, 656, 656, - 1210, 1208, 656, 656, 656, 656, 656, 656, 656, 656, - 656, 656, 656, 656, 656, 656, 656, 656, 656, 656, - 1208, 564, 656, 656, 656, 564, 656, 656, 656, 564, - 1508, 656, 1209, 1208, 1208, 656, 656, 656, 656, 656, - 656, 1225, 1225, 1225, 1210, 1643, 1644, 1528, 1243, 1528, - 17, 18, 385, 388, 639, 1214, 1215, 167, 204, 256, - 268, 357, 644, 645, 646, 1218, 35, 147, 253, 276, - 343, 440, 496, 497, 512, 647, 648, 649, 650, 651, - 652, 653, 654, 1216, 1225, 73, 387, 658, 1526, 656, - 664, 178, 1528, 721, 1528, 178, 1528, 865, 721, 720, - 1530, 875, 1436, 721, 720, 1364, 1371, 608, 678, 37, - 139, 165, 168, 205, 225, 288, 312, 417, 426, 441, - 459, 503, 506, 536, 1454, 1459, 1460, 1524, 1569, 90, - 663, 765, 766, 767, 768, 1528, 417, 1594, 473, 473, - 556, 561, 605, 621, 1209, 383, 1598, 555, 376, 1600, - 69, 503, 1597, 116, 621, 1599, 575, 376, 658, 20, - 644, 1309, 1310, 1576, 1528, 161, 1210, 236, 1100, 511, - 91, 426, 1478, 52, 89, 294, 1489, 1521, 1570, 1571, - 815, 1528, 200, 360, 790, 1529, 1529, 1528, 783, 161, - 776, 662, 671, 826, 665, 1156, 657, 1210, 278, 281, - 428, 894, 896, 663, 675, 1525, 288, 1160, 1531, 1533, - 1161, 1162, 1521, 621, 1125, 1569, 601, 826, 250, 1367, - 1381, 1382, 1521, 1468, 52, 1467, 658, 1526, 58, 68, - 82, 94, 95, 96, 113, 332, 350, 481, 543, 560, - 759, 761, 383, 1594, 376, 200, 376, 479, 1626, 1625, - 596, 1631, 1632, 1355, 50, 277, 1328, 1329, 1330, 200, - 1194, 197, 286, 1200, 651, 1201, 1202, 1204, 1199, 132, - 1540, 1556, 1558, 493, 470, 664, 37, 132, 494, 644, - 1008, 1009, 1392, 1530, 197, 1392, 1564, 1530, 1543, 663, - 1530, 37, 132, 1011, 1012, 1530, 664, 1544, 1542, 1392, - 504, 172, 276, 628, 1442, 656, 115, 173, 203, 418, - 558, 580, 621, 1442, 13, 954, 1530, 1328, 200, 253, - 1437, 1439, 72, 536, 197, 536, 555, 511, 72, 536, - 13, 45, 98, 103, 255, 330, 394, 513, 552, 1425, - 1426, 1427, 694, 225, 536, 695, 536, 1328, 1442, 1439, - 288, 164, 75, 420, 555, 579, 197, 1203, 536, 616, - 1116, 1117, 1116, 378, 635, 92, 658, 1116, 1116, 1366, - 1100, 826, 150, 658, 377, 1687, 551, 1688, 260, 462, - 1686, 657, 1632, 1634, 1635, 1636, 1637, 1190, 163, 669, - 1216, 1528, 720, 720, 11, 203, 418, 580, 708, 1204, - 1651, 1657, 1665, 1670, 1671, 1672, 1678, 203, 708, 1650, - 1657, 1665, 1672, 1678, 1652, 944, 944, 944, 944, 944, - 1446, 1451, 1507, 1528, 132, 941, 942, 951, 952, 1016, - 118, 1209, 663, 722, 6, 844, 722, 382, 117, 861, - 861, 861, 4, 1521, 1105, 484, 621, 721, 1657, 1135, - 1136, 1366, 818, 819, 253, 658, 400, 1176, 1178, 1179, - 730, 731, 1210, 1210, 741, 161, 801, 684, 182, 427, - 658, 1124, 1365, 61, 182, 186, 197, 329, 427, 1151, - 1152, 1153, 59, 446, 844, 861, 1368, 1369, 1521, 1522, - 1528, 658, 1414, 664, 1419, 1210, 1210, 13, 146, 1250, - 1311, 1250, 1250, 1250, 627, 1261, 1210, 1210, 1256, 1256, - 1210, 1210, 1210, 1210, 1223, 1224, 1210, 1210, 1210, 1210, - 146, 1250, 1311, 657, 129, 192, 221, 291, 370, 587, - 657, 1337, 1340, 1341, 657, 1210, 1210, 1210, 1210, 1517, - 1643, 123, 124, 125, 126, 127, 226, 227, 228, 229, - 333, 335, 336, 337, 344, 425, 482, 483, 625, 640, - 641, 1306, 1307, 1210, 1256, 119, 122, 568, 571, 1308, - 146, 1245, 1210, 1210, 1210, 1210, 1306, 1256, 1210, 1256, - 1258, 10, 658, 664, 146, 1250, 1210, 1210, 146, 1250, - 1210, 1210, 1256, 1256, 1256, 1210, 1210, 1210, 1256, 1213, - 1210, 1210, 1210, 1210, 1210, 1210, 657, 1210, 1250, 1250, - 1210, 1210, 146, 1250, 1210, 1307, 1307, 1210, 48, 269, - 576, 1210, 1210, 657, 1518, 1519, 1528, 1250, 1250, 1210, - 1210, 1210, 657, 658, 657, 485, 656, 1640, 1641, 1210, - 663, 1244, 1530, 664, 1210, 1210, 1210, 1212, 185, 369, - 582, 598, 1216, 13, 19, 1212, 1219, 1213, 1213, 656, - 1225, 1213, 1213, 1213, 1213, 276, 1213, 1213, 249, 1213, - 249, 1213, 1213, 1213, 1213, 1213, 35, 253, 276, 440, - 1530, 1225, 1210, 1231, 1528, 664, 376, 875, 1589, 1591, - 367, 623, 876, 877, 165, 1533, 1605, 1365, 1362, 663, - 679, 680, 288, 288, 288, 288, 52, 288, 694, 288, - 658, 1203, 1455, 122, 568, 571, 760, 770, 1242, 1511, - 1517, 1530, 658, 644, 555, 656, 1611, 1533, 1611, 1611, - 1611, 1531, 1532, 1533, 1606, 1610, 203, 418, 558, 1592, - 173, 177, 189, 419, 447, 455, 499, 550, 1596, 1528, - 190, 360, 1528, 1577, 1578, 234, 567, 1381, 1525, 230, - 605, 1210, 1479, 1171, 283, 1488, 1310, 658, 818, 200, - 1528, 1210, 293, 662, 34, 293, 453, 629, 1365, 1205, - 75, 656, 901, 902, 901, 902, 401, 904, 218, 263, - 1530, 33, 575, 1474, 658, 575, 658, 575, 1126, 1365, - 824, 1382, 1378, 400, 1275, 1276, 575, 1470, 694, 1466, - 658, 644, 197, 658, 1533, 1532, 1607, 203, 418, 1592, - 1528, 13, 146, 1639, 153, 390, 1348, 1349, 1356, 1325, - 1200, 291, 370, 474, 587, 1331, 1332, 1509, 1528, 152, - 485, 656, 660, 1196, 1262, 1263, 1264, 1265, 1266, 1277, - 1278, 1290, 628, 1312, 602, 253, 658, 1210, 1515, 1528, - 658, 1539, 1392, 1591, 1528, 73, 1014, 1210, 1533, 375, - 403, 564, 1565, 257, 431, 1559, 1560, 1561, 1562, 211, - 283, 490, 1555, 1392, 1528, 577, 1545, 1556, 658, 1547, - 13, 37, 132, 376, 1210, 1566, 536, 253, 1440, 1203, - 1203, 651, 944, 721, 721, 721, 1521, 721, 1521, 288, - 348, 536, 1434, 1434, 1442, 1528, 721, 1442, 1532, 1437, - 1442, 1525, 721, 1442, 254, 553, 187, 197, 1428, 658, - 172, 536, 1437, 1521, 1439, 1437, 1437, 1210, 1442, 1442, - 1442, 1111, 445, 526, 1118, 1119, 1110, 508, 1115, 1263, - 822, 1507, 405, 1689, 1324, 1330, 1638, 178, 701, 1589, - 1606, 203, 1671, 944, 944, 1204, 173, 944, 1657, 1530, - 1528, 1528, 1528, 1521, 942, 73, 1007, 142, 1530, 83, - 97, 265, 341, 366, 429, 525, 724, 726, 436, 591, - 862, 863, 242, 858, 859, 860, 867, 875, 877, 656, - 1525, 27, 320, 852, 853, 854, 867, 868, 869, 875, - 877, 845, 846, 852, 1066, 133, 252, 944, 1072, 658, - 404, 1137, 742, 132, 1169, 1528, 1167, 1521, 890, 1178, - 240, 263, 1039, 1180, 657, 658, 809, 56, 627, 802, - 804, 149, 235, 237, 295, 297, 298, 299, 300, 301, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 313, - 314, 315, 443, 444, 685, 686, 693, 1366, 197, 1154, - 603, 1152, 83, 361, 437, 592, 855, 856, 857, 867, - 871, 872, 873, 874, 875, 877, 607, 840, 658, 1415, - 1275, 664, 1419, 1418, 200, 651, 1528, 658, 657, 1250, - 657, 1251, 657, 657, 657, 1210, 157, 627, 1260, 20, - 657, 608, 657, 657, 657, 658, 657, 658, 657, 658, - 658, 658, 658, 608, 658, 1239, 657, 651, 657, 658, - 658, 657, 657, 657, 657, 200, 658, 657, 658, 1241, - 657, 658, 658, 658, 650, 657, 658, 657, 657, 656, - 1517, 1528, 1250, 657, 657, 657, 1250, 657, 658, 657, - 657, 657, 657, 657, 657, 658, 657, 253, 657, 658, - 658, 657, 658, 658, 657, 657, 657, 658, 200, 658, - 1250, 657, 657, 658, 658, 658, 657, 200, 1210, 200, - 1210, 200, 1210, 200, 657, 658, 657, 657, 657, 657, - 658, 20, 274, 658, 1030, 657, 1256, 1281, 1282, 1283, - 656, 1186, 1187, 596, 1645, 661, 1555, 494, 1528, 185, - 369, 582, 598, 656, 18, 1210, 1643, 171, 1316, 1213, - 1210, 1210, 1213, 656, 1225, 1213, 1204, 1235, 1236, 1237, - 656, 664, 1528, 1521, 876, 658, 1392, 1393, 658, 54, - 461, 1106, 1365, 1530, 658, 694, 1460, 1365, 1461, 768, - 771, 772, 767, 371, 477, 769, 1528, 1612, 1613, 575, - 232, 630, 658, 1588, 651, 1521, 1528, 1604, 1604, 1604, - 190, 204, 266, 268, 360, 415, 644, 645, 646, 1579, - 1581, 1312, 794, 1375, 1533, 1172, 1173, 1174, 1175, 1521, - 241, 294, 431, 635, 1572, 1571, 250, 813, 828, 830, - 829, 656, 1204, 1337, 547, 905, 895, 12, 897, 1210, - 1525, 1533, 1533, 1162, 1521, 1365, 182, 427, 606, 1129, - 1130, 1131, 1210, 485, 493, 612, 613, 656, 936, 1383, - 1386, 656, 129, 192, 221, 291, 370, 587, 1336, 13, - 1469, 761, 760, 1591, 212, 200, 658, 1604, 1604, 1604, - 1633, 564, 1527, 1527, 663, 1350, 1351, 1352, 1530, 1210, - 1326, 1516, 176, 474, 374, 658, 1289, 1528, 105, 243, - 260, 272, 354, 469, 541, 1273, 1274, 658, 1521, 1289, - 1313, 214, 1317, 495, 1202, 1205, 1205, 664, 1556, 197, - 1566, 197, 132, 1013, 1015, 1530, 1392, 656, 656, 274, - 378, 635, 658, 658, 664, 664, 664, 1558, 1210, 1559, - 1546, 1548, 1549, 1525, 200, 1441, 1525, 1210, 657, 1528, - 720, 1442, 426, 1328, 1427, 1440, 1442, 1437, 1521, 1442, - 1442, 658, 601, 1120, 493, 741, 658, 197, 1690, 1328, - 940, 941, 630, 1587, 944, 721, 1528, 721, 944, 944, - 705, 585, 608, 1052, 376, 376, 697, 1393, 1393, 352, - 1525, 525, 525, 525, 525, 525, 484, 1525, 1525, 1393, - 658, 860, 115, 224, 392, 403, 410, 509, 605, 706, - 707, 1393, 1393, 658, 854, 847, 848, 867, 868, 869, - 6, 12, 14, 16, 28, 30, 60, 65, 66, 71, - 83, 91, 101, 118, 135, 143, 144, 151, 159, 165, - 175, 195, 238, 240, 247, 262, 286, 319, 338, 342, - 381, 386, 393, 395, 400, 403, 434, 448, 449, 450, - 451, 475, 533, 534, 535, 540, 556, 559, 578, 583, - 596, 888, 947, 949, 951, 952, 1078, 1082, 1084, 1087, - 1093, 1094, 1095, 1097, 1098, 1320, 1524, 1521, 376, 716, - 1074, 1136, 197, 131, 740, 743, 1177, 656, 1210, 567, - 805, 804, 644, 644, 644, 644, 644, 644, 644, 644, - 644, 644, 644, 644, 644, 644, 644, 644, 644, 644, - 644, 644, 644, 644, 644, 658, 603, 1393, 1393, 1393, - 1393, 658, 857, 287, 183, 849, 850, 851, 867, 868, - 869, 870, 873, 874, 875, 877, 1369, 1528, 608, 1412, - 1528, 1263, 664, 1419, 249, 1210, 657, 1210, 567, 1210, - 1210, 161, 37, 63, 119, 122, 130, 148, 251, 356, - 501, 571, 600, 1252, 1008, 1224, 1210, 1223, 1256, 1210, - 1210, 1008, 1252, 1256, 657, 249, 249, 1210, 1210, 1210, - 1256, 1210, 1210, 1210, 1210, 1210, 1213, 657, 657, 1210, - 1210, 1210, 1210, 1210, 1210, 1256, 249, 1210, 1210, 1210, - 657, 1210, 1210, 1210, 1210, 200, 1210, 200, 1210, 200, - 1210, 1210, 1210, 37, 63, 1025, 1026, 1027, 1028, 1029, - 1337, 1336, 657, 657, 1193, 1194, 1195, 1646, 1647, 1648, - 1186, 657, 485, 1639, 1530, 1210, 1643, 1212, 657, 658, - 657, 1225, 1306, 1306, 18, 1210, 1643, 1316, 1210, 657, - 658, 1255, 1256, 1528, 1363, 1591, 953, 1530, 1533, 1106, - 680, 197, 630, 1456, 1457, 644, 658, 657, 658, 1606, - 50, 620, 630, 1608, 7, 1610, 664, 664, 575, 575, - 575, 1580, 1328, 741, 1383, 658, 1176, 1178, 1527, 635, - 283, 89, 788, 818, 820, 823, 821, 898, 899, 900, - 1528, 910, 1213, 50, 656, 912, 902, 644, 656, 575, - 200, 1132, 1130, 161, 937, 1384, 656, 1389, 1394, 1389, - 657, 936, 1385, 1514, 1515, 1518, 1528, 1387, 1305, 1528, - 644, 383, 1605, 1532, 200, 200, 200, 1183, 1357, 1530, - 658, 658, 21, 137, 1327, 1332, 1333, 176, 1332, 1332, - 1279, 1284, 1289, 1262, 260, 260, 389, 1291, 272, 469, - 1273, 1291, 1262, 1264, 1275, 1286, 1287, 1210, 50, 219, - 1314, 340, 20, 1206, 1525, 1528, 651, 1528, 670, 1533, - 564, 564, 431, 452, 488, 1563, 1561, 1560, 1392, 1547, - 658, 1551, 1553, 1557, 129, 192, 291, 370, 587, 1338, - 1432, 169, 624, 370, 1441, 1312, 1437, 1119, 296, 693, - 1121, 1404, 1405, 1518, 161, 1336, 334, 7, 1528, 656, - 465, 1679, 1666, 721, 196, 49, 218, 478, 1058, 1058, - 376, 1521, 1521, 276, 656, 879, 882, 946, 948, 949, - 1015, 1009, 118, 118, 133, 252, 221, 291, 370, 587, - 878, 1339, 1340, 1524, 860, 1525, 1525, 1525, 1525, 1336, - 1525, 1525, 657, 658, 878, 878, 854, 658, 848, 81, - 93, 400, 962, 972, 973, 1039, 1043, 1044, 1099, 1393, - 1099, 400, 1393, 1393, 1099, 1393, 400, 400, 1393, 1393, - 575, 142, 1393, 261, 556, 196, 400, 416, 1039, 1099, - 261, 1393, 400, 556, 142, 1393, 1393, 1393, 1393, 1393, - 1099, 400, 50, 1393, 1393, 890, 1393, 400, 402, 20, - 575, 644, 1108, 400, 400, 1393, 1393, 1393, 1393, 145, - 330, 1528, 1393, 1393, 400, 1393, 947, 658, 887, 888, - 1082, 656, 664, 961, 974, 1520, 1528, 1392, 1658, 87, - 480, 449, 1075, 13, 75, 1138, 99, 179, 748, 774, - 1528, 161, 776, 662, 656, 416, 1302, 1303, 1304, 1528, - 741, 1210, 656, 656, 656, 1336, 1525, 1525, 1338, 1525, - 1336, 1525, 1525, 1525, 1525, 1525, 1525, 1525, 1336, 1336, - 1525, 111, 366, 505, 1512, 1525, 1336, 686, 1525, 1337, - 878, 878, 857, 214, 1393, 658, 851, 664, 1263, 1312, - 1419, 1312, 1210, 657, 1210, 567, 656, 999, 1000, 1000, - 1000, 656, 994, 995, 999, 1254, 1000, 251, 1000, 251, - 657, 657, 657, 20, 1220, 657, 20, 657, 657, 657, - 1240, 1210, 1210, 657, 657, 658, 657, 386, 1247, 658, - 658, 657, 658, 657, 253, 1232, 1233, 657, 657, 657, - 657, 658, 657, 657, 1210, 657, 197, 657, 657, 658, - 657, 658, 658, 657, 1210, 657, 1210, 657, 1210, 657, - 657, 657, 656, 1020, 1020, 21, 137, 467, 649, 1022, - 1023, 1024, 658, 658, 1312, 1201, 1648, 657, 1635, 1282, - 1642, 664, 1062, 657, 1256, 1212, 657, 658, 657, 1205, - 1237, 657, 1458, 431, 58, 68, 82, 94, 95, 96, - 113, 332, 350, 463, 481, 543, 560, 773, 772, 1613, - 630, 1616, 403, 564, 1530, 383, 651, 651, 1606, 1606, - 1606, 656, 795, 376, 1399, 1174, 1521, 1178, 236, 1181, - 1484, 791, 1528, 811, 1529, 811, 825, 825, 825, 657, - 658, 1205, 896, 400, 913, 914, 1337, 898, 1533, 349, - 453, 1197, 1390, 1391, 1518, 1395, 658, 656, 1386, 657, - 657, 658, 664, 1631, 657, 658, 760, 200, 1607, 1607, - 1607, 1007, 1010, 1351, 1516, 1333, 596, 657, 1635, 1285, - 661, 260, 1291, 1291, 1277, 260, 376, 608, 1310, 1197, - 1318, 1516, 1315, 1323, 1525, 1528, 664, 657, 657, 84, - 588, 431, 1566, 1550, 1552, 1328, 1433, 1442, 644, 658, - 658, 1403, 1392, 629, 1532, 1673, 130, 251, 433, 542, - 957, 656, 721, 709, 118, 1521, 699, 700, 1521, 276, - 936, 958, 959, 960, 961, 962, 886, 887, 658, 948, - 707, 848, 1061, 1520, 944, 66, 196, 416, 597, 971, - 1038, 944, 1039, 1040, 1040, 234, 943, 132, 1528, 1520, - 1157, 1338, 1336, 1370, 1336, 13, 1083, 1091, 1092, 1528, - 1157, 1525, 1525, 1007, 1393, 1336, 263, 1371, 263, 1370, - 1370, 953, 1092, 1393, 190, 266, 366, 956, 1336, 132, - 1528, 1338, 1338, 1370, 1157, 1321, 1322, 1518, 132, 1336, - 132, 1336, 1342, 889, 1525, 1157, 1521, 1157, 1157, 86, - 88, 132, 155, 191, 394, 438, 955, 132, 1336, 132, - 1336, 132, 1336, 1336, 1342, 1083, 950, 6, 151, 1095, - 958, 1528, 9, 190, 1107, 439, 970, 971, 1032, 975, - 664, 132, 1339, 1525, 1528, 656, 1659, 1216, 1622, 24, - 174, 710, 575, 143, 159, 712, 13, 656, 1139, 216, - 658, 744, 90, 112, 662, 1083, 657, 658, 806, 689, - 690, 1336, 691, 692, 1336, 687, 688, 1336, 1528, 878, - 851, 1528, 1312, 1323, 1306, 1210, 129, 291, 370, 587, - 1253, 370, 656, 995, 1001, 63, 119, 122, 130, 148, - 193, 251, 353, 356, 433, 571, 600, 987, 988, 1221, - 1252, 657, 1306, 1306, 1210, 50, 487, 1246, 1210, 1210, - 1256, 46, 354, 657, 630, 1234, 1210, 1306, 1210, 1210, - 1210, 1210, 657, 657, 657, 1337, 657, 1030, 1025, 1023, - 1025, 1026, 1336, 1317, 1193, 1640, 1528, 657, 1256, 1206, - 181, 286, 212, 564, 20, 608, 1609, 456, 1614, 1614, - 1614, 132, 1210, 1397, 1398, 157, 158, 796, 154, 1181, - 270, 236, 454, 1490, 658, 900, 657, 218, 263, 915, - 657, 658, 657, 1201, 658, 1392, 1396, 1397, 1394, 1388, - 1386, 1514, 1528, 890, 1528, 1607, 1009, 1358, 1327, 1639, - 1310, 1265, 1262, 1277, 260, 260, 1262, 1277, 1267, 1268, - 1300, 1301, 1201, 631, 632, 658, 1319, 1327, 1210, 1328, - 651, 1551, 1556, 1328, 1525, 693, 1405, 1312, 1398, 732, - 733, 734, 1528, 511, 1680, 9, 33, 835, 376, 634, - 698, 656, 656, 1521, 657, 657, 658, 883, 1490, 948, - 1157, 656, 263, 263, 1040, 944, 1061, 1528, 944, 944, - 1216, 151, 493, 1083, 1520, 1080, 658, 1337, 1009, 1525, - 1370, 1091, 1520, 1520, 630, 1525, 974, 1083, 658, 1327, - 893, 1083, 1088, 1083, 656, 657, 1528, 1521, 36, 37, - 42, 44, 46, 47, 119, 122, 130, 148, 166, 191, - 193, 207, 208, 251, 280, 289, 290, 292, 326, 327, - 328, 345, 346, 347, 353, 356, 372, 373, 408, 409, - 433, 489, 493, 507, 565, 568, 571, 572, 573, 574, - 614, 615, 641, 985, 986, 987, 988, 989, 990, 991, - 992, 1528, 1528, 1660, 20, 414, 1210, 1210, 376, 716, - 721, 376, 83, 717, 1140, 239, 197, 1528, 985, 1005, - 197, 197, 657, 1303, 567, 657, 658, 657, 658, 657, - 658, 277, 1334, 657, 657, 657, 657, 657, 22, 37, - 51, 594, 1007, 1017, 1018, 658, 370, 1000, 994, 63, - 1000, 251, 1222, 657, 657, 657, 657, 1248, 1507, 657, - 657, 658, 657, 340, 265, 426, 657, 657, 657, 657, - 657, 657, 1021, 657, 658, 1314, 657, 18, 1462, 383, - 1525, 67, 258, 362, 528, 545, 636, 1602, 1603, 630, - 1615, 1615, 1615, 657, 658, 741, 792, 1400, 250, 1528, - 656, 903, 897, 916, 1528, 914, 938, 1391, 1398, 657, - 1634, 75, 1491, 1280, 376, 1270, 1277, 1277, 376, 1272, - 1210, 656, 1298, 1299, 1288, 1516, 418, 1343, 1323, 657, - 658, 735, 1525, 244, 253, 391, 736, 737, 738, 739, - 136, 246, 602, 836, 480, 1530, 656, 1059, 1060, 1528, - 1059, 657, 881, 880, 960, 20, 939, 1085, 1210, 944, - 1061, 1528, 608, 1051, 585, 1061, 1061, 178, 132, 132, - 974, 1151, 1092, 1014, 1520, 1106, 558, 1107, 1079, 1322, - 1089, 1091, 1081, 1461, 656, 1033, 999, 999, 1000, 1000, - 994, 412, 656, 994, 994, 1018, 63, 614, 987, 989, - 1018, 1018, 63, 615, 615, 618, 994, 656, 1000, 1000, - 1000, 1018, 999, 1000, 976, 994, 618, 999, 1018, 37, - 999, 1019, 999, 999, 1000, 1001, 664, 657, 658, 1661, - 1662, 1306, 503, 1525, 150, 1076, 1143, 1528, 13, 656, - 1141, 745, 1014, 132, 775, 751, 752, 1336, 746, 747, - 741, 690, 692, 688, 474, 1332, 1413, 1017, 1008, 1019, - 370, 1018, 1249, 1516, 1210, 340, 180, 657, 1336, 1323, - 143, 564, 564, 564, 18, 1601, 212, 317, 318, 322, - 323, 324, 1617, 1618, 1398, 263, 558, 1204, 906, 656, - 612, 917, 1193, 160, 170, 384, 563, 1492, 1493, 279, - 1494, 1640, 1269, 608, 1271, 608, 1305, 195, 236, 607, - 1293, 1294, 1297, 1193, 1327, 1528, 1353, 1354, 1334, 1674, - 734, 1005, 657, 658, 734, 376, 710, 382, 1059, 657, - 658, 1327, 656, 657, 1634, 946, 656, 936, 401, 656, - 1086, 657, 1061, 1051, 585, 1058, 963, 1058, 965, 966, - 122, 568, 571, 649, 650, 1510, 1511, 1107, 1521, 1157, - 1090, 1129, 657, 1034, 1528, 316, 1035, 501, 600, 642, - 996, 997, 998, 1063, 1507, 996, 996, 1018, 618, 996, - 1063, 1018, 996, 28, 73, 83, 132, 206, 369, 376, - 416, 489, 597, 977, 978, 1002, 1003, 1004, 1031, 1216, - 1524, 527, 993, 1018, 1019, 1018, 1019, 996, 996, 1528, - 1528, 485, 656, 1663, 711, 718, 719, 657, 658, 1142, - 516, 518, 749, 750, 751, 754, 1216, 1528, 1210, 1182, - 176, 474, 464, 1416, 657, 658, 1327, 657, 657, 1328, - 64, 1602, 383, 1336, 1336, 1336, 1512, 370, 649, 1335, - 1618, 602, 1521, 910, 546, 911, 908, 909, 1528, 253, - 273, 83, 91, 118, 240, 319, 338, 361, 556, 933, - 934, 935, 1436, 50, 50, 160, 50, 1493, 529, 563, - 1495, 1496, 1210, 656, 1210, 656, 657, 1039, 1039, 1294, - 1344, 1200, 465, 1681, 738, 1204, 715, 716, 656, 657, - 83, 262, 630, 1046, 1050, 1054, 1057, 1524, 1060, 370, - 1047, 1049, 1054, 1056, 886, 936, 884, 1337, 913, 969, - 967, 1058, 656, 964, 656, 656, 1512, 1512, 890, 250, - 657, 658, 201, 399, 502, 376, 1036, 998, 657, 658, - 657, 1013, 1525, 365, 1006, 1510, 15, 602, 132, 263, - 20, 1004, 263, 369, 1392, 644, 1188, 1184, 630, 1664, - 530, 713, 776, 1528, 416, 1144, 1145, 1528, 658, 776, - 199, 176, 1201, 1516, 1343, 291, 370, 1406, 1407, 1518, - 1275, 1205, 1337, 657, 658, 919, 566, 1393, 1393, 142, - 142, 1393, 1393, 1393, 1393, 656, 928, 935, 165, 1507, - 1507, 50, 1507, 50, 50, 1496, 1305, 1305, 197, 1292, - 1292, 656, 1675, 723, 1667, 712, 706, 585, 608, 1045, - 1048, 1053, 1054, 1055, 1525, 1393, 397, 1096, 1097, 1098, - 1057, 1392, 1327, 657, 1096, 1056, 883, 657, 1631, 657, - 656, 656, 968, 1059, 656, 1059, 1059, 656, 1528, 136, - 602, 1018, 1507, 1018, 656, 1207, 365, 613, 656, 132, - 1339, 1525, 1528, 370, 657, 55, 66, 283, 1210, 162, - 714, 657, 658, 750, 1327, 1200, 658, 1392, 1485, 657, - 907, 909, 656, 921, 923, 918, 1525, 1525, 1393, 1393, - 1339, 1339, 1337, 1530, 547, 929, 930, 1393, 1507, 1507, - 1507, 657, 657, 214, 260, 386, 1296, 1295, 1204, 1345, - 1346, 1347, 1005, 724, 725, 1622, 1682, 1521, 717, 657, - 1058, 1058, 1096, 1055, 1336, 1524, 1098, 1097, 132, 1339, - 1525, 1528, 885, 1059, 1059, 656, 657, 1059, 657, 657, - 913, 54, 366, 461, 493, 1037, 1037, 657, 1337, 1207, - 984, 1634, 66, 383, 66, 1210, 1145, 1407, 1398, 1010, - 911, 656, 922, 923, 924, 325, 920, 923, 1525, 1525, - 931, 657, 658, 953, 50, 50, 656, 656, 1210, 657, - 658, 1676, 140, 776, 197, 150, 1634, 657, 657, 1059, - 1045, 657, 1046, 1047, 657, 5, 132, 369, 376, 376, - 657, 657, 383, 383, 1486, 657, 658, 325, 926, 927, - 1213, 932, 1530, 930, 1302, 1304, 1205, 1347, 723, 1204, - 718, 1032, 1045, 657, 1045, 602, 136, 404, 622, 979, - 474, 1497, 923, 658, 925, 933, 657, 657, 1677, 1668, - 1045, 1037, 1037, 83, 597, 980, 981, 982, 232, 1491, - 927, 657, 776, 156, 1525, 263, 982, 50, 1494, 476, - 1507, 236, 1498, 1669, 370, 656, 1500, 776, 279, 474, - 1499, 657, 663, 1501, 1502, 1518, 493, 1503, 1530, 657, - 658, 1504, 1505, 1518, 1502, 658, 1392, 1505, 1204, 1398, - 1205 + 114, 115, 120, 121, 122, 127, 129, 132, 179, 185, + 186, 193, 199, 208, 210, 216, 222, 223, 230, 235, + 247, 250, 268, 273, 281, 292, 317, 322, 334, 338, + 340, 344, 345, 346, 347, 348, 356, 364, 365, 366, + 370, 371, 376, 397, 404, 409, 410, 412, 426, 454, + 455, 468, 470, 477, 478, 484, 538, 539, 545, 549, + 550, 555, 565, 569, 570, 571, 572, 582, 583, 584, + 588, 591, 606, 610, 611, 612, 613, 618, 620, 626, + 627, 642, 650, 651, 656, 657, 660, 661, 664, 665, + 1211, 1212, 1213, 1214, 1218, 1226, 1227, 1228, 1229, 1230, + 1231, 1239, 1243, 1257, 1510, 1513, 1515, 1516, 1517, 1521, + 1523, 1528, 1532, 235, 1372, 1372, 1372, 235, 1371, 215, + 1372, 1372, 1372, 865, 1372, 1372, 1372, 1573, 678, 1454, + 142, 13, 14, 104, 110, 136, 152, 174, 178, 190, + 213, 241, 247, 287, 420, 424, 440, 448, 456, 486, + 499, 500, 551, 581, 603, 605, 1534, 1590, 1594, 1595, + 1597, 1599, 1600, 1532, 381, 70, 432, 665, 1534, 793, + 794, 134, 224, 295, 1380, 1532, 1529, 218, 511, 1481, + 251, 1487, 1572, 34, 70, 189, 260, 272, 381, 467, + 742, 777, 778, 781, 782, 783, 785, 786, 787, 788, + 790, 813, 815, 821, 828, 1528, 1533, 1539, 1573, 985, + 1205, 50, 894, 201, 37, 313, 1436, 1477, 1532, 721, + 1160, 1129, 742, 824, 134, 295, 1381, 1409, 313, 427, + 504, 1469, 1470, 614, 754, 494, 759, 7, 13, 424, + 1587, 1588, 1595, 1597, 576, 1628, 1190, 251, 387, 1324, + 1325, 1354, 1355, 13, 147, 224, 520, 521, 522, 523, + 524, 525, 542, 1198, 1199, 1200, 1652, 1542, 62, 63, + 132, 212, 284, 352, 404, 471, 491, 578, 664, 1008, + 1532, 1545, 1557, 1561, 1562, 13, 26, 38, 62, 74, + 100, 102, 104, 116, 166, 170, 173, 202, 204, 212, + 214, 240, 241, 262, 284, 313, 381, 407, 418, 419, + 422, 423, 443, 491, 504, 541, 559, 625, 1008, 1042, + 1432, 1436, 1437, 1439, 1448, 1528, 1558, 759, 505, 695, + 432, 631, 1114, 1115, 1116, 505, 695, 1424, 1532, 1529, + 1573, 1409, 822, 1211, 39, 222, 223, 565, 1511, 1512, + 1530, 1688, 1688, 1688, 1688, 1688, 1185, 658, 486, 663, + 1532, 235, 945, 945, 945, 1653, 1657, 1658, 1659, 492, + 705, 241, 241, 241, 559, 1446, 1445, 332, 563, 590, + 1068, 604, 109, 1534, 1535, 1536, 1594, 1070, 844, 866, + 1532, 1069, 1074, 6, 60, 152, 365, 431, 433, 867, + 559, 237, 380, 1104, 1105, 1106, 526, 1660, 1661, 174, + 1071, 1534, 1135, 818, 1166, 1167, 1168, 1169, 1525, 657, + 730, 1532, 809, 158, 811, 1211, 808, 576, 1366, 1367, + 1525, 1149, 1366, 59, 367, 367, 447, 1629, 843, 866, + 6, 201, 1412, 1418, 1419, 1532, 1421, 657, 657, 657, + 1226, 657, 657, 657, 1211, 1260, 657, 657, 657, 657, + 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, + 1210, 1210, 1210, 657, 1209, 657, 657, 657, 565, 657, + 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, + 657, 657, 1211, 657, 657, 657, 657, 1258, 1259, 1521, + 1532, 657, 657, 657, 657, 657, 657, 657, 657, 657, + 1211, 1209, 657, 657, 657, 657, 657, 657, 657, 657, + 657, 657, 657, 657, 657, 657, 657, 657, 657, 657, + 1209, 565, 657, 657, 657, 565, 657, 657, 657, 565, + 1512, 657, 1210, 1209, 1209, 657, 657, 657, 657, 657, + 657, 1226, 1226, 1226, 1211, 1647, 1648, 1532, 1244, 1532, + 17, 18, 386, 389, 640, 1215, 1216, 168, 205, 257, + 269, 358, 645, 646, 647, 1219, 35, 148, 254, 277, + 344, 441, 497, 498, 513, 648, 649, 650, 651, 652, + 653, 654, 655, 1217, 1226, 73, 388, 659, 1530, 657, + 665, 179, 1532, 722, 1532, 179, 1532, 866, 722, 721, + 1534, 876, 1437, 722, 721, 1365, 1372, 609, 679, 37, + 140, 166, 169, 206, 226, 289, 313, 418, 427, 442, + 460, 504, 507, 537, 1455, 1460, 1461, 1528, 1573, 90, + 664, 766, 767, 768, 769, 1532, 418, 1598, 474, 474, + 557, 562, 606, 622, 1210, 384, 1602, 556, 377, 1604, + 69, 504, 1601, 116, 622, 1603, 576, 377, 659, 20, + 645, 1310, 1311, 1580, 1532, 162, 1211, 237, 1101, 512, + 91, 427, 1482, 52, 89, 295, 1493, 1525, 1574, 1575, + 816, 1532, 201, 361, 791, 1533, 1533, 1532, 784, 162, + 777, 663, 672, 827, 666, 1157, 658, 1211, 279, 282, + 429, 895, 897, 664, 676, 1529, 289, 1161, 1535, 1537, + 1162, 1163, 1525, 622, 1126, 1573, 602, 827, 251, 1368, + 1382, 1383, 1525, 1472, 52, 1471, 659, 1530, 58, 68, + 82, 94, 95, 96, 113, 333, 351, 482, 544, 561, + 760, 762, 384, 1598, 377, 201, 377, 480, 1630, 1629, + 597, 1635, 1636, 1356, 50, 278, 1329, 1330, 1331, 201, + 1195, 198, 287, 1201, 652, 1202, 1203, 1205, 1200, 132, + 1544, 1560, 1562, 494, 471, 665, 37, 132, 495, 645, + 1009, 1010, 1393, 1534, 198, 1393, 1568, 1534, 1547, 664, + 1534, 37, 132, 1012, 1013, 1534, 665, 1548, 1546, 1393, + 505, 173, 277, 629, 1443, 657, 115, 174, 204, 419, + 559, 581, 622, 1443, 13, 955, 1534, 1329, 201, 254, + 1438, 1440, 72, 537, 198, 537, 556, 512, 72, 537, + 13, 45, 98, 103, 256, 331, 395, 514, 553, 1426, + 1427, 1428, 695, 226, 537, 696, 537, 1329, 1443, 1440, + 289, 165, 75, 421, 556, 580, 198, 1204, 537, 617, + 1117, 1118, 1117, 379, 636, 92, 659, 1117, 1117, 1367, + 1101, 827, 151, 659, 378, 1691, 552, 1692, 261, 463, + 1690, 658, 1636, 1638, 1639, 1640, 1641, 1191, 164, 670, + 1217, 1532, 721, 721, 11, 204, 419, 581, 709, 1205, + 1655, 1661, 1669, 1674, 1675, 1676, 1682, 204, 709, 1654, + 1661, 1669, 1676, 1682, 1656, 945, 945, 945, 945, 945, + 1447, 1452, 1511, 1532, 132, 942, 943, 952, 953, 1017, + 118, 1210, 664, 723, 6, 845, 723, 383, 117, 862, + 862, 862, 4, 1525, 1106, 485, 622, 722, 1661, 1136, + 1137, 1367, 819, 820, 254, 659, 401, 1177, 1179, 1180, + 731, 732, 1211, 1211, 742, 162, 802, 685, 183, 428, + 659, 1125, 1366, 61, 183, 187, 198, 330, 428, 1152, + 1153, 1154, 59, 447, 845, 862, 1369, 1370, 1525, 1526, + 1532, 659, 1415, 665, 1420, 1211, 1211, 13, 147, 1251, + 1312, 1251, 1251, 1251, 628, 1262, 1211, 1211, 1257, 1257, + 1211, 1211, 1211, 1211, 1224, 1225, 1211, 1211, 1211, 1211, + 147, 1251, 1312, 658, 129, 193, 222, 292, 371, 588, + 658, 1338, 1341, 1342, 658, 1211, 1211, 1211, 1211, 1521, + 1647, 123, 124, 125, 126, 127, 227, 228, 229, 230, + 334, 336, 337, 338, 345, 426, 483, 484, 626, 641, + 642, 1307, 1308, 1211, 1257, 119, 122, 569, 572, 1309, + 147, 1246, 1211, 1211, 1211, 1211, 1307, 1257, 1211, 1257, + 1259, 10, 659, 665, 147, 1251, 1211, 1211, 147, 1251, + 1211, 1211, 1257, 1257, 1257, 1211, 1211, 1211, 1257, 1214, + 1211, 1211, 1211, 1211, 1211, 1211, 658, 1211, 1251, 1251, + 1211, 1211, 147, 1251, 1211, 1308, 1308, 1211, 48, 270, + 577, 1211, 1211, 658, 1522, 1523, 1532, 1251, 1251, 1211, + 1211, 1211, 658, 659, 658, 486, 657, 1644, 1645, 1211, + 664, 1245, 1534, 665, 1211, 1211, 1211, 1213, 186, 370, + 583, 599, 1217, 13, 19, 1213, 1220, 1214, 1214, 657, + 1226, 1214, 1214, 1214, 1214, 277, 1214, 1214, 250, 1214, + 250, 1214, 1214, 1214, 1214, 1214, 35, 254, 277, 441, + 1534, 1226, 1211, 1232, 1532, 665, 377, 876, 1593, 1595, + 368, 624, 877, 878, 166, 1537, 1609, 1366, 1363, 664, + 680, 681, 289, 289, 289, 289, 52, 289, 695, 289, + 659, 1204, 1456, 122, 569, 572, 761, 771, 1243, 1515, + 1521, 1534, 659, 645, 556, 657, 1615, 1537, 1615, 1615, + 1615, 1535, 1536, 1537, 1610, 1614, 204, 419, 559, 1596, + 174, 178, 190, 420, 448, 456, 500, 551, 1600, 1532, + 191, 361, 1532, 1581, 1582, 235, 568, 1382, 1529, 231, + 606, 1211, 1483, 1172, 284, 1492, 1311, 659, 819, 201, + 1532, 1211, 294, 663, 34, 294, 454, 630, 1366, 1206, + 75, 657, 902, 903, 902, 903, 402, 905, 219, 264, + 1534, 33, 576, 1478, 659, 576, 659, 576, 1127, 1366, + 825, 1383, 1379, 401, 1276, 1277, 576, 1474, 695, 1470, + 659, 645, 198, 659, 1537, 1536, 1611, 204, 419, 1596, + 1532, 13, 147, 1643, 154, 391, 1349, 1350, 1357, 1326, + 1201, 292, 371, 475, 588, 1332, 1333, 1513, 1532, 153, + 486, 657, 661, 1197, 1263, 1264, 1265, 1266, 1267, 1278, + 1279, 1291, 629, 1313, 603, 254, 659, 1211, 1519, 1532, + 659, 1543, 1393, 1595, 1532, 73, 1015, 1211, 1537, 376, + 404, 565, 1569, 258, 432, 1563, 1564, 1565, 1566, 212, + 284, 491, 1559, 1393, 1532, 578, 1549, 1560, 659, 1551, + 13, 37, 132, 377, 1211, 1570, 537, 254, 1441, 1204, + 1204, 652, 945, 722, 722, 722, 1525, 722, 1525, 289, + 349, 537, 1435, 1435, 1443, 1532, 722, 1443, 1536, 1438, + 1443, 1529, 722, 1443, 255, 554, 188, 198, 1429, 659, + 173, 537, 1438, 1525, 1440, 1438, 1438, 1211, 1443, 1443, + 1443, 1112, 446, 527, 1119, 1120, 1111, 509, 1116, 1264, + 823, 1511, 406, 1693, 1325, 1331, 1642, 179, 702, 1593, + 1610, 204, 1675, 945, 945, 1205, 174, 945, 1661, 1534, + 1532, 1532, 1532, 1525, 943, 73, 1008, 143, 1534, 83, + 97, 266, 342, 367, 430, 526, 725, 727, 437, 592, + 863, 864, 243, 859, 860, 861, 868, 876, 878, 657, + 1529, 27, 321, 853, 854, 855, 868, 869, 870, 876, + 878, 846, 847, 853, 1067, 133, 253, 945, 1073, 659, + 405, 1138, 743, 132, 1170, 1532, 1168, 1525, 891, 1179, + 241, 264, 1040, 1181, 658, 659, 810, 56, 628, 803, + 805, 150, 236, 238, 296, 298, 299, 300, 301, 302, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 314, + 315, 316, 444, 445, 686, 687, 694, 1367, 198, 1155, + 604, 1153, 83, 362, 438, 593, 856, 857, 858, 868, + 872, 873, 874, 875, 876, 878, 608, 841, 659, 1416, + 1276, 665, 1420, 1419, 201, 652, 1532, 659, 658, 1251, + 658, 1252, 658, 658, 658, 1211, 158, 628, 1261, 20, + 658, 609, 658, 658, 658, 659, 658, 659, 658, 659, + 659, 659, 659, 609, 659, 1240, 658, 652, 658, 659, + 659, 658, 658, 658, 658, 201, 659, 658, 659, 1242, + 658, 659, 659, 659, 651, 658, 659, 658, 658, 657, + 1521, 1532, 1251, 658, 658, 658, 1251, 658, 659, 658, + 658, 658, 658, 658, 658, 659, 658, 254, 658, 659, + 659, 658, 659, 659, 658, 658, 658, 659, 201, 659, + 1251, 658, 658, 659, 659, 659, 658, 201, 1211, 201, + 1211, 201, 1211, 201, 658, 659, 658, 658, 658, 658, + 659, 20, 275, 659, 1031, 658, 1257, 1282, 1283, 1284, + 657, 1187, 1188, 597, 1649, 662, 1559, 495, 1532, 186, + 370, 583, 599, 657, 18, 1211, 1647, 172, 1317, 1214, + 1211, 1211, 1214, 657, 1226, 1214, 1205, 1236, 1237, 1238, + 657, 665, 1532, 1525, 877, 659, 1393, 1394, 659, 54, + 462, 1107, 1366, 1534, 659, 137, 1463, 695, 1461, 1366, + 1462, 769, 772, 773, 768, 372, 478, 770, 1532, 1616, + 1617, 576, 233, 631, 659, 1592, 652, 1525, 1532, 1608, + 1608, 1608, 191, 205, 267, 269, 361, 416, 645, 646, + 647, 1583, 1585, 1313, 795, 1376, 1537, 1173, 1174, 1175, + 1176, 1525, 242, 295, 432, 636, 1576, 1575, 251, 814, + 829, 831, 830, 657, 1205, 1338, 548, 906, 896, 12, + 898, 1211, 1529, 1537, 1537, 1163, 1525, 1366, 183, 428, + 607, 1130, 1131, 1132, 1211, 486, 494, 613, 614, 657, + 937, 1384, 1387, 657, 129, 193, 222, 292, 371, 588, + 1337, 13, 1473, 762, 761, 1595, 213, 201, 659, 1608, + 1608, 1608, 1637, 565, 1531, 1531, 664, 1351, 1352, 1353, + 1534, 1211, 1327, 1520, 177, 475, 375, 659, 1290, 1532, + 105, 244, 261, 273, 355, 470, 542, 1274, 1275, 659, + 1525, 1290, 1314, 215, 1318, 496, 1203, 1206, 1206, 665, + 1560, 198, 1570, 198, 132, 1014, 1016, 1534, 1393, 657, + 657, 275, 379, 636, 659, 659, 665, 665, 665, 1562, + 1211, 1563, 1550, 1552, 1553, 1529, 201, 1442, 1529, 1211, + 658, 1532, 721, 1443, 427, 1329, 1428, 1441, 1443, 1438, + 1525, 1443, 1443, 659, 602, 1121, 494, 742, 659, 198, + 1694, 1329, 941, 942, 631, 1591, 945, 722, 1532, 722, + 945, 945, 706, 586, 609, 1053, 377, 377, 698, 1394, + 1394, 353, 1529, 526, 526, 526, 526, 526, 485, 1529, + 1529, 1394, 659, 861, 115, 225, 393, 404, 411, 510, + 606, 707, 708, 1394, 1394, 659, 855, 848, 849, 868, + 869, 870, 6, 12, 14, 16, 28, 30, 60, 65, + 66, 71, 83, 91, 101, 118, 135, 144, 145, 152, + 160, 166, 176, 196, 239, 241, 248, 263, 287, 320, + 339, 343, 382, 387, 394, 396, 401, 404, 435, 449, + 450, 451, 452, 476, 534, 535, 536, 541, 557, 560, + 579, 584, 597, 889, 948, 950, 952, 953, 1079, 1083, + 1085, 1088, 1094, 1095, 1096, 1098, 1099, 1321, 1528, 1525, + 377, 717, 1075, 1137, 198, 131, 741, 744, 1178, 657, + 1211, 568, 806, 805, 645, 645, 645, 645, 645, 645, + 645, 645, 645, 645, 645, 645, 645, 645, 645, 645, + 645, 645, 645, 645, 645, 645, 645, 659, 604, 1394, + 1394, 1394, 1394, 659, 858, 288, 184, 850, 851, 852, + 868, 869, 870, 871, 874, 875, 876, 878, 1370, 1532, + 609, 1413, 1532, 1264, 665, 1420, 250, 1211, 658, 1211, + 568, 1211, 1211, 162, 37, 63, 119, 122, 130, 149, + 252, 357, 502, 572, 601, 1253, 1009, 1225, 1211, 1224, + 1257, 1211, 1211, 1009, 1253, 1257, 658, 250, 250, 1211, + 1211, 1211, 1257, 1211, 1211, 1211, 1211, 1211, 1214, 658, + 658, 1211, 1211, 1211, 1211, 1211, 1211, 1257, 250, 1211, + 1211, 1211, 658, 1211, 1211, 1211, 1211, 201, 1211, 201, + 1211, 201, 1211, 1211, 1211, 37, 63, 1026, 1027, 1028, + 1029, 1030, 1338, 1337, 658, 658, 1194, 1195, 1196, 1650, + 1651, 1652, 1187, 658, 486, 1643, 1534, 1211, 1647, 1213, + 658, 659, 658, 1226, 1307, 1307, 18, 1211, 1647, 1317, + 1211, 658, 659, 1256, 1257, 1532, 1364, 1595, 954, 1534, + 1537, 1107, 681, 645, 198, 631, 1457, 1458, 645, 659, + 658, 659, 1610, 50, 621, 631, 1612, 7, 1614, 665, + 665, 576, 576, 576, 1584, 1329, 742, 1384, 659, 1177, + 1179, 1531, 636, 284, 89, 789, 819, 821, 824, 822, + 899, 900, 901, 1532, 911, 1214, 50, 657, 913, 903, + 645, 657, 576, 201, 1133, 1131, 162, 938, 1385, 657, + 1390, 1395, 1390, 658, 937, 1386, 1518, 1519, 1522, 1532, + 1388, 1306, 1532, 645, 384, 1609, 1536, 201, 201, 201, + 1184, 1358, 1534, 659, 659, 21, 138, 1328, 1333, 1334, + 177, 1333, 1333, 1280, 1285, 1290, 1263, 261, 261, 390, + 1292, 273, 470, 1274, 1292, 1263, 1265, 1276, 1287, 1288, + 1211, 50, 220, 1315, 341, 20, 1207, 1529, 1532, 652, + 1532, 671, 1537, 565, 565, 432, 453, 489, 1567, 1565, + 1564, 1393, 1551, 659, 1555, 1557, 1561, 129, 193, 292, + 371, 588, 1339, 1433, 170, 625, 371, 1442, 1313, 1438, + 1120, 297, 694, 1122, 1405, 1406, 1522, 162, 1337, 335, + 7, 1532, 657, 466, 1683, 1670, 722, 197, 49, 219, + 479, 1059, 1059, 377, 1525, 1525, 277, 657, 880, 883, + 947, 949, 950, 1016, 1010, 118, 118, 133, 253, 222, + 292, 371, 588, 879, 1340, 1341, 1528, 861, 1529, 1529, + 1529, 1529, 1337, 1529, 1529, 658, 659, 879, 879, 855, + 659, 849, 81, 93, 401, 963, 973, 974, 1040, 1044, + 1045, 1100, 1394, 1100, 401, 1394, 1394, 1100, 1394, 401, + 401, 1394, 1394, 576, 143, 1394, 262, 557, 197, 401, + 417, 1040, 1100, 262, 1394, 401, 557, 143, 1394, 1394, + 1394, 1394, 1394, 1100, 401, 50, 1394, 1394, 891, 1394, + 401, 403, 20, 576, 645, 1109, 401, 401, 1394, 1394, + 1394, 1394, 146, 331, 1532, 1394, 1394, 401, 1394, 948, + 659, 888, 889, 1083, 657, 665, 962, 975, 1524, 1532, + 1393, 1662, 87, 481, 450, 1076, 13, 75, 1139, 99, + 180, 749, 775, 1532, 162, 777, 663, 657, 417, 1303, + 1304, 1305, 1532, 742, 1211, 657, 657, 657, 1337, 1529, + 1529, 1339, 1529, 1337, 1529, 1529, 1529, 1529, 1529, 1529, + 1529, 1337, 1337, 1529, 111, 367, 506, 1516, 1529, 1337, + 687, 1529, 1338, 879, 879, 858, 215, 1394, 659, 852, + 665, 1264, 1313, 1420, 1313, 1211, 658, 1211, 568, 657, + 1000, 1001, 1001, 1001, 657, 995, 996, 1000, 1255, 1001, + 252, 1001, 252, 658, 658, 658, 20, 1221, 658, 20, + 658, 658, 658, 1241, 1211, 1211, 658, 658, 659, 658, + 387, 1248, 659, 659, 658, 659, 658, 254, 1233, 1234, + 658, 658, 658, 658, 659, 658, 658, 1211, 658, 198, + 658, 658, 659, 658, 659, 659, 658, 1211, 658, 1211, + 658, 1211, 658, 658, 658, 657, 1021, 1021, 21, 138, + 468, 650, 1023, 1024, 1025, 659, 659, 1313, 1202, 1652, + 658, 1639, 1283, 1646, 665, 1063, 658, 1257, 1213, 658, + 659, 658, 1206, 1238, 658, 657, 1459, 432, 58, 68, + 82, 94, 95, 96, 113, 333, 351, 464, 482, 544, + 561, 774, 773, 1617, 631, 1620, 404, 565, 1534, 384, + 652, 652, 1610, 1610, 1610, 657, 796, 377, 1400, 1175, + 1525, 1179, 237, 1182, 1488, 792, 1532, 812, 1533, 812, + 826, 826, 826, 658, 659, 1206, 897, 401, 914, 915, + 1338, 899, 1537, 350, 454, 1198, 1391, 1392, 1522, 1396, + 659, 657, 1387, 658, 658, 659, 665, 1635, 658, 659, + 761, 201, 1611, 1611, 1611, 1008, 1011, 1352, 1520, 1334, + 597, 658, 1639, 1286, 662, 261, 1292, 1292, 1278, 261, + 377, 609, 1311, 1198, 1319, 1520, 1316, 1324, 1529, 1532, + 665, 658, 658, 84, 589, 432, 1570, 1554, 1556, 1329, + 1434, 1443, 645, 659, 659, 1404, 1393, 630, 1536, 1677, + 130, 252, 434, 543, 958, 657, 722, 710, 118, 1525, + 700, 701, 1525, 277, 937, 959, 960, 961, 962, 963, + 887, 888, 659, 949, 708, 849, 1062, 1524, 945, 66, + 197, 417, 598, 972, 1039, 945, 1040, 1041, 1041, 235, + 944, 132, 1532, 1524, 1158, 1339, 1337, 1371, 1337, 13, + 1084, 1092, 1093, 1532, 1158, 1529, 1529, 1008, 1394, 1337, + 264, 1372, 264, 1371, 1371, 954, 1093, 1394, 191, 267, + 367, 957, 1337, 132, 1532, 1339, 1339, 1371, 1158, 1322, + 1323, 1522, 132, 1337, 132, 1337, 1343, 890, 1529, 1158, + 1525, 1158, 1158, 86, 88, 132, 156, 192, 395, 439, + 956, 132, 1337, 132, 1337, 132, 1337, 1337, 1343, 1084, + 951, 6, 152, 1096, 959, 1532, 9, 191, 1108, 440, + 971, 972, 1033, 976, 665, 132, 1340, 1529, 1532, 657, + 1663, 1217, 1626, 24, 175, 711, 576, 144, 160, 713, + 13, 657, 1140, 217, 659, 745, 90, 112, 663, 1084, + 658, 659, 807, 690, 691, 1337, 692, 693, 1337, 688, + 689, 1337, 1532, 879, 852, 1532, 1313, 1324, 1307, 1211, + 129, 292, 371, 588, 1254, 371, 657, 996, 1002, 63, + 119, 122, 130, 149, 194, 252, 354, 357, 434, 572, + 601, 988, 989, 1222, 1253, 658, 1307, 1307, 1211, 50, + 488, 1247, 1211, 1211, 1257, 46, 355, 658, 631, 1235, + 1211, 1307, 1211, 1211, 1211, 1211, 658, 658, 658, 1338, + 658, 1031, 1026, 1024, 1026, 1027, 1337, 1318, 1194, 1644, + 1532, 658, 1257, 1207, 1337, 1464, 1465, 182, 287, 213, + 565, 20, 609, 1613, 457, 1618, 1618, 1618, 132, 1211, + 1398, 1399, 158, 159, 797, 155, 1182, 271, 237, 455, + 1494, 659, 901, 658, 219, 264, 916, 658, 659, 658, + 1202, 659, 1393, 1397, 1398, 1395, 1389, 1387, 1518, 1532, + 891, 1532, 1611, 1010, 1359, 1328, 1643, 1311, 1266, 1263, + 1278, 261, 261, 1263, 1278, 1268, 1269, 1301, 1302, 1202, + 632, 633, 659, 1320, 1328, 1211, 1329, 652, 1555, 1560, + 1329, 1529, 694, 1406, 1313, 1399, 733, 734, 735, 1532, + 512, 1684, 9, 33, 836, 377, 635, 699, 657, 657, + 1525, 658, 658, 659, 884, 1494, 949, 1158, 657, 264, + 264, 1041, 945, 1062, 1532, 945, 945, 1217, 152, 494, + 1084, 1524, 1081, 659, 1338, 1010, 1529, 1371, 1092, 1524, + 1524, 631, 1529, 975, 1084, 659, 1328, 894, 1084, 1089, + 1084, 657, 658, 1532, 1525, 36, 37, 42, 44, 46, + 47, 119, 122, 130, 149, 167, 192, 194, 208, 209, + 252, 281, 290, 291, 293, 327, 328, 329, 346, 347, + 348, 354, 357, 373, 374, 409, 410, 434, 490, 494, + 508, 566, 569, 572, 573, 574, 575, 615, 616, 642, + 986, 987, 988, 989, 990, 991, 992, 993, 1532, 1532, + 1664, 20, 415, 1211, 1211, 377, 717, 722, 377, 83, + 718, 1141, 240, 198, 1532, 986, 1006, 198, 198, 658, + 1304, 568, 658, 659, 658, 659, 658, 659, 278, 1335, + 658, 658, 658, 658, 658, 22, 37, 51, 595, 1008, + 1018, 1019, 659, 371, 1001, 995, 63, 1001, 252, 1223, + 658, 658, 658, 658, 1249, 1511, 658, 658, 659, 658, + 341, 266, 427, 658, 658, 658, 658, 658, 658, 1022, + 658, 659, 1315, 658, 658, 659, 18, 1466, 384, 1529, + 67, 259, 363, 529, 546, 637, 1606, 1607, 631, 1619, + 1619, 1619, 658, 659, 742, 793, 1401, 251, 1532, 657, + 904, 898, 917, 1532, 915, 939, 1392, 1399, 658, 1638, + 75, 1495, 1281, 377, 1271, 1278, 1278, 377, 1273, 1211, + 657, 1299, 1300, 1289, 1520, 419, 1344, 1324, 658, 659, + 736, 1529, 245, 254, 392, 737, 738, 739, 740, 136, + 247, 603, 837, 481, 1534, 657, 1060, 1061, 1532, 1060, + 658, 882, 881, 961, 20, 940, 1086, 1211, 945, 1062, + 1532, 609, 1052, 586, 1062, 1062, 179, 132, 132, 975, + 1152, 1093, 1015, 1524, 1107, 559, 1108, 1080, 1323, 1090, + 1092, 1082, 1462, 657, 1034, 1000, 1000, 1001, 1001, 995, + 413, 657, 995, 995, 1019, 63, 615, 988, 990, 1019, + 1019, 63, 616, 616, 619, 995, 657, 1001, 1001, 1001, + 1019, 1000, 1001, 977, 995, 619, 1000, 1019, 37, 1000, + 1020, 1000, 1000, 1001, 1002, 665, 658, 659, 1665, 1666, + 1307, 504, 1529, 151, 1077, 1144, 1532, 13, 657, 1142, + 746, 1015, 132, 776, 752, 753, 1337, 747, 748, 742, + 691, 693, 689, 475, 1333, 1414, 1018, 1009, 1020, 371, + 1019, 1250, 1520, 1211, 341, 181, 658, 1337, 1324, 1465, + 144, 565, 565, 565, 18, 1605, 213, 318, 319, 323, + 324, 325, 1621, 1622, 1399, 264, 559, 1205, 907, 657, + 613, 918, 1194, 161, 171, 385, 564, 1496, 1497, 280, + 1498, 1644, 1270, 609, 1272, 609, 1306, 196, 237, 608, + 1294, 1295, 1298, 1194, 1328, 1532, 1354, 1355, 1335, 1678, + 735, 1006, 658, 659, 735, 377, 711, 383, 1060, 658, + 659, 1328, 657, 658, 1638, 947, 657, 937, 402, 657, + 1087, 658, 1062, 1052, 586, 1059, 964, 1059, 966, 967, + 122, 569, 572, 650, 651, 1514, 1515, 1108, 1525, 1158, + 1091, 1130, 658, 1035, 1532, 317, 1036, 502, 601, 643, + 997, 998, 999, 1064, 1511, 997, 997, 1019, 619, 997, + 1064, 1019, 997, 28, 73, 83, 132, 207, 370, 377, + 417, 490, 598, 978, 979, 1003, 1004, 1005, 1032, 1217, + 1528, 528, 994, 1019, 1020, 1019, 1020, 997, 997, 1532, + 1532, 486, 657, 1667, 712, 719, 720, 658, 659, 1143, + 517, 519, 750, 751, 752, 755, 1217, 1532, 1211, 1183, + 177, 475, 465, 1417, 658, 659, 1328, 658, 658, 1329, + 64, 1606, 384, 1337, 1337, 1337, 1516, 371, 650, 1336, + 1622, 603, 1525, 911, 547, 912, 909, 910, 1532, 254, + 274, 83, 91, 118, 241, 320, 339, 362, 557, 934, + 935, 936, 1437, 50, 50, 161, 50, 1497, 530, 564, + 1499, 1500, 1211, 657, 1211, 657, 658, 1040, 1040, 1295, + 1345, 1201, 466, 1685, 739, 1205, 716, 717, 657, 658, + 83, 263, 631, 1047, 1051, 1055, 1058, 1528, 1061, 371, + 1048, 1050, 1055, 1057, 887, 937, 885, 1338, 914, 970, + 968, 1059, 657, 965, 657, 657, 1516, 1516, 891, 251, + 658, 659, 202, 400, 503, 377, 1037, 999, 658, 659, + 658, 1014, 1529, 366, 1007, 1514, 15, 603, 132, 264, + 20, 1005, 264, 370, 1393, 645, 1189, 1185, 631, 1668, + 531, 714, 777, 1532, 417, 1145, 1146, 1532, 659, 777, + 200, 177, 1202, 1520, 1344, 292, 371, 1407, 1408, 1522, + 1276, 1206, 1338, 658, 659, 920, 567, 1394, 1394, 143, + 143, 1394, 1394, 1394, 1394, 657, 929, 936, 166, 1511, + 1511, 50, 1511, 50, 50, 1500, 1306, 1306, 198, 1293, + 1293, 657, 1679, 724, 1671, 713, 707, 586, 609, 1046, + 1049, 1054, 1055, 1056, 1529, 1394, 398, 1097, 1098, 1099, + 1058, 1393, 1328, 658, 1097, 1057, 884, 658, 1635, 658, + 657, 657, 969, 1060, 657, 1060, 1060, 657, 1532, 136, + 603, 1019, 1511, 1019, 657, 1208, 366, 614, 657, 132, + 1340, 1529, 1532, 371, 658, 55, 66, 284, 1211, 163, + 715, 658, 659, 751, 1328, 1201, 659, 1393, 1489, 658, + 908, 910, 657, 922, 924, 919, 1529, 1529, 1394, 1394, + 1340, 1340, 1338, 1534, 548, 930, 931, 1394, 1511, 1511, + 1511, 658, 658, 215, 261, 387, 1297, 1296, 1205, 1346, + 1347, 1348, 1006, 725, 726, 1626, 1686, 1525, 718, 658, + 1059, 1059, 1097, 1056, 1337, 1528, 1099, 1098, 132, 1340, + 1529, 1532, 886, 1060, 1060, 657, 658, 1060, 658, 658, + 914, 54, 367, 462, 494, 1038, 1038, 658, 1338, 1208, + 985, 1638, 66, 384, 66, 1211, 1146, 1408, 1399, 1011, + 912, 657, 923, 924, 925, 326, 921, 924, 1529, 1529, + 932, 658, 659, 954, 50, 50, 657, 657, 1211, 658, + 659, 1680, 141, 777, 198, 151, 1638, 658, 658, 1060, + 1046, 658, 1047, 1048, 658, 5, 132, 370, 377, 377, + 658, 658, 384, 384, 1490, 658, 659, 326, 927, 928, + 1214, 933, 1534, 931, 1303, 1305, 1206, 1348, 724, 1205, + 719, 1033, 1046, 658, 1046, 603, 136, 405, 623, 980, + 475, 1501, 924, 659, 926, 934, 658, 658, 1681, 1672, + 1046, 1038, 1038, 83, 598, 981, 982, 983, 233, 1495, + 928, 658, 777, 157, 1529, 264, 983, 50, 1498, 477, + 1511, 237, 1502, 1673, 371, 657, 1504, 777, 280, 475, + 1503, 658, 664, 1505, 1506, 1522, 494, 1507, 1534, 658, + 659, 1508, 1509, 1522, 1506, 659, 1393, 1509, 1205, 1399, + 1206 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint16 yyr1[] = { - 0, 666, 667, 668, 667, 667, 669, 669, 670, 670, - 670, 671, 671, 671, 671, 671, 671, 671, 671, 671, - 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, - 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, - 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, - 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, - 671, 671, 671, 671, 671, 671, 671, 672, 673, 673, - 674, 675, 675, 677, 676, 678, 678, 679, 679, 680, - 682, 681, 684, 683, 685, 685, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 687, 687, 687, 688, 689, - 689, 689, 690, 691, 691, 691, 692, 693, 693, 693, - 693, 693, 693, 693, 694, 694, 695, 697, 696, 698, - 696, 699, 696, 700, 696, 701, 696, 702, 696, 696, - 696, 696, 696, 703, 696, 705, 704, 706, 706, 707, - 707, 707, 707, 707, 707, 707, 709, 708, 711, 710, - 710, 712, 712, 712, 712, 713, 713, 714, 714, 715, - 715, 716, 717, 717, 719, 718, 720, 721, 721, 722, - 722, 723, 723, 724, 724, 724, 724, 724, 724, 724, - 725, 725, 726, 726, 728, 727, 729, 729, 730, 730, - 731, 731, 732, 732, 733, 733, 735, 734, 736, 736, - 737, 737, 738, 739, 739, 739, 739, 740, 740, 741, - 741, 742, 742, 744, 743, 743, 745, 743, 743, 747, - 746, 748, 748, 749, 749, 750, 751, 751, 752, 753, - 753, 754, 754, 754, 754, 754, 755, 756, 756, 757, - 757, 758, 758, 759, 759, 760, 760, 760, 761, 761, - 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, - 762, 763, 764, 764, 765, 765, 766, 766, 767, 768, - 768, 769, 769, 770, 771, 771, 772, 773, 773, 773, - 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, - 774, 774, 775, 775, 776, 776, 776, 776, 776, 776, - 776, 776, 776, 776, 776, 777, 777, 777, 777, 779, - 778, 781, 780, 783, 782, 784, 785, 786, 788, 787, - 789, 790, 790, 790, 791, 791, 793, 794, 795, 792, - 796, 796, 796, 798, 797, 800, 801, 799, 799, 802, - 802, 803, 803, 805, 806, 804, 808, 809, 807, 810, - 810, 811, 811, 813, 812, 815, 814, 817, 816, 819, - 818, 820, 822, 821, 824, 823, 825, 826, 828, 827, - 829, 827, 830, 827, 832, 831, 833, 831, 834, 831, - 835, 835, 836, 836, 836, 837, 838, 839, 840, 840, - 841, 841, 842, 843, 844, 844, 846, 845, 847, 847, - 847, 848, 848, 848, 849, 850, 850, 850, 851, 851, - 851, 851, 851, 851, 851, 851, 852, 853, 853, 853, - 854, 854, 854, 854, 854, 855, 856, 856, 856, 857, - 857, 857, 857, 857, 857, 857, 858, 859, 859, 859, - 860, 860, 860, 861, 862, 863, 864, 865, 866, 866, - 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, - 876, 876, 877, 877, 878, 878, 880, 879, 879, 881, - 879, 879, 882, 882, 883, 884, 883, 885, 883, 886, - 887, 887, 889, 888, 890, 892, 891, 893, 894, 895, - 894, 894, 894, 894, 894, 896, 896, 897, 897, 898, - 898, 899, 899, 900, 901, 902, 903, 904, 904, 905, - 906, 905, 907, 905, 908, 908, 909, 910, 911, 911, - 912, 912, 913, 913, 915, 914, 916, 917, 918, 917, - 919, 917, 920, 920, 921, 921, 922, 922, 924, 925, - 923, 926, 926, 927, 927, 928, 928, 929, 929, 931, - 930, 932, 933, 933, 934, 934, 935, 935, 935, 935, - 935, 935, 935, 935, 935, 937, 938, 936, 939, 939, - 940, 940, 941, 941, 942, 942, 943, 943, 944, 944, - 945, 945, 946, 946, 947, 947, 948, 948, 948, 949, - 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, - 949, 949, 949, 949, 949, 949, 949, 949, 949, 950, - 949, 949, 949, 949, 949, 949, 949, 949, 949, 949, - 949, 949, 949, 949, 949, 949, 951, 952, 953, 954, - 955, 955, 955, 955, 955, 955, 955, 956, 956, 956, - 957, 957, 957, 957, 958, 959, 959, 960, 960, 961, - 961, 963, 962, 964, 962, 965, 962, 966, 962, 967, - 962, 968, 962, 969, 962, 962, 970, 970, 971, 972, - 972, 973, 975, 976, 974, 977, 977, 978, 978, 979, - 979, 979, 980, 980, 981, 981, 982, 982, 982, 983, - 984, 985, 985, 985, 985, 985, 985, 985, 985, 985, - 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, - 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, - 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, - 986, 986, 986, 986, 986, 986, 986, 986, 987, 988, - 988, 989, 989, 990, 990, 990, 990, 990, 991, 991, - 991, 991, 991, 992, 992, 992, 993, 993, 994, 994, - 994, 995, 996, 996, 997, 997, 998, 998, 998, 999, - 999, 999, 999, 1000, 1000, 1001, 1001, 1002, 1002, 1003, - 1003, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, 1004, - 1004, 1004, 1004, 1004, 1004, 1004, 1005, 1006, 1006, 1007, - 1007, 1008, 1008, 1009, 1009, 1010, 1010, 1011, 1011, 1012, - 1012, 1013, 1014, 1014, 1015, 1015, 1016, 1016, 1017, 1017, - 1017, 1018, 1018, 1018, 1018, 1018, 1019, 1019, 1021, 1020, - 1022, 1022, 1023, 1024, 1024, 1024, 1024, 1025, 1026, 1027, - 1027, 1028, 1029, 1029, 1030, 1030, 1031, 1031, 1032, 1033, - 1033, 1034, 1034, 1035, 1035, 1035, 1035, 1036, 1036, 1036, - 1036, 1036, 1037, 1037, 1037, 1037, 1037, 1038, 1038, 1039, - 1039, 1040, 1040, 1041, 1041, 1041, 1042, 1042, 1043, 1044, - 1045, 1045, 1046, 1046, 1047, 1047, 1048, 1048, 1049, 1049, - 1050, 1050, 1051, 1051, 1052, 1052, 1052, 1053, 1053, 1054, - 1054, 1054, 1054, 1054, 1054, 1055, 1055, 1056, 1057, 1057, - 1058, 1058, 1058, 1059, 1059, 1060, 1060, 1061, 1061, 1062, - 1062, 1063, 1063, 1065, 1066, 1064, 1067, 1064, 1064, 1068, - 1064, 1069, 1064, 1070, 1064, 1071, 1064, 1072, 1064, 1064, - 1064, 1064, 1064, 1073, 1064, 1074, 1074, 1074, 1074, 1075, - 1075, 1076, 1076, 1077, 1077, 1078, 1078, 1078, 1078, 1078, - 1078, 1078, 1078, 1078, 1078, 1079, 1078, 1078, 1080, 1078, - 1081, 1078, 1078, 1078, 1078, 1078, 1082, 1083, 1083, 1085, - 1084, 1086, 1086, 1086, 1088, 1087, 1089, 1090, 1089, 1091, - 1091, 1092, 1093, 1093, 1094, 1095, 1095, 1095, 1095, 1095, - 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, 1095, - 1095, 1095, 1095, 1095, 1095, 1096, 1096, 1096, 1096, 1096, - 1097, 1097, 1098, 1098, 1099, 1099, 1100, 1100, 1102, 1101, - 1103, 1103, 1104, 1104, 1105, 1105, 1106, 1106, 1106, 1107, - 1107, 1107, 1108, 1108, 1108, 1108, 1110, 1109, 1111, 1109, - 1109, 1109, 1112, 1113, 1113, 1114, 1114, 1115, 1115, 1115, - 1117, 1116, 1118, 1118, 1119, 1119, 1119, 1120, 1120, 1120, - 1121, 1121, 1123, 1122, 1124, 1124, 1124, 1125, 1126, 1125, - 1128, 1127, 1129, 1129, 1130, 1130, 1131, 1131, 1131, 1132, - 1132, 1134, 1133, 1135, 1135, 1136, 1137, 1137, 1138, 1138, - 1139, 1140, 1139, 1141, 1142, 1141, 1143, 1143, 1143, 1144, - 1144, 1144, 1145, 1145, 1146, 1147, 1148, 1147, 1150, 1149, - 1151, 1151, 1152, 1152, 1153, 1153, 1153, 1153, 1153, 1153, - 1154, 1154, 1156, 1155, 1157, 1157, 1157, 1159, 1158, 1158, - 1160, 1160, 1161, 1161, 1162, 1164, 1163, 1165, 1165, 1166, - 1166, 1167, 1168, 1169, 1169, 1171, 1170, 1172, 1172, 1173, - 1173, 1174, 1175, 1177, 1176, 1179, 1178, 1180, 1180, 1181, - 1181, 1182, 1183, 1183, 1185, 1184, 1184, 1187, 1186, 1186, - 1189, 1188, 1190, 1190, 1190, 1192, 1191, 1193, 1194, 1195, - 1195, 1196, 1196, 1197, 1197, 1198, 1198, 1199, 1199, 1199, - 1200, 1200, 1200, 1201, 1201, 1201, 1202, 1202, 1203, 1204, - 1205, 1206, 1206, 1206, 1206, 1206, 1207, 1207, 1207, 1208, - 1208, 1208, 1209, 1209, 1210, 1210, 1210, 1210, 1210, 1210, - 1210, 1210, 1210, 1210, 1210, 1211, 1211, 1211, 1211, 1211, - 1211, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, - 1212, 1212, 1212, 1212, 1212, 1213, 1213, 1213, 1213, 1213, - 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, - 1214, 1214, 1215, 1215, 1216, 1216, 1217, 1217, 1218, 1218, - 1218, 1218, 1218, 1218, 1219, 1219, 1220, 1220, 1221, 1221, - 1221, 1221, 1221, 1221, 1222, 1221, 1221, 1221, 1221, 1221, - 1223, 1224, 1224, 1225, 1225, 1225, 1225, 1225, 1225, 1225, - 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, - 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, 1225, - 1225, 1225, 1225, 1226, 1226, 1226, 1226, 1226, 1226, 1226, + 0, 667, 668, 669, 668, 668, 670, 670, 671, 671, + 671, 672, 672, 672, 672, 672, 672, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, 672, 672, 672, + 672, 672, 672, 672, 672, 672, 672, 673, 674, 674, + 675, 676, 676, 678, 677, 679, 679, 680, 680, 681, + 683, 682, 685, 684, 686, 686, 687, 687, 687, 687, + 687, 687, 687, 687, 687, 687, 687, 687, 687, 687, + 687, 687, 687, 687, 687, 688, 688, 688, 689, 690, + 690, 690, 691, 692, 692, 692, 693, 694, 694, 694, + 694, 694, 694, 694, 695, 695, 696, 698, 697, 699, + 697, 700, 697, 701, 697, 702, 697, 703, 697, 697, + 697, 697, 697, 704, 697, 706, 705, 707, 707, 708, + 708, 708, 708, 708, 708, 708, 710, 709, 712, 711, + 711, 713, 713, 713, 713, 714, 714, 715, 715, 716, + 716, 717, 718, 718, 720, 719, 721, 722, 722, 723, + 723, 724, 724, 725, 725, 725, 725, 725, 725, 725, + 726, 726, 727, 727, 729, 728, 730, 730, 731, 731, + 732, 732, 733, 733, 734, 734, 736, 735, 737, 737, + 738, 738, 739, 740, 740, 740, 740, 741, 741, 742, + 742, 743, 743, 745, 744, 744, 746, 744, 744, 748, + 747, 749, 749, 750, 750, 751, 752, 752, 753, 754, + 754, 755, 755, 755, 755, 755, 756, 757, 757, 758, + 758, 759, 759, 760, 760, 761, 761, 761, 762, 762, + 762, 762, 762, 762, 762, 762, 762, 762, 762, 762, + 763, 764, 765, 765, 766, 766, 767, 767, 768, 769, + 769, 770, 770, 771, 772, 772, 773, 774, 774, 774, + 774, 774, 774, 774, 774, 774, 774, 774, 774, 774, + 775, 775, 776, 776, 777, 777, 777, 777, 777, 777, + 777, 777, 777, 777, 777, 778, 778, 778, 778, 780, + 779, 782, 781, 784, 783, 785, 786, 787, 789, 788, + 790, 791, 791, 791, 792, 792, 794, 795, 796, 793, + 797, 797, 797, 799, 798, 801, 802, 800, 800, 803, + 803, 804, 804, 806, 807, 805, 809, 810, 808, 811, + 811, 812, 812, 814, 813, 816, 815, 818, 817, 820, + 819, 821, 823, 822, 825, 824, 826, 827, 829, 828, + 830, 828, 831, 828, 833, 832, 834, 832, 835, 832, + 836, 836, 837, 837, 837, 838, 839, 840, 841, 841, + 842, 842, 843, 844, 845, 845, 847, 846, 848, 848, + 848, 849, 849, 849, 850, 851, 851, 851, 852, 852, + 852, 852, 852, 852, 852, 852, 853, 854, 854, 854, + 855, 855, 855, 855, 855, 856, 857, 857, 857, 858, + 858, 858, 858, 858, 858, 858, 859, 860, 860, 860, + 861, 861, 861, 862, 863, 864, 865, 866, 867, 867, + 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, + 877, 877, 878, 878, 879, 879, 881, 880, 880, 882, + 880, 880, 883, 883, 884, 885, 884, 886, 884, 887, + 888, 888, 890, 889, 891, 893, 892, 894, 895, 896, + 895, 895, 895, 895, 895, 897, 897, 898, 898, 899, + 899, 900, 900, 901, 902, 903, 904, 905, 905, 906, + 907, 906, 908, 906, 909, 909, 910, 911, 912, 912, + 913, 913, 914, 914, 916, 915, 917, 918, 919, 918, + 920, 918, 921, 921, 922, 922, 923, 923, 925, 926, + 924, 927, 927, 928, 928, 929, 929, 930, 930, 932, + 931, 933, 934, 934, 935, 935, 936, 936, 936, 936, + 936, 936, 936, 936, 936, 938, 939, 937, 940, 940, + 941, 941, 942, 942, 943, 943, 944, 944, 945, 945, + 946, 946, 947, 947, 948, 948, 949, 949, 949, 950, + 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, + 950, 950, 950, 950, 950, 950, 950, 950, 950, 951, + 950, 950, 950, 950, 950, 950, 950, 950, 950, 950, + 950, 950, 950, 950, 950, 950, 952, 953, 954, 955, + 956, 956, 956, 956, 956, 956, 956, 957, 957, 957, + 958, 958, 958, 958, 959, 960, 960, 961, 961, 962, + 962, 964, 963, 965, 963, 966, 963, 967, 963, 968, + 963, 969, 963, 970, 963, 963, 971, 971, 972, 973, + 973, 974, 976, 977, 975, 978, 978, 979, 979, 980, + 980, 980, 981, 981, 982, 982, 983, 983, 983, 984, + 985, 986, 986, 986, 986, 986, 986, 986, 986, 986, + 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, + 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, + 986, 986, 986, 986, 986, 986, 986, 986, 986, 986, + 987, 987, 987, 987, 987, 987, 987, 987, 988, 989, + 989, 990, 990, 991, 991, 991, 991, 991, 992, 992, + 992, 992, 992, 993, 993, 993, 994, 994, 995, 995, + 995, 996, 997, 997, 998, 998, 999, 999, 999, 1000, + 1000, 1000, 1000, 1001, 1001, 1002, 1002, 1003, 1003, 1004, + 1004, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, 1005, + 1005, 1005, 1005, 1005, 1005, 1005, 1006, 1007, 1007, 1008, + 1008, 1009, 1009, 1010, 1010, 1011, 1011, 1012, 1012, 1013, + 1013, 1014, 1015, 1015, 1016, 1016, 1017, 1017, 1018, 1018, + 1018, 1019, 1019, 1019, 1019, 1019, 1020, 1020, 1022, 1021, + 1023, 1023, 1024, 1025, 1025, 1025, 1025, 1026, 1027, 1028, + 1028, 1029, 1030, 1030, 1031, 1031, 1032, 1032, 1033, 1034, + 1034, 1035, 1035, 1036, 1036, 1036, 1036, 1037, 1037, 1037, + 1037, 1037, 1038, 1038, 1038, 1038, 1038, 1039, 1039, 1040, + 1040, 1041, 1041, 1042, 1042, 1042, 1043, 1043, 1044, 1045, + 1046, 1046, 1047, 1047, 1048, 1048, 1049, 1049, 1050, 1050, + 1051, 1051, 1052, 1052, 1053, 1053, 1053, 1054, 1054, 1055, + 1055, 1055, 1055, 1055, 1055, 1056, 1056, 1057, 1058, 1058, + 1059, 1059, 1059, 1060, 1060, 1061, 1061, 1062, 1062, 1063, + 1063, 1064, 1064, 1066, 1067, 1065, 1068, 1065, 1065, 1069, + 1065, 1070, 1065, 1071, 1065, 1072, 1065, 1073, 1065, 1065, + 1065, 1065, 1065, 1074, 1065, 1075, 1075, 1075, 1075, 1076, + 1076, 1077, 1077, 1078, 1078, 1079, 1079, 1079, 1079, 1079, + 1079, 1079, 1079, 1079, 1079, 1080, 1079, 1079, 1081, 1079, + 1082, 1079, 1079, 1079, 1079, 1079, 1083, 1084, 1084, 1086, + 1085, 1087, 1087, 1087, 1089, 1088, 1090, 1091, 1090, 1092, + 1092, 1093, 1094, 1094, 1095, 1096, 1096, 1096, 1096, 1096, + 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, 1096, + 1096, 1096, 1096, 1096, 1096, 1097, 1097, 1097, 1097, 1097, + 1098, 1098, 1099, 1099, 1100, 1100, 1101, 1101, 1103, 1102, + 1104, 1104, 1105, 1105, 1106, 1106, 1107, 1107, 1107, 1108, + 1108, 1108, 1109, 1109, 1109, 1109, 1111, 1110, 1112, 1110, + 1110, 1110, 1113, 1114, 1114, 1115, 1115, 1116, 1116, 1116, + 1118, 1117, 1119, 1119, 1120, 1120, 1120, 1121, 1121, 1121, + 1122, 1122, 1124, 1123, 1125, 1125, 1125, 1126, 1127, 1126, + 1129, 1128, 1130, 1130, 1131, 1131, 1132, 1132, 1132, 1133, + 1133, 1135, 1134, 1136, 1136, 1137, 1138, 1138, 1139, 1139, + 1140, 1141, 1140, 1142, 1143, 1142, 1144, 1144, 1144, 1145, + 1145, 1145, 1146, 1146, 1147, 1148, 1149, 1148, 1151, 1150, + 1152, 1152, 1153, 1153, 1154, 1154, 1154, 1154, 1154, 1154, + 1155, 1155, 1157, 1156, 1158, 1158, 1158, 1160, 1159, 1159, + 1161, 1161, 1162, 1162, 1163, 1165, 1164, 1166, 1166, 1167, + 1167, 1168, 1169, 1170, 1170, 1172, 1171, 1173, 1173, 1174, + 1174, 1175, 1176, 1178, 1177, 1180, 1179, 1181, 1181, 1182, + 1182, 1183, 1184, 1184, 1186, 1185, 1185, 1188, 1187, 1187, + 1190, 1189, 1191, 1191, 1191, 1193, 1192, 1194, 1195, 1196, + 1196, 1197, 1197, 1198, 1198, 1199, 1199, 1200, 1200, 1200, + 1201, 1201, 1201, 1202, 1202, 1202, 1203, 1203, 1204, 1205, + 1206, 1207, 1207, 1207, 1207, 1207, 1208, 1208, 1208, 1209, + 1209, 1209, 1210, 1210, 1211, 1211, 1211, 1211, 1211, 1211, + 1211, 1211, 1211, 1211, 1211, 1212, 1212, 1212, 1212, 1212, + 1212, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, + 1213, 1213, 1213, 1213, 1213, 1214, 1214, 1214, 1214, 1214, + 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, 1214, + 1215, 1215, 1216, 1216, 1217, 1217, 1218, 1218, 1219, 1219, + 1219, 1219, 1219, 1219, 1220, 1220, 1221, 1221, 1222, 1222, + 1222, 1222, 1222, 1222, 1223, 1222, 1222, 1222, 1222, 1222, + 1224, 1225, 1225, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, - 1226, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, + 1226, 1226, 1226, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, - 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1228, 1228, - 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, + 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, + 1227, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, - 1228, 1228, 1228, 1228, 1229, 1229, 1229, 1229, 1229, 1229, - 1229, 1229, 1231, 1230, 1230, 1232, 1232, 1233, 1233, 1234, - 1234, 1235, 1235, 1236, 1236, 1237, 1238, 1238, 1238, 1238, - 1238, 1238, 1238, 1239, 1240, 1238, 1238, 1238, 1238, 1238, - 1238, 1238, 1238, 1238, 1238, 1238, 1241, 1238, 1243, 1242, - 1244, 1244, 1244, 1245, 1245, 1246, 1246, 1247, 1248, 1247, - 1249, 1249, 1251, 1250, 1252, 1253, 1252, 1252, 1252, 1252, - 1252, 1252, 1252, 1252, 1252, 1252, 1252, 1254, 1252, 1255, - 1255, 1256, 1256, 1257, 1257, 1258, 1258, 1259, 1259, 1260, - 1260, 1261, 1261, 1262, 1262, 1263, 1264, 1264, 1265, 1265, - 1266, 1267, 1266, 1268, 1266, 1266, 1269, 1266, 1270, 1266, - 1266, 1271, 1266, 1272, 1266, 1266, 1273, 1273, 1273, 1274, - 1274, 1275, 1275, 1276, 1278, 1277, 1277, 1277, 1279, 1280, - 1279, 1281, 1283, 1282, 1285, 1284, 1287, 1288, 1286, 1289, - 1290, 1291, 1291, 1292, 1292, 1292, 1292, 1293, 1293, 1295, - 1294, 1296, 1294, 1297, 1297, 1298, 1299, 1298, 1301, 1300, - 1302, 1302, 1303, 1303, 1304, 1304, 1305, 1305, 1306, 1306, - 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, 1306, - 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1308, - 1308, 1308, 1308, 1309, 1309, 1309, 1310, 1310, 1311, 1311, - 1312, 1313, 1312, 1314, 1315, 1314, 1316, 1316, 1317, 1317, - 1318, 1318, 1319, 1319, 1319, 1320, 1321, 1321, 1322, 1323, - 1323, 1325, 1324, 1326, 1326, 1327, 1327, 1327, 1328, 1328, - 1329, 1330, 1330, 1330, 1331, 1331, 1331, 1332, 1332, 1332, - 1332, 1332, 1333, 1334, 1334, 1334, 1334, 1335, 1335, 1335, - 1336, 1336, 1336, 1336, 1336, 1336, 1337, 1337, 1337, 1337, - 1337, 1338, 1338, 1338, 1338, 1338, 1339, 1339, 1339, 1339, - 1339, 1340, 1341, 1341, 1342, 1342, 1343, 1344, 1343, 1345, - 1345, 1346, 1346, 1347, 1349, 1348, 1350, 1350, 1351, 1352, - 1352, 1353, 1353, 1355, 1354, 1357, 1358, 1356, 1356, 1356, - 1360, 1359, 1362, 1361, 1363, 1361, 1361, 1361, 1361, 1361, - 1361, 1361, 1364, 1361, 1361, 1361, 1361, 1361, 1361, 1365, - 1365, 1366, 1367, 1368, 1368, 1369, 1370, 1370, 1371, 1371, - 1372, 1372, 1374, 1375, 1373, 1377, 1378, 1376, 1379, 1379, - 1379, 1379, 1380, 1380, 1381, 1381, 1382, 1383, 1383, 1383, - 1384, 1383, 1385, 1385, 1386, 1386, 1387, 1386, 1388, 1386, - 1389, 1389, 1390, 1390, 1391, 1392, 1392, 1393, 1393, 1395, - 1394, 1396, 1396, 1397, 1397, 1398, 1398, 1399, 1400, 1399, - 1402, 1403, 1401, 1404, 1404, 1405, 1406, 1406, 1407, 1408, - 1408, 1410, 1409, 1412, 1413, 1411, 1414, 1411, 1415, 1411, - 1416, 1416, 1417, 1417, 1418, 1418, 1419, 1419, 1420, 1420, - 1421, 1421, 1421, 1423, 1422, 1424, 1424, 1425, 1425, 1426, - 1426, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, - 1428, 1428, 1430, 1429, 1431, 1431, 1431, 1431, 1431, 1431, - 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1432, 1431, - 1433, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, - 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, - 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, - 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1434, 1434, 1434, - 1435, 1435, 1436, 1436, 1437, 1437, 1438, 1438, 1439, 1439, - 1440, 1440, 1441, 1441, 1442, 1442, 1442, 1444, 1443, 1445, - 1443, 1446, 1446, 1446, 1446, 1446, 1447, 1447, 1448, 1449, - 1449, 1449, 1450, 1450, 1451, 1451, 1451, 1453, 1452, 1455, - 1454, 1454, 1456, 1456, 1457, 1458, 1457, 1459, 1459, 1460, - 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, 1460, - 1460, 1460, 1460, 1460, 1460, 1461, 1461, 1462, 1462, 1464, - 1463, 1465, 1465, 1467, 1466, 1468, 1466, 1466, 1469, 1469, - 1470, 1470, 1472, 1471, 1473, 1474, 1474, 1476, 1475, 1477, - 1477, 1477, 1478, 1478, 1478, 1478, 1479, 1479, 1480, 1481, - 1483, 1484, 1485, 1486, 1482, 1487, 1487, 1488, 1488, 1489, - 1489, 1489, 1490, 1490, 1490, 1491, 1491, 1492, 1492, 1493, - 1493, 1493, 1493, 1494, 1494, 1495, 1495, 1496, 1496, 1497, - 1497, 1498, 1498, 1499, 1499, 1500, 1500, 1500, 1501, 1501, - 1502, 1502, 1503, 1503, 1504, 1504, 1505, 1506, 1506, 1506, - 1506, 1507, 1507, 1508, 1508, 1508, 1509, 1510, 1510, 1510, - 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, - 1512, 1512, 1512, 1512, 1512, 1513, 1513, 1513, 1514, 1514, - 1515, 1515, 1516, 1517, 1517, 1518, 1518, 1519, 1519, 1519, - 1520, 1520, 1520, 1520, 1521, 1521, 1521, 1522, 1522, 1523, - 1524, 1524, 1525, 1526, 1527, 1528, 1528, 1529, 1529, 1530, - 1530, 1530, 1531, 1531, 1531, 1532, 1532, 1533, 1534, 1534, - 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, - 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, - 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, - 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, - 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, - 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, - 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1535, 1537, 1536, - 1538, 1539, 1536, 1540, 1540, 1542, 1541, 1543, 1541, 1544, - 1541, 1546, 1545, 1545, 1547, 1547, 1549, 1548, 1550, 1548, - 1552, 1551, 1551, 1553, 1553, 1553, 1554, 1554, 1554, 1554, - 1555, 1555, 1555, 1555, 1556, 1557, 1557, 1557, 1557, 1557, - 1557, 1557, 1557, 1557, 1557, 1558, 1558, 1558, 1559, 1559, - 1559, 1559, 1560, 1561, 1562, 1562, 1563, 1563, 1563, 1563, - 1564, 1564, 1565, 1565, 1565, 1566, 1566, 1566, 1566, 1566, - 1568, 1567, 1569, 1569, 1570, 1570, 1571, 1572, 1572, 1572, - 1572, 1572, 1574, 1573, 1575, 1575, 1576, 1575, 1577, 1577, - 1578, 1578, 1579, 1579, 1579, 1579, 1580, 1579, 1581, 1581, - 1581, 1581, 1581, 1582, 1583, 1583, 1583, 1583, 1583, 1583, - 1584, 1584, 1585, 1586, 1586, 1586, 1586, 1586, 1587, 1587, - 1588, 1588, 1589, 1589, 1590, 1591, 1591, 1592, 1592, 1593, - 1593, 1594, 1594, 1595, 1595, 1597, 1596, 1598, 1596, 1599, - 1596, 1600, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, - 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1596, 1601, - 1601, 1602, 1602, 1603, 1603, 1603, 1604, 1604, 1604, 1604, - 1605, 1605, 1606, 1606, 1607, 1607, 1608, 1608, 1609, 1609, - 1610, 1610, 1610, 1610, 1610, 1611, 1611, 1612, 1612, 1613, - 1614, 1614, 1614, 1614, 1614, 1615, 1615, 1616, 1616, 1617, - 1617, 1618, 1618, 1618, 1618, 1618, 1618, 1620, 1619, 1621, - 1622, 1622, 1623, 1623, 1624, 1624, 1624, 1625, 1625, 1625, - 1626, 1626, 1627, 1628, 1628, 1629, 1630, 1631, 1631, 1633, - 1632, 1634, 1634, 1635, 1635, 1637, 1636, 1638, 1638, 1639, - 1639, 1639, 1640, 1640, 1641, 1642, 1641, 1643, 1644, 1645, - 1646, 1646, 1647, 1647, 1648, 1648, 1648, 1648, 1648, 1648, - 1648, 1648, 1649, 1649, 1649, 1650, 1650, 1650, 1650, 1650, - 1651, 1651, 1651, 1651, 1651, 1651, 1652, 1652, 1653, 1654, - 1655, 1655, 1655, 1656, 1656, 1656, 1658, 1657, 1659, 1659, - 1660, 1660, 1662, 1661, 1663, 1663, 1664, 1664, 1664, 1664, - 1666, 1667, 1668, 1669, 1665, 1670, 1670, 1671, 1673, 1674, - 1675, 1676, 1677, 1672, 1679, 1680, 1681, 1682, 1678, 1683, - 1683, 1683, 1683, 1683, 1683, 1684, 1684, 1684, 1685, 1685, - 1686, 1686, 1686, 1687, 1687, 1688, 1689, 1688, 1690, 1690, - 1691, 1691, 1692, 1692, 1693 + 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1228, 1229, 1229, + 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, + 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, 1229, + 1229, 1229, 1229, 1229, 1230, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1232, 1231, 1231, 1233, 1233, 1234, 1234, 1235, + 1235, 1236, 1236, 1237, 1237, 1238, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1240, 1241, 1239, 1239, 1239, 1239, 1239, + 1239, 1239, 1239, 1239, 1239, 1239, 1242, 1239, 1244, 1243, + 1245, 1245, 1245, 1246, 1246, 1247, 1247, 1248, 1249, 1248, + 1250, 1250, 1252, 1251, 1253, 1254, 1253, 1253, 1253, 1253, + 1253, 1253, 1253, 1253, 1253, 1253, 1253, 1255, 1253, 1256, + 1256, 1257, 1257, 1258, 1258, 1259, 1259, 1260, 1260, 1261, + 1261, 1262, 1262, 1263, 1263, 1264, 1265, 1265, 1266, 1266, + 1267, 1268, 1267, 1269, 1267, 1267, 1270, 1267, 1271, 1267, + 1267, 1272, 1267, 1273, 1267, 1267, 1274, 1274, 1274, 1275, + 1275, 1276, 1276, 1277, 1279, 1278, 1278, 1278, 1280, 1281, + 1280, 1282, 1284, 1283, 1286, 1285, 1288, 1289, 1287, 1290, + 1291, 1292, 1292, 1293, 1293, 1293, 1293, 1294, 1294, 1296, + 1295, 1297, 1295, 1298, 1298, 1299, 1300, 1299, 1302, 1301, + 1303, 1303, 1304, 1304, 1305, 1305, 1306, 1306, 1307, 1307, + 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, + 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1308, 1309, + 1309, 1309, 1309, 1310, 1310, 1310, 1311, 1311, 1312, 1312, + 1313, 1314, 1313, 1315, 1316, 1315, 1317, 1317, 1318, 1318, + 1319, 1319, 1320, 1320, 1320, 1321, 1322, 1322, 1323, 1324, + 1324, 1326, 1325, 1327, 1327, 1328, 1328, 1328, 1329, 1329, + 1330, 1331, 1331, 1331, 1332, 1332, 1332, 1333, 1333, 1333, + 1333, 1333, 1334, 1335, 1335, 1335, 1335, 1336, 1336, 1336, + 1337, 1337, 1337, 1337, 1337, 1337, 1338, 1338, 1338, 1338, + 1338, 1339, 1339, 1339, 1339, 1339, 1340, 1340, 1340, 1340, + 1340, 1341, 1342, 1342, 1343, 1343, 1344, 1345, 1344, 1346, + 1346, 1347, 1347, 1348, 1350, 1349, 1351, 1351, 1352, 1353, + 1353, 1354, 1354, 1356, 1355, 1358, 1359, 1357, 1357, 1357, + 1361, 1360, 1363, 1362, 1364, 1362, 1362, 1362, 1362, 1362, + 1362, 1362, 1365, 1362, 1362, 1362, 1362, 1362, 1362, 1366, + 1366, 1367, 1368, 1369, 1369, 1370, 1371, 1371, 1372, 1372, + 1373, 1373, 1375, 1376, 1374, 1378, 1379, 1377, 1380, 1380, + 1380, 1380, 1381, 1381, 1382, 1382, 1383, 1384, 1384, 1384, + 1385, 1384, 1386, 1386, 1387, 1387, 1388, 1387, 1389, 1387, + 1390, 1390, 1391, 1391, 1392, 1393, 1393, 1394, 1394, 1396, + 1395, 1397, 1397, 1398, 1398, 1399, 1399, 1400, 1401, 1400, + 1403, 1404, 1402, 1405, 1405, 1406, 1407, 1407, 1408, 1409, + 1409, 1411, 1410, 1413, 1414, 1412, 1415, 1412, 1416, 1412, + 1417, 1417, 1418, 1418, 1419, 1419, 1420, 1420, 1421, 1421, + 1422, 1422, 1422, 1424, 1423, 1425, 1425, 1426, 1426, 1427, + 1427, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, + 1429, 1429, 1431, 1430, 1432, 1432, 1432, 1432, 1432, 1432, + 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1433, 1432, + 1434, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, + 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, + 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, + 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1435, 1435, 1435, + 1436, 1436, 1437, 1437, 1438, 1438, 1439, 1439, 1440, 1440, + 1441, 1441, 1442, 1442, 1443, 1443, 1443, 1445, 1444, 1446, + 1444, 1447, 1447, 1447, 1447, 1447, 1448, 1448, 1449, 1450, + 1450, 1450, 1451, 1451, 1452, 1452, 1452, 1454, 1453, 1456, + 1455, 1455, 1457, 1457, 1458, 1459, 1458, 1460, 1460, 1461, + 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + 1461, 1461, 1461, 1461, 1461, 1462, 1462, 1463, 1463, 1464, + 1464, 1464, 1465, 1466, 1466, 1468, 1467, 1469, 1469, 1471, + 1470, 1472, 1470, 1470, 1473, 1473, 1474, 1474, 1476, 1475, + 1477, 1478, 1478, 1480, 1479, 1481, 1481, 1481, 1482, 1482, + 1482, 1482, 1483, 1483, 1484, 1485, 1487, 1488, 1489, 1490, + 1486, 1491, 1491, 1492, 1492, 1493, 1493, 1493, 1494, 1494, + 1494, 1495, 1495, 1496, 1496, 1497, 1497, 1497, 1497, 1498, + 1498, 1499, 1499, 1500, 1500, 1501, 1501, 1502, 1502, 1503, + 1503, 1504, 1504, 1504, 1505, 1505, 1506, 1506, 1507, 1507, + 1508, 1508, 1509, 1510, 1510, 1510, 1510, 1511, 1511, 1512, + 1512, 1512, 1513, 1514, 1514, 1514, 1515, 1515, 1515, 1515, + 1515, 1515, 1515, 1515, 1515, 1515, 1516, 1516, 1516, 1516, + 1516, 1517, 1517, 1517, 1518, 1518, 1519, 1519, 1520, 1521, + 1521, 1522, 1522, 1523, 1523, 1523, 1524, 1524, 1524, 1524, + 1525, 1525, 1525, 1526, 1526, 1527, 1528, 1528, 1529, 1530, + 1531, 1532, 1532, 1533, 1533, 1534, 1534, 1534, 1535, 1535, + 1535, 1536, 1536, 1537, 1538, 1538, 1538, 1538, 1538, 1538, + 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, + 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, + 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, + 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, + 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, 1538, + 1538, 1538, 1538, 1538, 1538, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, 1539, + 1539, 1539, 1539, 1539, 1541, 1540, 1542, 1543, 1540, 1544, + 1544, 1546, 1545, 1547, 1545, 1548, 1545, 1550, 1549, 1549, + 1551, 1551, 1553, 1552, 1554, 1552, 1556, 1555, 1555, 1557, + 1557, 1557, 1558, 1558, 1558, 1558, 1559, 1559, 1559, 1559, + 1560, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1561, + 1561, 1562, 1562, 1562, 1563, 1563, 1563, 1563, 1564, 1565, + 1566, 1566, 1567, 1567, 1567, 1567, 1568, 1568, 1569, 1569, + 1569, 1570, 1570, 1570, 1570, 1570, 1572, 1571, 1573, 1573, + 1574, 1574, 1575, 1576, 1576, 1576, 1576, 1576, 1578, 1577, + 1579, 1579, 1580, 1579, 1581, 1581, 1582, 1582, 1583, 1583, + 1583, 1583, 1584, 1583, 1585, 1585, 1585, 1585, 1585, 1586, + 1587, 1587, 1587, 1587, 1587, 1587, 1588, 1588, 1589, 1590, + 1590, 1590, 1590, 1590, 1591, 1591, 1592, 1592, 1593, 1593, + 1594, 1595, 1595, 1596, 1596, 1597, 1597, 1598, 1598, 1599, + 1599, 1601, 1600, 1602, 1600, 1603, 1600, 1604, 1600, 1600, + 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, + 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, 1600, + 1600, 1600, 1600, 1600, 1600, 1605, 1605, 1606, 1606, 1607, + 1607, 1607, 1608, 1608, 1608, 1608, 1609, 1609, 1610, 1610, + 1611, 1611, 1612, 1612, 1613, 1613, 1614, 1614, 1614, 1614, + 1614, 1615, 1615, 1616, 1616, 1617, 1618, 1618, 1618, 1618, + 1618, 1619, 1619, 1620, 1620, 1621, 1621, 1622, 1622, 1622, + 1622, 1622, 1622, 1624, 1623, 1625, 1626, 1626, 1627, 1627, + 1628, 1628, 1628, 1629, 1629, 1629, 1630, 1630, 1631, 1632, + 1632, 1633, 1634, 1635, 1635, 1637, 1636, 1638, 1638, 1639, + 1639, 1641, 1640, 1642, 1642, 1643, 1643, 1643, 1644, 1644, + 1645, 1646, 1645, 1647, 1648, 1649, 1650, 1650, 1651, 1651, + 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1652, 1653, 1653, + 1653, 1654, 1654, 1654, 1654, 1654, 1655, 1655, 1655, 1655, + 1655, 1655, 1656, 1656, 1657, 1658, 1659, 1659, 1659, 1660, + 1660, 1660, 1662, 1661, 1663, 1663, 1664, 1664, 1666, 1665, + 1667, 1667, 1668, 1668, 1668, 1668, 1670, 1671, 1672, 1673, + 1669, 1674, 1674, 1675, 1677, 1678, 1679, 1680, 1681, 1676, + 1683, 1684, 1685, 1686, 1682, 1687, 1687, 1687, 1687, 1687, + 1687, 1688, 1688, 1688, 1689, 1689, 1690, 1690, 1690, 1691, + 1691, 1692, 1693, 1692, 1694, 1694, 1695, 1695, 1696, 1696, + 1697 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ @@ -19003,23 +19056,25 @@ static const yytype_uint8 yyr2[] = 4, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 0, 3, 0, 1, 1, 0, 4, 0, 4, 1, 0, 1, 4, 0, 3, 3, 1, 2, - 2, 2, 2, 2, 3, 2, 1, 1, 1, 1, - 2, 1, 1, 1, 2, 0, 1, 0, 3, 0, - 3, 3, 1, 0, 4, 0, 3, 2, 0, 1, - 0, 2, 0, 3, 3, 2, 2, 0, 5, 0, - 1, 1, 0, 1, 1, 2, 1, 2, 1, 2, - 0, 0, 0, 0, 22, 1, 1, 0, 1, 0, - 1, 1, 0, 1, 1, 0, 2, 2, 1, 3, - 4, 3, 3, 0, 2, 2, 1, 3, 3, 0, - 4, 0, 3, 1, 1, 0, 3, 2, 3, 1, - 1, 2, 0, 2, 3, 1, 5, 1, 1, 2, - 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, - 3, 5, 1, 1, 1, 1, 1, 3, 4, 5, - 1, 5, 3, 2, 1, 3, 2, 2, 4, 1, + 2, 2, 2, 3, 3, 2, 1, 1, 1, 1, + 2, 1, 1, 1, 2, 0, 1, 0, 5, 0, + 1, 3, 1, 0, 3, 0, 3, 3, 1, 0, + 4, 0, 3, 2, 0, 1, 0, 2, 0, 3, + 3, 2, 2, 0, 5, 0, 1, 1, 0, 1, + 1, 2, 1, 2, 1, 2, 0, 0, 0, 0, + 22, 1, 1, 0, 1, 0, 1, 1, 0, 1, + 1, 0, 2, 2, 1, 3, 4, 3, 3, 0, + 2, 2, 1, 3, 3, 0, 4, 0, 3, 1, + 1, 0, 3, 2, 3, 1, 1, 2, 0, 2, + 3, 1, 5, 1, 1, 2, 2, 1, 1, 1, + 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, + 1, 2, 2, 2, 1, 1, 3, 5, 1, 1, + 1, 1, 1, 3, 4, 5, 1, 5, 3, 2, + 1, 3, 2, 2, 4, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -19055,44 +19110,43 @@ static const yytype_uint8 yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 3, 0, 0, 7, 1, + 3, 0, 3, 0, 3, 0, 3, 0, 3, 2, + 0, 2, 0, 2, 0, 4, 0, 3, 1, 1, + 1, 1, 0, 1, 1, 1, 0, 2, 2, 2, + 3, 3, 4, 6, 2, 3, 3, 3, 5, 2, + 3, 1, 3, 3, 1, 1, 3, 3, 1, 3, + 2, 2, 2, 2, 2, 1, 1, 3, 1, 4, + 4, 1, 1, 1, 1, 1, 0, 4, 1, 1, + 1, 3, 3, 1, 1, 2, 2, 2, 0, 3, + 4, 3, 0, 7, 1, 2, 1, 1, 1, 1, + 1, 1, 0, 5, 1, 1, 1, 1, 1, 3, + 6, 6, 6, 7, 5, 3, 4, 1, 3, 8, + 8, 8, 6, 4, 0, 3, 0, 3, 1, 3, + 2, 1, 1, 0, 1, 1, 2, 0, 1, 1, + 3, 0, 3, 0, 3, 0, 3, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 3, - 0, 0, 7, 1, 3, 0, 3, 0, 3, 0, - 3, 0, 3, 2, 0, 2, 0, 2, 0, 4, - 0, 3, 1, 1, 1, 1, 0, 1, 1, 1, - 0, 2, 2, 2, 3, 3, 4, 6, 2, 3, - 3, 3, 5, 2, 3, 1, 3, 3, 1, 1, - 3, 3, 1, 3, 2, 2, 2, 2, 2, 1, - 1, 3, 1, 4, 4, 1, 1, 1, 1, 1, - 0, 4, 1, 1, 1, 3, 3, 1, 1, 2, - 2, 2, 0, 3, 4, 3, 0, 7, 1, 2, - 1, 1, 1, 1, 1, 1, 0, 5, 1, 1, - 1, 1, 1, 3, 6, 6, 6, 7, 5, 3, - 4, 1, 3, 8, 8, 8, 6, 4, 0, 3, - 0, 3, 1, 3, 2, 1, 1, 0, 1, 1, - 2, 0, 1, 1, 3, 0, 3, 0, 3, 0, - 3, 0, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 2, 1, 3, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 1, 2, 0, - 1, 3, 1, 2, 2, 2, 1, 3, 3, 1, - 1, 3, 1, 3, 1, 3, 1, 1, 1, 1, - 4, 5, 4, 6, 1, 0, 3, 3, 1, 1, - 0, 2, 2, 2, 2, 0, 2, 0, 3, 2, - 1, 2, 2, 2, 2, 2, 2, 0, 3, 1, - 0, 1, 0, 1, 0, 3, 2, 0, 1, 2, - 0, 1, 4, 4, 5, 2, 3, 0, 1, 0, - 4, 1, 1, 0, 1, 0, 2, 2, 1, 0, - 1, 1, 3, 4, 1, 0, 5, 3, 0, 0, - 0, 1, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 2, 3, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 3, - 3, 3, 3, 0, 3, 3, 0, 8, 0, 3, - 1, 3, 0, 3, 2, 4, 0, 3, 4, 4, - 0, 0, 0, 0, 18, 2, 1, 7, 0, 0, - 0, 0, 0, 15, 0, 0, 0, 0, 12, 4, - 4, 3, 4, 3, 2, 1, 3, 5, 1, 1, - 0, 1, 1, 0, 2, 0, 0, 3, 0, 2, - 5, 3, 3, 3, 1 + 2, 2, 1, 3, 2, 2, 2, 2, 2, 2, + 2, 2, 1, 1, 2, 0, 1, 3, 1, 2, + 2, 2, 1, 3, 3, 1, 1, 3, 1, 3, + 1, 3, 1, 1, 1, 1, 4, 5, 4, 6, + 1, 0, 3, 3, 1, 1, 0, 2, 2, 2, + 2, 0, 2, 0, 3, 2, 1, 2, 2, 2, + 2, 2, 2, 0, 3, 1, 0, 1, 0, 1, + 0, 3, 2, 0, 1, 2, 0, 1, 4, 4, + 5, 2, 3, 0, 1, 0, 4, 1, 1, 0, + 1, 0, 2, 2, 1, 0, 1, 1, 3, 4, + 1, 0, 5, 3, 0, 0, 0, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 3, 3, 3, 3, 0, + 3, 3, 0, 8, 0, 3, 1, 3, 0, 3, + 2, 4, 0, 3, 4, 4, 0, 0, 0, 0, + 18, 2, 1, 7, 0, 0, 0, 0, 0, 15, + 0, 0, 0, 0, 12, 4, 4, 3, 4, 3, + 2, 1, 3, 5, 1, 1, 0, 1, 1, 0, + 2, 0, 0, 3, 0, 2, 5, 3, 3, 3, + 1 }; @@ -19775,7 +19829,7 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); switch (yyn) { case 2: -#line 2024 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2026 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!thd->bootstrap && (!(thd->lex->select_lex.options & OPTION_FOUND_COMMENT))) @@ -19784,11 +19838,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); thd->lex->sql_command= SQLCOM_EMPTY_QUERY; YYLIP->found_semicolon= NULL; } -#line 19788 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 19842 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 3: -#line 2033 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2035 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex_input_stream *lip = YYLIP; @@ -19811,76 +19865,76 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lip->found_semicolon= NULL; } } -#line 19815 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 19869 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 5: -#line 2058 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2060 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* Single query, not terminated. */ YYLIP->found_semicolon= NULL; } -#line 19824 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 19878 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 67: -#line 2137 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2139 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; lex->sql_command= SQLCOM_DEALLOCATE_PREPARE; lex->prepared_stmt_name= (yyvsp[0].lex_str); } -#line 19834 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 19888 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 70: -#line 2151 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2153 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; lex->sql_command= SQLCOM_PREPARE; lex->prepared_stmt_name= (yyvsp[-2].lex_str); } -#line 19844 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 19898 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 71: -#line 2160 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2162 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; lex->prepared_stmt_code= (yyvsp[0].lex_str); lex->prepared_stmt_code_is_varref= FALSE; } -#line 19854 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 19908 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 72: -#line 2166 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2168 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; lex->prepared_stmt_code= (yyvsp[0].lex_str); lex->prepared_stmt_code_is_varref= TRUE; } -#line 19864 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 19918 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 73: -#line 2175 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2177 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; lex->sql_command= SQLCOM_EXECUTE; lex->prepared_stmt_name= (yyvsp[0].lex_str); } -#line 19874 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 19928 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 74: -#line 2181 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2183 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 19880 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 19934 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 79: -#line 2196 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2198 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; LEX_STRING *lexstr= (LEX_STRING*)thd->memdup(&(yyvsp[0].lex_str), sizeof(LEX_STRING)); @@ -19888,158 +19942,158 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); thd->mem_root)) MYSQL_YYABORT; } -#line 19892 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 19946 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 80: -#line 2209 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2211 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->sphead) my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HELP")); } -#line 19901 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 19955 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 81: -#line 2214 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2216 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_HELP; lex->help_arg= (yyvsp[0].lex_str).str; } -#line 19911 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 19965 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 82: -#line 2225 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2227 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_CHANGE_MASTER; } -#line 19919 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 19973 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 83: -#line 2229 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2231 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 19925 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 19979 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 86: -#line 2239 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2241 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.host = (yyvsp[0].lex_str).str; } -#line 19933 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 19987 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 87: -#line 2243 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2245 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.user = (yyvsp[0].lex_str).str; } -#line 19941 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 19995 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 88: -#line 2247 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2249 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.password = (yyvsp[0].lex_str).str; } -#line 19949 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20003 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 89: -#line 2251 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2253 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.port = (yyvsp[0].ulong_num); } -#line 19957 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20011 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 90: -#line 2255 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2257 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.connect_retry = (yyvsp[0].ulong_num); } -#line 19965 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20019 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 91: -#line 2259 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2261 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.ssl= (yyvsp[0].ulong_num) ? LEX_MASTER_INFO::LEX_MI_ENABLE : LEX_MASTER_INFO::LEX_MI_DISABLE; } -#line 19974 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20028 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 92: -#line 2264 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2266 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.ssl_ca= (yyvsp[0].lex_str).str; } -#line 19982 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20036 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 93: -#line 2268 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2270 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.ssl_capath= (yyvsp[0].lex_str).str; } -#line 19990 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20044 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 94: -#line 2272 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2274 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.ssl_cert= (yyvsp[0].lex_str).str; } -#line 19998 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20052 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 95: -#line 2276 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2278 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.ssl_cipher= (yyvsp[0].lex_str).str; } -#line 20006 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20060 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 96: -#line 2280 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2282 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.ssl_key= (yyvsp[0].lex_str).str; } -#line 20014 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20068 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 97: -#line 2284 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2286 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.ssl_verify_server_cert= (yyvsp[0].ulong_num) ? LEX_MASTER_INFO::LEX_MI_ENABLE : LEX_MASTER_INFO::LEX_MI_DISABLE; } -#line 20023 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20077 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 98: -#line 2289 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2291 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.ssl_crl= (yyvsp[0].lex_str).str; } -#line 20031 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20085 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 99: -#line 2293 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2295 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.ssl_crlpath= (yyvsp[0].lex_str).str; } -#line 20039 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20093 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 100: -#line 2298 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2300 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.heartbeat_period= (float) (yyvsp[0].item_num)->val_real(); if (Lex->mi.heartbeat_period > SLAVE_MAX_HEARTBEAT_PERIOD || @@ -20066,67 +20120,67 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } Lex->mi.heartbeat_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; } -#line 20070 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20124 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 101: -#line 2325 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2327 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.repl_ignore_server_ids_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; } -#line 20078 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20132 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 102: -#line 2329 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2331 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.repl_do_domain_ids_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; } -#line 20086 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20140 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 103: -#line 2333 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2335 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.repl_ignore_domain_ids_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; } -#line 20094 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20148 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 108: -#line 2348 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2350 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { insert_dynamic(&Lex->mi.repl_ignore_server_ids, (uchar*) &((yyvsp[0].ulong_num))); } -#line 20102 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20156 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 112: -#line 2361 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2363 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { insert_dynamic(&Lex->mi.repl_do_domain_ids, (uchar*) &((yyvsp[0].ulong_num))); } -#line 20110 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20164 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 116: -#line 2374 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2376 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { insert_dynamic(&Lex->mi.repl_ignore_domain_ids, (uchar*) &((yyvsp[0].ulong_num))); } -#line 20118 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20172 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 117: -#line 2381 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2383 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.log_file_name = (yyvsp[0].lex_str).str; } -#line 20126 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20180 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 118: -#line 2385 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2387 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* If the user specified a value < BIN_LOG_HEADER_SIZE, adjust it @@ -20141,68 +20195,68 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); */ Lex->mi.pos= MY_MAX(BIN_LOG_HEADER_SIZE, (yyvsp[0].ulonglong_number)); } -#line 20145 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20199 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 119: -#line 2400 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2402 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.relay_log_name = (yyvsp[0].lex_str).str; } -#line 20153 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20207 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 120: -#line 2404 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2406 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.relay_log_pos = (yyvsp[0].ulong_num); /* Adjust if < BIN_LOG_HEADER_SIZE (same comment as Lex->mi.pos) */ Lex->mi.relay_log_pos= MY_MAX(BIN_LOG_HEADER_SIZE, Lex->mi.relay_log_pos); } -#line 20163 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20217 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 121: -#line 2410 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2412 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->mi.use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_UNCHANGED) my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MASTER_use_gtid")); Lex->mi.use_gtid_opt= LEX_MASTER_INFO::LEX_GTID_CURRENT_POS; } -#line 20173 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20227 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 122: -#line 2416 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2418 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->mi.use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_UNCHANGED) my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MASTER_use_gtid")); Lex->mi.use_gtid_opt= LEX_MASTER_INFO::LEX_GTID_SLAVE_POS; } -#line 20183 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20237 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 123: -#line 2422 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2424 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->mi.use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_UNCHANGED) my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MASTER_use_gtid")); Lex->mi.use_gtid_opt= LEX_MASTER_INFO::LEX_GTID_NO; } -#line 20193 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20247 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 124: -#line 2431 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2433 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; lex->mi.connection_name= null_lex_str; } -#line 20202 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20256 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 126: -#line 2440 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2442 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.connection_name= (yyvsp[0].lex_str); #ifdef HAVE_REPLICATION @@ -20210,11 +20264,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); my_yyabort_error((ER_WRONG_ARGUMENTS, MYF(0), "MASTER_CONNECTION_NAME")); #endif } -#line 20214 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20268 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 127: -#line 2453 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2455 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; lex->create_info.init(); @@ -20234,11 +20288,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->name= null_lex_str; lex->create_last_non_select_table= lex->last_table(); } -#line 20238 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20292 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 128: -#line 2473 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2475 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; lex->current_select= &lex->select_lex; @@ -20254,82 +20308,82 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } create_table_set_open_action_and_adjust_tables(lex); } -#line 20258 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20312 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 129: -#line 2491 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2493 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (add_create_index_prepare(Lex, (yyvsp[0].table))) MYSQL_YYABORT; if (Lex->add_create_index((yyvsp[-6].key_type), (yyvsp[-3].lex_str), (yyvsp[-2].key_alg), (yyvsp[-7].object_ddl_options) | (yyvsp[-4].object_ddl_options))) MYSQL_YYABORT; } -#line 20269 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20323 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 130: -#line 2498 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2500 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 20275 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20329 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 131: -#line 2501 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2503 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (add_create_index_prepare(Lex, (yyvsp[0].table))) MYSQL_YYABORT; if (Lex->add_create_index((yyvsp[-5].key_type), (yyvsp[-2].lex_str), HA_KEY_ALG_UNDEF, (yyvsp[-6].object_ddl_options) | (yyvsp[-3].object_ddl_options))) MYSQL_YYABORT; } -#line 20286 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20340 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 132: -#line 2508 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2510 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 20292 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20346 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 133: -#line 2511 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2513 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (add_create_index_prepare(Lex, (yyvsp[0].table))) MYSQL_YYABORT; if (Lex->add_create_index((yyvsp[-5].key_type), (yyvsp[-2].lex_str), HA_KEY_ALG_UNDEF, (yyvsp[-6].object_ddl_options) | (yyvsp[-3].object_ddl_options))) MYSQL_YYABORT; } -#line 20303 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20357 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 134: -#line 2518 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2520 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 20309 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20363 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 135: -#line 2520 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2522 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.default_table_charset= NULL; Lex->create_info.used_fields= 0; } -#line 20318 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20372 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 136: -#line 2525 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2527 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (lex->set_command_with_check(SQLCOM_CREATE_DB, 0, (yyvsp[-5].object_ddl_options) | (yyvsp[-3].object_ddl_options))) MYSQL_YYABORT; lex->name= (yyvsp[-2].lex_str); } -#line 20329 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20383 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 137: -#line 2532 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2534 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.set((yyvsp[0].object_ddl_options)); Lex->create_view_mode= ((yyvsp[0].object_ddl_options).or_replace() ? VIEW_CREATE_OR_REPLACE : @@ -20337,141 +20391,141 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Lex->create_view_algorithm= DTYPE_ALGORITHM_UNDEFINED; Lex->create_view_suid= TRUE; } -#line 20341 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20395 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 138: -#line 2539 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2541 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 20347 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20401 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 139: -#line 2541 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2543 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->set_command_with_check(SQLCOM_CREATE_USER, (yyvsp[-4].object_ddl_options) | (yyvsp[-2].object_ddl_options))) MYSQL_YYABORT; } -#line 20356 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20410 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 140: -#line 2547 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2549 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->set_command_with_check(SQLCOM_CREATE_ROLE, (yyvsp[-5].object_ddl_options) | (yyvsp[-3].object_ddl_options))) MYSQL_YYABORT; } -#line 20365 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20419 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 141: -#line 2552 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2554 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->alter_tablespace_info->ts_cmd_type= CREATE_LOGFILE_GROUP; } -#line 20373 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20427 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 142: -#line 2556 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2558 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->alter_tablespace_info->ts_cmd_type= CREATE_TABLESPACE; } -#line 20381 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20435 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 143: -#line 2559 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2561 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->set_command(SQLCOM_CREATE_SERVER, (yyvsp[0].object_ddl_options)); } -#line 20387 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20441 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 144: -#line 2561 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2563 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 20393 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20447 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 145: -#line 2566 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2568 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->add_create_options_with_check((yyvsp[-1].object_ddl_options))) MYSQL_YYABORT; Lex->server_options.reset((yyvsp[0].lex_str)); } -#line 20403 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20457 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 146: -#line 2573 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2575 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->server_options.scheme= (yyvsp[-4].lex_str); } -#line 20409 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20463 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 149: -#line 2583 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2585 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS(Lex->server_options.username.str == 0); Lex->server_options.username= (yyvsp[0].lex_str); } -#line 20418 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20472 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 150: -#line 2588 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2590 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS(Lex->server_options.host.str == 0); Lex->server_options.host= (yyvsp[0].lex_str); } -#line 20427 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20481 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 151: -#line 2593 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2595 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS(Lex->server_options.db.str == 0); Lex->server_options.db= (yyvsp[0].lex_str); } -#line 20436 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20490 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 152: -#line 2598 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2600 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS(Lex->server_options.owner.str == 0); Lex->server_options.owner= (yyvsp[0].lex_str); } -#line 20445 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20499 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 153: -#line 2603 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2605 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS(Lex->server_options.password.str == 0); Lex->server_options.password= (yyvsp[0].lex_str); } -#line 20454 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20508 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 154: -#line 2608 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2610 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS(Lex->server_options.socket.str == 0); Lex->server_options.socket= (yyvsp[0].lex_str); } -#line 20463 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20517 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 155: -#line 2613 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2615 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->server_options.port= (yyvsp[0].ulong_num); } -#line 20471 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20525 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 156: -#line 2620 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2622 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; @@ -20487,11 +20541,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sql_command= SQLCOM_CREATE_EVENT; /* We need that for disallowing subqueries */ } -#line 20491 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20545 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 157: -#line 2640 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2642 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* sql_command is set here because some rules in ev_sql_stmt @@ -20499,123 +20553,123 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); */ Lex->sql_command= SQLCOM_CREATE_EVENT; } -#line 20503 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20557 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 158: -#line 2651 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2653 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->event_parse_data->item_expression= (yyvsp[-1].item); Lex->event_parse_data->interval= (yyvsp[0].interval); } -#line 20512 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20566 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 160: -#line 2658 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2660 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->event_parse_data->item_execute_at= (yyvsp[0].item); } -#line 20520 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20574 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 161: -#line 2664 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2666 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0; } -#line 20526 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20580 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 162: -#line 2666 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2668 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->event_parse_data->status= Event_parse_data::ENABLED; Lex->event_parse_data->status_changed= true; (yyval.num)= 1; } -#line 20536 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20590 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 163: -#line 2672 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2674 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->event_parse_data->status= Event_parse_data::SLAVESIDE_DISABLED; Lex->event_parse_data->status_changed= true; (yyval.num)= 1; } -#line 20546 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20600 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 164: -#line 2678 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2680 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->event_parse_data->status= Event_parse_data::DISABLED; Lex->event_parse_data->status_changed= true; (yyval.num)= 1; } -#line 20556 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20610 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 165: -#line 2687 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2689 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item *item= new (thd->mem_root) Item_func_now_local(thd, 0); if (item == NULL) MYSQL_YYABORT; Lex->event_parse_data->item_starts= item; } -#line 20567 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20621 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 166: -#line 2694 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2696 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->event_parse_data->item_starts= (yyvsp[0].item); } -#line 20575 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20629 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 168: -#line 2702 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2704 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->event_parse_data->item_ends= (yyvsp[0].item); } -#line 20583 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20637 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 169: -#line 2708 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2710 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0; } -#line 20589 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20643 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 171: -#line 2714 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2716 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->event_parse_data->on_completion= (yyvsp[-1].num) ? Event_parse_data::ON_COMPLETION_DROP : Event_parse_data::ON_COMPLETION_PRESERVE; (yyval.num)= 1; } -#line 20600 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20654 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 172: -#line 2723 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2725 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0; } -#line 20606 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20660 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 173: -#line 2725 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2727 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->comment= Lex->event_parse_data->comment= (yyvsp[0].lex_str); (yyval.num)= 1; } -#line 20615 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20669 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 174: -#line 2732 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2734 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; Lex_input_stream *lip= YYLIP; @@ -20646,11 +20700,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sp_chistics.suid= SP_IS_SUID; //always the definer! lex->sphead->set_body_start(thd, lip->get_cpp_ptr()); } -#line 20650 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20704 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 175: -#line 2763 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2765 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; @@ -20660,11 +20714,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->event_parse_data->body_changed= TRUE; } -#line 20664 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20718 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 176: -#line 2776 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2778 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->users_list.empty(); @@ -20676,11 +20730,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->ssl_cipher= lex->x509_subject= lex->x509_issuer= 0; bzero((char *)&(lex->mqh),sizeof(lex->mqh)); } -#line 20680 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20734 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 177: -#line 2791 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2793 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!(yyvsp[-2].lex_str).str || check_db_name(&(yyvsp[-2].lex_str))) my_yyabort_error((ER_WRONG_DB_NAME, MYF(0), (yyvsp[-2].lex_str).str)); @@ -20691,11 +20745,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; (yyval.spname)->init_qname(thd); } -#line 20695 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20749 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 178: -#line 2802 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2804 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; LEX_STRING db; @@ -20710,105 +20764,105 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; (yyval.spname)->init_qname(thd); } -#line 20714 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20768 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 179: -#line 2819 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2821 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 20720 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20774 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 180: -#line 2820 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2822 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 20726 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20780 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 181: -#line 2824 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2826 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 20732 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20786 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 182: -#line 2825 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2827 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 20738 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20792 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 183: -#line 2831 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2833 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sp_chistics.comment= (yyvsp[0].lex_str); } -#line 20744 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20798 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 184: -#line 2833 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2835 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* Just parse it, we only have one language for now. */ } -#line 20750 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20804 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 185: -#line 2835 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2837 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sp_chistics.daccess= SP_NO_SQL; } -#line 20756 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20810 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 186: -#line 2837 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2839 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sp_chistics.daccess= SP_CONTAINS_SQL; } -#line 20762 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20816 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 187: -#line 2839 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2841 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sp_chistics.daccess= SP_READS_SQL_DATA; } -#line 20768 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20822 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 188: -#line 2841 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2843 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sp_chistics.daccess= SP_MODIFIES_SQL_DATA; } -#line 20774 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20828 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 189: -#line 2843 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2845 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 20780 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20834 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 190: -#line 2848 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2850 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 20786 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20840 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 191: -#line 2849 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2851 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sp_chistics.detistic= ! (yyvsp[-1].num); } -#line 20792 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20846 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 192: -#line 2854 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2856 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sp_chistics.suid= SP_IS_SUID; } -#line 20800 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20854 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 193: -#line 2858 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2860 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sp_chistics.suid= SP_IS_NOT_SUID; } -#line 20808 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20862 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 194: -#line 2865 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2867 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex = Lex; @@ -20817,33 +20871,33 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->value_list.empty(); sp_add_used_routine(lex, thd, (yyvsp[0].spname), TYPE_ENUM_PROCEDURE); } -#line 20821 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20875 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 195: -#line 2873 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2875 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 20827 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20881 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 200: -#line 2889 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2891 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->value_list.push_back((yyvsp[0].item), thd->mem_root); } -#line 20835 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20889 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 201: -#line 2893 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2895 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->value_list.push_back((yyvsp[0].item), thd->mem_root); } -#line 20843 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20897 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 206: -#line 2911 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2913 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_pcontext *spc= lex->spcont; @@ -20857,11 +20911,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); thd->variables.collation_database); (yyval.spvar)= spvar; } -#line 20861 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20915 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 207: -#line 2925 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2927 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_variable *spvar= (yyvsp[-1].spvar); @@ -20877,61 +20931,61 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.spvar)= spvar; } -#line 20881 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20935 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 212: -#line 2954 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2956 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyvsp[0].spvar)->mode=(yyvsp[-1].spvar_mode); } -#line 20887 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20941 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 213: -#line 2958 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2960 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.spvar_mode)= sp_variable::MODE_IN; } -#line 20893 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20947 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 214: -#line 2959 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2961 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.spvar_mode)= sp_variable::MODE_IN; } -#line 20899 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20953 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 215: -#line 2960 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2962 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.spvar_mode)= sp_variable::MODE_OUT; } -#line 20905 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20959 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 216: -#line 2961 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2963 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.spvar_mode)= sp_variable::MODE_INOUT; } -#line 20911 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20965 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 217: -#line 2965 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2967 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 20917 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20971 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 219: -#line 2970 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2972 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 20923 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20977 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 221: -#line 2976 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2978 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.spblock).vars= (yyval.spblock).conds= (yyval.spblock).hndlrs= (yyval.spblock).curs= 0; } -#line 20931 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 20985 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 222: -#line 2980 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 2982 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* We check for declarations out of (standard) order this way because letting the grammar rules reflect it caused tricky @@ -20946,11 +21000,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.spblock).hndlrs= (yyvsp[-2].spblock).hndlrs + (yyvsp[-1].spblock).hndlrs; (yyval.spblock).curs= (yyvsp[-2].spblock).curs + (yyvsp[-1].spblock).curs; } -#line 20950 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21004 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 223: -#line 2998 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3000 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_pcontext *pctx= lex->spcont; @@ -20965,11 +21019,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); thd->lex->init_last_field(&spvar->field_def, spvar->name.str, thd->variables.collation_database); } -#line 20969 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21023 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 224: -#line 3014 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3016 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_pcontext *pctx= lex->spcont; @@ -21025,11 +21079,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.spblock).vars= (yyvsp[-3].num); (yyval.spblock).conds= (yyval.spblock).hndlrs= (yyval.spblock).curs= 0; } -#line 21029 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21083 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 225: -#line 3070 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3072 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_pcontext *spc= lex->spcont; @@ -21041,11 +21095,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.spblock).vars= (yyval.spblock).hndlrs= (yyval.spblock).curs= 0; (yyval.spblock).conds= 1; } -#line 21045 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21099 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 226: -#line 3082 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3084 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -21072,11 +21126,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (sp->push_backpatch(i, ctx->push_label(thd, empty_lex_str, 0))) MYSQL_YYABORT; } -#line 21076 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21130 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 227: -#line 3109 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3111 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -21108,11 +21162,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.spblock).vars= (yyval.spblock).conds= (yyval.spblock).curs= 0; (yyval.spblock).hndlrs= 1; } -#line 21112 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21166 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 228: -#line 3141 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3143 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -21131,19 +21185,19 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.spblock).vars= (yyval.spblock).conds= (yyval.spblock).hndlrs= 0; (yyval.spblock).curs= 1; } -#line 21135 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21189 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 229: -#line 3162 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3164 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sphead->reset_lex(thd); } -#line 21143 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21197 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 230: -#line 3166 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3168 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; @@ -21156,35 +21210,35 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->sphead->restore_lex(thd)) MYSQL_YYABORT; } -#line 21160 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21214 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 231: -#line 3181 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3183 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= sp_handler::EXIT; } -#line 21166 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21220 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 232: -#line 3182 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3184 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= sp_handler::CONTINUE; } -#line 21172 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21226 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 233: -#line 3188 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3190 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 1; } -#line 21178 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21232 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 234: -#line 3190 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3192 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)+= 1; } -#line 21184 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21238 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 235: -#line 3195 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3197 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -21196,11 +21250,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); sp_instr_hpush_jump *i= (sp_instr_hpush_jump *)sp->last_instruction(); i->add_condition((yyvsp[0].spcondvalue)); } -#line 21200 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21254 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 236: -#line 3210 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3212 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* mysql errno */ if ((yyvsp[0].ulong_num) == 0) my_yyabort_error((ER_WRONG_VALUE, MYF(0), "CONDITION", "0")); @@ -21208,11 +21262,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.spcondvalue) == NULL) MYSQL_YYABORT; } -#line 21212 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21266 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 238: -#line 3222 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3224 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* SQLSTATE */ /* @@ -21228,71 +21282,71 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.spcondvalue) == NULL) MYSQL_YYABORT; } -#line 21232 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21286 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 239: -#line 3240 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3242 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 21238 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21292 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 240: -#line 3241 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3243 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 21244 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21298 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 241: -#line 3246 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3248 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.spcondvalue)= (yyvsp[0].spcondvalue); } -#line 21252 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21306 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 242: -#line 3250 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3252 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.spcondvalue)= Lex->spcont->find_condition((yyvsp[0].lex_str), false); if ((yyval.spcondvalue) == NULL) my_yyabort_error((ER_SP_COND_MISMATCH, MYF(0), (yyvsp[0].lex_str).str)); } -#line 21262 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21316 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 243: -#line 3256 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3258 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::WARNING); if ((yyval.spcondvalue) == NULL) MYSQL_YYABORT; } -#line 21272 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21326 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 244: -#line 3262 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3264 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::NOT_FOUND); if ((yyval.spcondvalue) == NULL) MYSQL_YYABORT; } -#line 21282 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21336 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 245: -#line 3268 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3270 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::EXCEPTION); if ((yyval.spcondvalue) == NULL) MYSQL_YYABORT; } -#line 21292 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21346 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 246: -#line 3277 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3279 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; Yacc_state *state= & thd->m_parser_state->m_yacc; @@ -21303,11 +21357,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->m_sql_cmd == NULL) MYSQL_YYABORT; } -#line 21307 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21361 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 247: -#line 3291 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3293 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_condition_value *cond; @@ -21322,37 +21376,37 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); my_yyabort_error((ER_SIGNAL_BAD_CONDITION_TYPE, MYF(0))); (yyval.spcondvalue)= cond; } -#line 21326 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21380 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 248: -#line 3306 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3308 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.spcondvalue)= (yyvsp[0].spcondvalue); } -#line 21332 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21386 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 249: -#line 3311 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3313 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.spcondvalue)= NULL; } -#line 21338 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21392 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 250: -#line 3313 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3315 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.spcondvalue)= (yyvsp[0].spcondvalue); } -#line 21344 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21398 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 251: -#line 3318 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3320 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { thd->m_parser_state->m_yacc.m_set_signal_info.clear(); } -#line 21352 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21406 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 253: -#line 3326 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3328 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Set_signal_information *info; info= &thd->m_parser_state->m_yacc.m_set_signal_info; @@ -21360,11 +21414,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); info->clear(); info->m_item[index]= (yyvsp[0].item); } -#line 21364 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21418 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 254: -#line 3335 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3337 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Set_signal_information *info; info= &thd->m_parser_state->m_yacc.m_set_signal_info; @@ -21374,17 +21428,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Diag_condition_item_names[index].str)); info->m_item[index]= (yyvsp[0].item); } -#line 21378 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21432 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 255: -#line 3351 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3353 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= (yyvsp[0].item); } -#line 21384 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21438 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 256: -#line 3353 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3355 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if ((yyvsp[0].item)->type() == Item::FUNC_ITEM) { @@ -21402,89 +21456,89 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } (yyval.item)= (yyvsp[0].item); } -#line 21406 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21460 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 257: -#line 3371 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3373 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= (yyvsp[0].item); } -#line 21412 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21466 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 258: -#line 3377 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3379 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.diag_condition_item_name)= DIAG_CLASS_ORIGIN; } -#line 21418 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21472 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 259: -#line 3379 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3381 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.diag_condition_item_name)= DIAG_SUBCLASS_ORIGIN; } -#line 21424 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21478 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 260: -#line 3381 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3383 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.diag_condition_item_name)= DIAG_CONSTRAINT_CATALOG; } -#line 21430 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21484 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 261: -#line 3383 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3385 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.diag_condition_item_name)= DIAG_CONSTRAINT_SCHEMA; } -#line 21436 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21490 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 262: -#line 3385 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3387 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.diag_condition_item_name)= DIAG_CONSTRAINT_NAME; } -#line 21442 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21496 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 263: -#line 3387 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3389 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.diag_condition_item_name)= DIAG_CATALOG_NAME; } -#line 21448 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21502 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 264: -#line 3389 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3391 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.diag_condition_item_name)= DIAG_SCHEMA_NAME; } -#line 21454 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21508 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 265: -#line 3391 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3393 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.diag_condition_item_name)= DIAG_TABLE_NAME; } -#line 21460 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21514 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 266: -#line 3393 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3395 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.diag_condition_item_name)= DIAG_COLUMN_NAME; } -#line 21466 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21520 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 267: -#line 3395 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3397 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.diag_condition_item_name)= DIAG_CURSOR_NAME; } -#line 21472 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21526 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 268: -#line 3397 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3399 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.diag_condition_item_name)= DIAG_MESSAGE_TEXT; } -#line 21478 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21532 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 269: -#line 3399 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3401 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.diag_condition_item_name)= DIAG_MYSQL_ERRNO; } -#line 21484 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21538 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 270: -#line 3404 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3406 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; Yacc_state *state= & thd->m_parser_state->m_yacc; @@ -21496,11 +21550,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->m_sql_cmd == NULL) MYSQL_YYABORT; } -#line 21500 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21554 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 271: -#line 3419 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3421 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Diagnostics_information *info= (yyvsp[0].diag_info); @@ -21512,73 +21566,73 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (Lex->m_sql_cmd == NULL) MYSQL_YYABORT; } -#line 21516 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21570 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 272: -#line 3434 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3436 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.diag_area)= Diagnostics_information::CURRENT_AREA; } -#line 21522 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21576 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 273: -#line 3436 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3438 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.diag_area)= Diagnostics_information::CURRENT_AREA; } -#line 21528 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21582 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 274: -#line 3441 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3443 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.diag_info)= new (thd->mem_root) Statement_information((yyvsp[0].stmt_info_list)); if ((yyval.diag_info) == NULL) MYSQL_YYABORT; } -#line 21538 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21592 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 275: -#line 3447 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3449 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.diag_info)= new (thd->mem_root) Condition_information((yyvsp[-1].item), (yyvsp[0].cond_info_list)); if ((yyval.diag_info) == NULL) MYSQL_YYABORT; } -#line 21548 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21602 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 276: -#line 3456 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3458 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.stmt_info_list)= new (thd->mem_root) List; if ((yyval.stmt_info_list) == NULL || (yyval.stmt_info_list)->push_back((yyvsp[0].stmt_info_item), thd->mem_root)) MYSQL_YYABORT; } -#line 21558 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21612 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 277: -#line 3462 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3464 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if ((yyvsp[-2].stmt_info_list)->push_back((yyvsp[0].stmt_info_item), thd->mem_root)) MYSQL_YYABORT; (yyval.stmt_info_list)= (yyvsp[-2].stmt_info_list); } -#line 21568 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21622 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 278: -#line 3471 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3473 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.stmt_info_item)= new (thd->mem_root) Statement_information_item((yyvsp[0].stmt_info_item_name), (yyvsp[-2].item)); if ((yyval.stmt_info_item) == NULL) MYSQL_YYABORT; } -#line 21578 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21632 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 279: -#line 3479 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3481 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex_input_stream *lip= &thd->m_parser_state->m_lip; (yyval.item)= create_item_for_sp_var(thd, (yyvsp[0].lex_str), NULL, @@ -21587,147 +21641,147 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 21591 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21645 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 280: -#line 3488 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3490 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_get_user_var(thd, (yyvsp[0].lex_str)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 21601 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21655 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 281: -#line 3497 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3499 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.stmt_info_item_name)= Statement_information_item::NUMBER; } -#line 21607 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21661 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 282: -#line 3499 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3501 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.stmt_info_item_name)= Statement_information_item::ROW_COUNT; } -#line 21613 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21667 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 283: -#line 3508 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3510 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= (yyvsp[0].item); } -#line 21619 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21673 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 284: -#line 3513 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3515 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cond_info_list)= new (thd->mem_root) List; if ((yyval.cond_info_list) == NULL || (yyval.cond_info_list)->push_back((yyvsp[0].cond_info_item), thd->mem_root)) MYSQL_YYABORT; } -#line 21629 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21683 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 285: -#line 3519 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3521 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if ((yyvsp[-2].cond_info_list)->push_back((yyvsp[0].cond_info_item), thd->mem_root)) MYSQL_YYABORT; (yyval.cond_info_list)= (yyvsp[-2].cond_info_list); } -#line 21639 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21693 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 286: -#line 3528 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3530 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cond_info_item)= new (thd->mem_root) Condition_information_item((yyvsp[0].cond_info_item_name), (yyvsp[-2].item)); if ((yyval.cond_info_item) == NULL) MYSQL_YYABORT; } -#line 21649 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21703 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 287: -#line 3536 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3538 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cond_info_item_name)= Condition_information_item::CLASS_ORIGIN; } -#line 21655 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21709 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 288: -#line 3538 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3540 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cond_info_item_name)= Condition_information_item::SUBCLASS_ORIGIN; } -#line 21661 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21715 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 289: -#line 3540 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3542 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cond_info_item_name)= Condition_information_item::CONSTRAINT_CATALOG; } -#line 21667 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21721 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 290: -#line 3542 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3544 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cond_info_item_name)= Condition_information_item::CONSTRAINT_SCHEMA; } -#line 21673 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21727 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 291: -#line 3544 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3546 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cond_info_item_name)= Condition_information_item::CONSTRAINT_NAME; } -#line 21679 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21733 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 292: -#line 3546 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3548 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cond_info_item_name)= Condition_information_item::CATALOG_NAME; } -#line 21685 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21739 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 293: -#line 3548 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3550 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cond_info_item_name)= Condition_information_item::SCHEMA_NAME; } -#line 21691 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21745 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 294: -#line 3550 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3552 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cond_info_item_name)= Condition_information_item::TABLE_NAME; } -#line 21697 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21751 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 295: -#line 3552 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3554 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cond_info_item_name)= Condition_information_item::COLUMN_NAME; } -#line 21703 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21757 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 296: -#line 3554 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3556 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cond_info_item_name)= Condition_information_item::CURSOR_NAME; } -#line 21709 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21763 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 297: -#line 3556 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3558 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cond_info_item_name)= Condition_information_item::MESSAGE_TEXT; } -#line 21715 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21769 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 298: -#line 3558 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3560 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cond_info_item_name)= Condition_information_item::MYSQL_ERRNO; } -#line 21721 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21775 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 299: -#line 3560 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3562 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cond_info_item_name)= Condition_information_item::RETURNED_SQLSTATE; } -#line 21727 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21781 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 300: -#line 3565 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3567 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* NOTE: field definition is filled in sp_decl section. */ @@ -21739,11 +21793,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); spc->add_variable(thd, (yyvsp[0].lex_str)); (yyval.num)= 1; } -#line 21743 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21797 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 301: -#line 3577 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3579 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* NOTE: field definition is filled in sp_decl section. */ @@ -21755,39 +21809,39 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); spc->add_variable(thd, (yyvsp[0].lex_str)); (yyval.num)= (yyvsp[-2].num) + 1; } -#line 21759 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21813 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 302: -#line 3591 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3593 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item) = NULL; } -#line 21765 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21819 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 303: -#line 3592 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3594 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item) = (yyvsp[0].item); } -#line 21771 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21825 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 319: -#line 3618 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3620 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (maybe_start_compound_statement(thd)) MYSQL_YYABORT; Lex->sphead->new_cont_backpatch(NULL); } -#line 21781 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21835 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 320: -#line 3624 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3626 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sphead->do_cont_backpatch(); } -#line 21787 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21841 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 321: -#line 3628 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3630 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; Lex_input_stream *lip= YYLIP; @@ -21795,11 +21849,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sphead->reset_lex(thd); lex->sphead->m_tmp_query= lip->get_tok_start(); } -#line 21799 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21853 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 322: -#line 3636 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3638 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; Lex_input_stream *lip= YYLIP; @@ -21841,17 +21895,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (sp->restore_lex(thd)) MYSQL_YYABORT; } -#line 21845 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21899 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 323: -#line 3681 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3683 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sphead->reset_lex(thd); } -#line 21851 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21905 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 324: -#line 3683 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3685 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -21871,11 +21925,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (sp->restore_lex(thd)) MYSQL_YYABORT; } -#line 21875 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21929 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 325: -#line 3706 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3708 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp = lex->sphead; @@ -21922,11 +21976,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); sp->push_backpatch(i, lab); /* Jumping forward */ sp->add_instr(i); } -#line 21926 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 21980 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 326: -#line 3756 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3758 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -21964,11 +22018,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); sp->add_instr(i)) MYSQL_YYABORT; } -#line 21968 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22022 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 327: -#line 3797 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3799 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -21983,11 +22037,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); sp->add_instr(i)) MYSQL_YYABORT; } -#line 21987 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22041 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 328: -#line 3815 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3817 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -22002,17 +22056,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); sp->add_instr(i)) MYSQL_YYABORT; } -#line 22006 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22060 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 329: -#line 3830 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3832 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 22012 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22066 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 330: -#line 3835 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3837 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -22027,11 +22081,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); sp->add_instr(i)) MYSQL_YYABORT; } -#line 22031 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22085 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 334: -#line 3859 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3861 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -22045,11 +22099,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); sp_instr_cfetch *i= (sp_instr_cfetch *)sp->last_instruction(); i->add_to_varlist(spv); } -#line 22049 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22103 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 335: -#line 3873 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3875 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -22063,17 +22117,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); sp_instr_cfetch *i= (sp_instr_cfetch *)sp->last_instruction(); i->add_to_varlist(spv); } -#line 22067 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22121 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 336: -#line 3889 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3891 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sphead->reset_lex(thd); } -#line 22073 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22127 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 337: -#line 3891 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3893 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -22089,11 +22143,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (sp->restore_lex(thd)) MYSQL_YYABORT; } -#line 22093 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22147 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 338: -#line 3907 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3909 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { sp_head *sp= Lex->sphead; sp_pcontext *ctx= Lex->spcont; @@ -22105,21 +22159,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); sp->backpatch(ctx->pop_label()); sp->push_backpatch(i, ctx->push_label(thd, empty_lex_str, 0)); } -#line 22109 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22163 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 339: -#line 3919 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3921 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sphead->backpatch(lex->spcont->pop_label()); } -#line 22119 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22173 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 343: -#line 3934 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3936 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (maybe_start_compound_statement(thd)) MYSQL_YYABORT; @@ -22169,11 +22223,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); */ Lex->spcont->push_label(thd, empty_lex_str, Lex->sphead->instructions()); } -#line 22173 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22227 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 344: -#line 3987 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 3989 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* BACKPATCH: Resolving forward jump from @@ -22187,17 +22241,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Lex->sphead->do_cont_backpatch(); } -#line 22191 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22245 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 345: -#line 4003 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4005 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sphead->reset_lex(thd); /* For expr $2 */ } -#line 22197 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22251 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 346: -#line 4005 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4007 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (case_stmt_action_expr(Lex, (yyvsp[0].item))) MYSQL_YYABORT; @@ -22205,31 +22259,31 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (Lex->sphead->restore_lex(thd)) MYSQL_YYABORT; } -#line 22209 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22263 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 347: -#line 4013 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4015 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 1; } -#line 22215 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22269 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 348: -#line 4015 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4017 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0; } -#line 22221 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22275 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 353: -#line 4030 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4032 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sphead->reset_lex(thd); /* For expr $3 */ } -#line 22229 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22283 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 354: -#line 4034 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4036 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* Simple case: = */ @@ -22240,29 +22294,29 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->sphead->restore_lex(thd)) MYSQL_YYABORT; } -#line 22244 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22298 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 355: -#line 4046 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4048 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (case_stmt_action_then(lex)) MYSQL_YYABORT; } -#line 22254 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22308 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 356: -#line 4055 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4057 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sphead->reset_lex(thd); /* For expr $3 */ } -#line 22262 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22316 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 357: -#line 4059 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4061 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (case_stmt_action_when(lex, (yyvsp[0].item), false)) @@ -22271,21 +22325,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->sphead->restore_lex(thd)) MYSQL_YYABORT; } -#line 22275 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22329 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 358: -#line 4069 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4071 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (case_stmt_action_then(lex)) MYSQL_YYABORT; } -#line 22285 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22339 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 359: -#line 4078 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4080 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -22296,23 +22350,23 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); sp->add_instr(i)) MYSQL_YYABORT; } -#line 22300 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22354 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 361: -#line 4092 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4094 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)= null_lex_str; } -#line 22306 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22360 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 362: -#line 4093 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4095 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)= (yyvsp[0].lex_str); } -#line 22312 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22366 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 363: -#line 4098 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4100 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_pcontext *ctx= lex->spcont; @@ -22322,11 +22376,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); my_yyabort_error((ER_SP_LABEL_REDEFINE, MYF(0), (yyvsp[-2].lex_str).str)); lex->name= (yyvsp[-2].lex_str); } -#line 22326 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22380 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 364: -#line 4108 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4110 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if ((yyvsp[0].lex_str).str) { @@ -22334,41 +22388,41 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); my_yyabort_error((ER_SP_LABEL_MISMATCH, MYF(0), (yyvsp[0].lex_str).str)); } } -#line 22338 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22392 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 365: -#line 4119 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4121 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->name= empty_lex_str; // Unlabeled blocks get an empty label } -#line 22346 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22400 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 366: -#line 4123 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4125 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 22352 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22406 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 367: -#line 4128 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4130 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (maybe_start_compound_statement(thd)) MYSQL_YYABORT; Lex->name= empty_lex_str; // Unlabeled blocks get an empty label } -#line 22362 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22416 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 368: -#line 4134 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4136 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 22368 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22422 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 369: -#line 4138 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4140 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_label *lab= lex->spcont->push_label(thd, lex->name, @@ -22377,11 +22431,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->spcont= lex->spcont->push_context(thd, sp_pcontext::REGULAR_SCOPE); } -#line 22381 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22435 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 370: -#line 4149 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4151 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -22408,11 +22462,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->spcont= ctx->pop_context(); (yyval.splabel) = lex->spcont->pop_label(); } -#line 22412 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22466 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 371: -#line 4179 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4181 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; uint ip= lex->sphead->instructions(); @@ -22423,11 +22477,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sphead->add_instr(i)) MYSQL_YYABORT; } -#line 22427 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22481 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 372: -#line 4193 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4195 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -22443,11 +22497,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (sp->restore_lex(thd)) MYSQL_YYABORT; } -#line 22447 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22501 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 373: -#line 4209 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4211 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; uint ip= lex->sphead->instructions(); @@ -22459,17 +22513,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; lex->sphead->do_cont_backpatch(); } -#line 22463 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22517 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 374: -#line 4224 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4226 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sphead->reset_lex(thd); } -#line 22469 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22523 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 375: -#line 4226 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4228 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; uint ip= lex->sphead->instructions(); @@ -22484,11 +22538,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); /* We can shortcut the cont_backpatch here */ i->m_cont_dest= ip+1; } -#line 22488 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22542 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 376: -#line 4244 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4246 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { sp_label *lab; Lex->sphead->backpatch(lab= Lex->spcont->pop_label()); @@ -22499,207 +22553,207 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); my_yyabort_error((ER_SP_LABEL_MISMATCH, MYF(0), (yyvsp[0].lex_str).str)); } } -#line 22503 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22557 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 377: -#line 4257 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4259 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { sp_label *lab; Lex->sphead->backpatch(lab= Lex->spcont->pop_label()); DBUG_ASSERT(lab->name.length == 0); } -#line 22513 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22567 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 378: -#line 4266 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4268 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (push_sp_label(thd, (yyvsp[-2].lex_str))) MYSQL_YYABORT; } -#line 22522 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22576 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 379: -#line 4271 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4273 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 22528 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22582 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 380: -#line 4273 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4275 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (push_sp_label(thd, (yyvsp[-2].lex_str))) MYSQL_YYABORT; Lex->sphead->reset_lex(thd); } -#line 22538 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22592 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 381: -#line 4279 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4281 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 22544 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22598 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 382: -#line 4281 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4283 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (push_sp_label(thd, (yyvsp[-2].lex_str))) MYSQL_YYABORT; } -#line 22553 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22607 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 383: -#line 4286 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4288 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 22559 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22613 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 384: -#line 4291 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4293 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (push_sp_empty_label(thd)) MYSQL_YYABORT; } -#line 22568 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22622 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 385: -#line 4297 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4299 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 22574 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22628 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 386: -#line 4299 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4301 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (push_sp_empty_label(thd)) MYSQL_YYABORT; Lex->sphead->reset_lex(thd); } -#line 22584 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22638 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 387: -#line 4306 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4308 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 22590 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22644 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 388: -#line 4308 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4310 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (push_sp_empty_label(thd)) MYSQL_YYABORT; } -#line 22599 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22653 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 389: -#line 4314 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4316 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 22605 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22659 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 390: -#line 4319 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4321 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->trg_chistics.action_time= TRG_ACTION_BEFORE; } -#line 22611 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22665 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 391: -#line 4321 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4323 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->trg_chistics.action_time= TRG_ACTION_AFTER; } -#line 22617 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22671 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 392: -#line 4326 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4328 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->trg_chistics.event= TRG_EVENT_INSERT; } -#line 22623 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22677 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 393: -#line 4328 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4330 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->trg_chistics.event= TRG_EVENT_UPDATE; } -#line 22629 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22683 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 394: -#line 4330 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4332 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->trg_chistics.event= TRG_EVENT_DELETE; } -#line 22635 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22689 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 398: -#line 4364 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4366 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 22641 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22695 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 399: -#line 4366 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4368 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->logfile_group_name= (yyvsp[0].lex_str).str; } -#line 22650 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22704 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 400: -#line 4376 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4378 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->alter_tablespace_info->ts_alter_tablespace_type= ALTER_TABLESPACE_ADD_FILE; } -#line 22658 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22712 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 401: -#line 4382 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4384 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->alter_tablespace_info->ts_alter_tablespace_type= ALTER_TABLESPACE_DROP_FILE; } -#line 22666 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22720 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 406: -#line 4405 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4407 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 22672 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22726 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 453: -#line 4499 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4501 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->data_file_name= (yyvsp[0].lex_str).str; } -#line 22681 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22735 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 454: -#line 4507 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4509 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->undo_file_name= (yyvsp[0].lex_str).str; } -#line 22690 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22744 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 455: -#line 4515 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4517 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->redo_file_name= (yyvsp[0].lex_str).str; } -#line 22699 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22753 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 456: -#line 4523 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4525 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info= (new (thd->mem_root) @@ -22709,11 +22763,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->alter_tablespace_info->tablespace_name= (yyvsp[0].lex_str).str; lex->sql_command= SQLCOM_ALTER_TABLESPACE; } -#line 22713 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22767 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 457: -#line 4536 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4538 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info= (new (thd->mem_root) @@ -22723,114 +22777,114 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->alter_tablespace_info->logfile_group_name= (yyvsp[0].lex_str).str; lex->sql_command= SQLCOM_ALTER_TABLESPACE; } -#line 22727 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22781 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 458: -#line 4549 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4551 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->ts_access_mode= TS_READ_ONLY; } -#line 22736 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22790 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 459: -#line 4554 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4556 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->ts_access_mode= TS_READ_WRITE; } -#line 22745 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22799 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 460: -#line 4559 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4561 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->ts_access_mode= TS_NOT_ACCESSIBLE; } -#line 22754 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22808 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 461: -#line 4567 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4569 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->initial_size= (yyvsp[0].ulonglong_number); } -#line 22763 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22817 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 462: -#line 4575 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4577 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->autoextend_size= (yyvsp[0].ulonglong_number); } -#line 22772 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22826 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 463: -#line 4583 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4585 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->max_size= (yyvsp[0].ulonglong_number); } -#line 22781 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22835 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 464: -#line 4591 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4593 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->extent_size= (yyvsp[0].ulonglong_number); } -#line 22790 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22844 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 465: -#line 4599 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4601 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->undo_buffer_size= (yyvsp[0].ulonglong_number); } -#line 22799 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22853 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 466: -#line 4607 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4609 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->redo_buffer_size= (yyvsp[0].ulonglong_number); } -#line 22808 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22862 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 467: -#line 4615 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4617 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->alter_tablespace_info->nodegroup_id != UNDEF_NODEGROUP) my_yyabort_error((ER_FILEGROUP_OPTION_ONLY_ONCE,MYF(0),"NODEGROUP")); lex->alter_tablespace_info->nodegroup_id= (yyvsp[0].ulong_num); } -#line 22819 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22873 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 468: -#line 4625 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4627 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->alter_tablespace_info->ts_comment != NULL) my_yyabort_error((ER_FILEGROUP_OPTION_ONLY_ONCE,MYF(0),"COMMENT")); lex->alter_tablespace_info->ts_comment= (yyvsp[0].lex_str).str; } -#line 22830 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22884 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 469: -#line 4635 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4637 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->alter_tablespace_info->storage_engine != NULL) @@ -22838,37 +22892,37 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); "STORAGE ENGINE")); lex->alter_tablespace_info->storage_engine= (yyvsp[0].db_type); } -#line 22842 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22896 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 472: -#line 4651 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4653 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->wait_until_completed= TRUE; } -#line 22851 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22905 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 473: -#line 4656 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4658 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (!(lex->alter_tablespace_info->wait_until_completed)) my_yyabort_error((ER_FILEGROUP_OPTION_ONLY_ONCE,MYF(0),"NO_WAIT")); lex->alter_tablespace_info->wait_until_completed= FALSE; } -#line 22862 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22916 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 474: -#line 4665 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4667 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulonglong_number)= (yyvsp[0].ulonglong_number);} -#line 22868 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22922 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 475: -#line 4667 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4669 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { ulonglong number; uint text_shift_number= 0; @@ -22899,41 +22953,41 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); my_yyabort_error((ER_WRONG_SIZE_NUMBER, MYF(0))); (yyval.ulonglong_number)= number; } -#line 22903 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22957 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 476: -#line 4705 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4707 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.option_list= NULL; } -#line 22909 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22963 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 477: -#line 4706 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4708 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 22915 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22969 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 478: -#line 4707 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4709 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 22921 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22975 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 479: -#line 4713 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4715 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->set_braces(1);} -#line 22927 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22981 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 480: -#line 4713 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4715 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 22933 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 22987 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 481: -#line 4715 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4717 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.add(DDL_options_st::OPT_LIKE); @@ -22944,53 +22998,53 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); /* CREATE TABLE ... LIKE is not allowed for views. */ src_table->required_type= FRMTYPE_TABLE; } -#line 22948 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23002 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 482: -#line 4728 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4730 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.table)= (yyvsp[0].table); } -#line 22954 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23008 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 483: -#line 4729 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4731 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.table)= (yyvsp[-1].table); } -#line 22960 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23014 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 484: -#line 4733 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4735 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 22966 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23020 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 485: -#line 4735 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4737 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->set_braces(0);} -#line 22972 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23026 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 486: -#line 4736 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4738 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 22978 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23032 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 487: -#line 4738 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4740 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->set_braces(1);} -#line 22984 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23038 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 488: -#line 4739 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4741 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 22990 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23044 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 489: -#line 4744 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4746 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* Remove all tables used in PARTITION clause from the global table @@ -23000,17 +23054,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); last_non_sel_table->next_global= 0; Lex->query_tables_last= &last_non_sel_table->next_global; } -#line 23004 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23058 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 490: -#line 4780 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4782 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23010 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23064 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 492: -#line 4786 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4788 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->part_info= new (thd->mem_root) partition_info(); @@ -23024,11 +23078,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->alter_info.flags|= Alter_info::ALTER_PARTITION; } } -#line 23028 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23082 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 494: -#line 4804 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4806 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { #ifdef WITH_PARTITION_STORAGE_ENGINE LEX_STRING partition_name={C_STRING_WITH_LEN("partition")}; @@ -23040,11 +23094,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); "--with-plugin-partition")); #endif } -#line 23044 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23098 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 495: -#line 4819 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4821 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (!lex->part_info) @@ -23057,82 +23111,82 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); partition info string into part_info data structure. */ } -#line 23061 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23115 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 496: -#line 4831 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4833 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23067 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23121 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 498: -#line 4840 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4842 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; part_info->list_of_part_fields= TRUE; part_info->column_list= FALSE; part_info->part_type= HASH_PARTITION; } -#line 23078 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23132 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 499: -#line 4847 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4849 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->part_info->part_type= HASH_PARTITION; } -#line 23084 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23138 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 500: -#line 4848 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4850 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23090 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23144 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 501: -#line 4850 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4852 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->part_info->part_type= RANGE_PARTITION; } -#line 23096 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23150 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 502: -#line 4852 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4854 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->part_info->part_type= RANGE_PARTITION; } -#line 23102 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23156 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 503: -#line 4854 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4856 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->part_info->part_type= LIST_PARTITION; } -#line 23108 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23162 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 504: -#line 4856 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4858 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->part_info->part_type= LIST_PARTITION; } -#line 23114 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23168 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 505: -#line 4860 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4862 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23120 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23174 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 506: -#line 4862 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4864 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->part_info->linear_hash_ind= TRUE;} -#line 23126 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23180 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 507: -#line 4867 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4869 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->part_info->key_algorithm= partition_info::KEY_ALGORITHM_NONE;} -#line 23132 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23186 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 508: -#line 4869 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4871 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { switch ((yyvsp[0].ulong_num)) { case 1: @@ -23146,35 +23200,35 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 23150 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23204 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 509: -#line 4885 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4887 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23156 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23210 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 510: -#line 4886 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4888 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23162 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23216 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 511: -#line 4890 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4892 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23168 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23222 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 512: -#line 4891 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4893 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23174 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23228 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 513: -#line 4896 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4898 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; part_info->num_columns++; @@ -23187,21 +23241,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); my_yyabort_error((ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR, MYF(0), "list of partition fields")); } -#line 23191 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23245 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 514: -#line 4912 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4914 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; part_info->column_list= TRUE; part_info->list_of_part_fields= TRUE; } -#line 23201 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23255 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 515: -#line 4922 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4924 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; if (part_info->set_part_expr((yyvsp[-3].simple_string)+1, (yyvsp[-2].item), (yyvsp[-1].simple_string), FALSE)) @@ -23209,26 +23263,26 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); part_info->num_columns= 1; part_info->column_list= FALSE; } -#line 23213 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23267 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 516: -#line 4933 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4935 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->part_info->set_part_expr((yyvsp[-3].simple_string)+1, (yyvsp[-2].item), (yyvsp[-1].simple_string), TRUE)) { MYSQL_YYABORT; } } -#line 23222 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23276 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 517: -#line 4941 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4943 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23228 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23282 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 518: -#line 4943 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4945 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { uint num_parts= (yyvsp[0].ulong_num); partition_info *part_info= Lex->part_info; @@ -23238,57 +23292,57 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); part_info->num_parts= num_parts; part_info->use_default_num_partitions= FALSE; } -#line 23242 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23296 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 519: -#line 4955 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4957 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23248 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23302 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 520: -#line 4957 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4959 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->part_info->subpart_type= HASH_PARTITION; } -#line 23254 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23308 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 521: -#line 4958 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4960 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23260 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23314 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 522: -#line 4961 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4963 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; part_info->subpart_type= HASH_PARTITION; part_info->list_of_subpart_fields= TRUE; } -#line 23270 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23324 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 523: -#line 4966 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4968 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23276 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23330 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 524: -#line 4970 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4972 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23282 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23336 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 525: -#line 4971 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4973 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23288 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23342 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 526: -#line 4976 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4978 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; if (part_info->subpart_field_list.push_back((yyvsp[0].lex_str).str, thd->mem_root)) @@ -23300,11 +23354,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); my_yyabort_error((ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR, MYF(0), "list of subpartition fields")); } -#line 23304 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23358 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 527: -#line 4991 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 4993 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; bool not_corr_func; @@ -23317,17 +23371,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } (yyval.item)=(yyvsp[0].item); } -#line 23321 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23375 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 528: -#line 5006 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5008 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23327 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23381 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 529: -#line 5008 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5010 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { uint num_parts= (yyvsp[0].ulong_num); LEX *lex= Lex; @@ -23336,11 +23390,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->part_info->num_subparts= num_parts; lex->part_info->use_default_num_subpartitions= FALSE; } -#line 23340 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23394 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 530: -#line 5020 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5022 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; if (part_info->part_type == RANGE_PARTITION) @@ -23350,11 +23404,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); my_yyabort_error((ER_PARTITIONS_MUST_BE_DEFINED_ERROR, MYF(0), "LIST")); } -#line 23354 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23408 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 531: -#line 5030 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5032 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; uint count_curr_parts= part_info->partitions.elements; @@ -23373,23 +23427,23 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } part_info->count_curr_subparts= 0; } -#line 23377 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23431 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 532: -#line 5051 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5053 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23383 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23437 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 533: -#line 5052 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5054 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23389 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23443 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 534: -#line 5057 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5059 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; partition_element *p_elem= new (thd->mem_root) partition_element(); @@ -23406,17 +23460,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); part_info->use_default_partitions= FALSE; part_info->use_default_num_partitions= FALSE; } -#line 23410 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23464 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 535: -#line 5077 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5079 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23416 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23470 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 536: -#line 5082 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5084 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; partition_element *p_elem= part_info->curr_part_elem; @@ -23424,31 +23478,27 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; p_elem->partition_name= (yyvsp[0].lex_str).str; } -#line 23428 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23482 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 537: -#line 5093 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5095 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; partition_info *part_info= lex->part_info; if (! lex->is_partition_management()) { - if (part_info->part_type == RANGE_PARTITION) - my_yyabort_error((ER_PARTITION_REQUIRES_VALUES_ERROR, MYF(0), - "RANGE", "LESS THAN")); - if (part_info->part_type == LIST_PARTITION) - my_yyabort_error((ER_PARTITION_REQUIRES_VALUES_ERROR, MYF(0), - "LIST", "IN")); + if (part_info->error_if_requires_values()) + MYSQL_YYABORT; } else part_info->part_type= HASH_PARTITION; } -#line 23448 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23498 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 538: -#line 5109 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5107 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; partition_info *part_info= lex->part_info; @@ -23461,17 +23511,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); else part_info->part_type= RANGE_PARTITION; } -#line 23465 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23515 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 539: -#line 5121 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5119 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23471 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23521 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 540: -#line 5123 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5121 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; partition_info *part_info= lex->part_info; @@ -23484,17 +23534,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); else part_info->part_type= LIST_PARTITION; } -#line 23488 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23538 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 541: -#line 5135 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5133 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23494 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23544 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 542: -#line 5140 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5138 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; @@ -23516,17 +23566,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 23520 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23570 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 543: -#line 5161 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5159 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23526 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23576 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 544: -#line 5166 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5164 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; partition_info *part_info= lex->part_info; @@ -23555,11 +23605,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } } } -#line 23559 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23609 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 545: -#line 5195 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5193 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; if (part_info->num_columns < 2U) @@ -23568,23 +23618,23 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 23572 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23622 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 546: -#line 5206 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5204 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23578 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23628 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 547: -#line 5207 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5205 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23584 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23634 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 548: -#line 5212 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5210 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; part_info->print_debug("( part_value_item", NULL); @@ -23596,17 +23646,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 23600 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23650 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 549: -#line 5223 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5221 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23606 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23656 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 550: -#line 5225 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5223 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; part_info->print_debug(") part_value_item", NULL); @@ -23627,23 +23677,23 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } part_info->curr_list_object= 0; } -#line 23631 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23681 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 551: -#line 5248 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5246 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23637 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23687 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 552: -#line 5249 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5247 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23643 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23693 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 553: -#line 5254 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5252 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; if (part_info->part_type == LIST_PARTITION) @@ -23656,11 +23706,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 23660 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23710 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 554: -#line 5267 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5265 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; partition_info *part_info= lex->part_info; @@ -23676,11 +23726,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 23680 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23730 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 555: -#line 5287 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5285 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; if (part_info->num_subparts != 0 && @@ -23694,11 +23744,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 23698 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23748 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 556: -#line 5301 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5299 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; if (part_info->num_subparts != 0) @@ -23721,23 +23771,23 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } part_info->count_curr_subparts= 0; } -#line 23725 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23775 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 557: -#line 5326 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5324 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23731 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23781 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 558: -#line 5327 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5325 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23737 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23787 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 559: -#line 5332 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5330 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; partition_element *curr_part= part_info->current_partition; @@ -23771,113 +23821,113 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); part_info->use_default_num_subpartitions= FALSE; part_info->count_curr_subparts++; } -#line 23775 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23825 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 560: -#line 5365 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5363 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23781 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23831 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 561: -#line 5370 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5368 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (check_ident_length(&(yyvsp[0].lex_str))) MYSQL_YYABORT; Lex->part_info->curr_part_elem->partition_name= (yyvsp[0].lex_str).str; } -#line 23791 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23841 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 562: -#line 5378 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5376 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23797 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23847 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 563: -#line 5379 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5377 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23803 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23853 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 564: -#line 5383 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5381 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23809 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23859 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 565: -#line 5384 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5382 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23815 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23865 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 566: -#line 5389 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5387 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->part_info->curr_part_elem->tablespace_name= (yyvsp[0].lex_str).str; } -#line 23821 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23871 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 567: -#line 5391 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5389 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; part_info->curr_part_elem->engine_type= (yyvsp[0].db_type); part_info->default_engine_type= (yyvsp[0].db_type); } -#line 23831 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23881 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 568: -#line 5397 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5395 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->part_info->curr_part_elem->connect_string.str= (yyvsp[0].lex_str).str; lex->part_info->curr_part_elem->connect_string.length= (yyvsp[0].lex_str).length; } -#line 23841 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23891 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 569: -#line 5403 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5401 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->part_info->curr_part_elem->nodegroup_id= (uint16) (yyvsp[0].ulong_num); } -#line 23847 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23897 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 570: -#line 5405 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5403 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->part_info->curr_part_elem->part_max_rows= (ha_rows) (yyvsp[0].ulonglong_number); } -#line 23853 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23903 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 571: -#line 5407 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5405 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->part_info->curr_part_elem->part_min_rows= (ha_rows) (yyvsp[0].ulonglong_number); } -#line 23859 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23909 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 572: -#line 5409 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5407 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->part_info->curr_part_elem->data_file_name= (yyvsp[0].lex_str).str; } -#line 23865 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23915 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 573: -#line 5411 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5409 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->part_info->curr_part_elem->index_file_name= (yyvsp[0].lex_str).str; } -#line 23871 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23921 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 574: -#line 5413 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5411 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->part_info->curr_part_elem->part_comment= (yyvsp[0].lex_str).str; } -#line 23877 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23927 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 575: -#line 5422 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5420 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (lex->sql_command == SQLCOM_INSERT) @@ -23892,19 +23942,19 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); mysql_init_select(lex); lex->current_select->parsing_place= SELECT_LIST; } -#line 23896 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23946 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 576: -#line 5437 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5435 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->parsing_place= NO_MATTER; } -#line 23904 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23954 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 577: -#line 5441 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5439 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* The following work only with the local list, the global list @@ -23912,170 +23962,170 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); */ Lex->current_select->table_list.push_front(&Lex->save_list); } -#line 23916 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23966 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 578: -#line 5451 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5449 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23922 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23972 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 579: -#line 5452 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5450 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23928 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23978 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 580: -#line 5456 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5454 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23934 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23984 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 581: -#line 5457 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5455 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23940 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23990 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 582: -#line 5461 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5459 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23946 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 23996 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 583: -#line 5462 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5460 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23952 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24002 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 584: -#line 5466 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5464 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23958 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24008 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 585: -#line 5467 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5465 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 23964 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24014 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 586: -#line 5472 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5470 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_exists= FALSE; } -#line 23972 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24022 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 587: -#line 5476 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5474 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_exists= TRUE; } -#line 23980 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24030 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 588: -#line 5483 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5481 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.object_ddl_options).init(); } -#line 23988 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24038 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 589: -#line 5487 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5485 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.object_ddl_options).set(DDL_options_st::OPT_IF_NOT_EXISTS); } -#line 23996 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24046 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 590: -#line 5494 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5492 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.object_ddl_options).init(); } -#line 24004 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24054 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 591: -#line 5498 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5496 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.object_ddl_options).set(DDL_options_st::OPT_OR_REPLACE); } -#line 24012 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24062 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 599: -#line 5521 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5519 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.db_type= (yyvsp[0].db_type); Lex->create_info.used_fields|= HA_CREATE_USED_ENGINE; } -#line 24021 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24071 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 600: -#line 5526 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5524 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.max_rows= (yyvsp[0].ulonglong_number); Lex->create_info.used_fields|= HA_CREATE_USED_MAX_ROWS; } -#line 24030 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24080 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 601: -#line 5531 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5529 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.min_rows= (yyvsp[0].ulonglong_number); Lex->create_info.used_fields|= HA_CREATE_USED_MIN_ROWS; } -#line 24039 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24089 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 602: -#line 5536 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5534 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.avg_row_length=(yyvsp[0].ulong_num); Lex->create_info.used_fields|= HA_CREATE_USED_AVG_ROW_LENGTH; } -#line 24048 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24098 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 603: -#line 5541 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5539 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.password=(yyvsp[0].lex_str).str; Lex->create_info.used_fields|= HA_CREATE_USED_PASSWORD; } -#line 24057 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24107 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 604: -#line 5546 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5544 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.comment=(yyvsp[0].lex_str); Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; } -#line 24066 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24116 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 605: -#line 5551 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5549 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.auto_increment_value=(yyvsp[0].ulonglong_number); Lex->create_info.used_fields|= HA_CREATE_USED_AUTO; } -#line 24075 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24125 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 606: -#line 5556 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5554 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { switch((yyvsp[0].ulong_num)) { case 0: @@ -24090,21 +24140,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } Lex->create_info.used_fields|= HA_CREATE_USED_PACK_KEYS; } -#line 24094 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24144 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 607: -#line 5571 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5569 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.table_options&= ~(HA_OPTION_PACK_KEYS | HA_OPTION_NO_PACK_KEYS); Lex->create_info.used_fields|= HA_CREATE_USED_PACK_KEYS; } -#line 24104 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24154 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 608: -#line 5577 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5575 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { switch((yyvsp[0].ulong_num)) { case 0: @@ -24119,20 +24169,20 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } Lex->create_info.used_fields|= HA_CREATE_USED_STATS_AUTO_RECALC; } -#line 24123 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24173 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 609: -#line 5592 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5590 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.stats_auto_recalc= HA_STATS_AUTO_RECALC_DEFAULT; Lex->create_info.used_fields|= HA_CREATE_USED_STATS_AUTO_RECALC; } -#line 24132 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24182 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 610: -#line 5597 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5595 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { switch((yyvsp[0].ulong_num)) { case 0: @@ -24147,21 +24197,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } Lex->create_info.used_fields|= HA_CREATE_USED_STATS_PERSISTENT; } -#line 24151 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24201 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 611: -#line 5612 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5610 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.table_options&= ~(HA_OPTION_STATS_PERSISTENT | HA_OPTION_NO_STATS_PERSISTENT); Lex->create_info.used_fields|= HA_CREATE_USED_STATS_PERSISTENT; } -#line 24161 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24211 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 612: -#line 5618 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5616 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* From user point of view STATS_SAMPLE_PAGES can be specified as STATS_SAMPLE_PAGES=N (where 0create_info.stats_sample_pages=(yyvsp[0].ulong_num); Lex->create_info.used_fields|= HA_CREATE_USED_STATS_SAMPLE_PAGES; } -#line 24183 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24233 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 613: -#line 5636 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5634 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.stats_sample_pages=0; Lex->create_info.used_fields|= HA_CREATE_USED_STATS_SAMPLE_PAGES; } -#line 24192 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24242 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 614: -#line 5641 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5639 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.table_options|= (yyvsp[0].ulong_num) ? HA_OPTION_CHECKSUM : HA_OPTION_NO_CHECKSUM; Lex->create_info.used_fields|= HA_CREATE_USED_CHECKSUM; } -#line 24201 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24251 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 615: -#line 5646 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5644 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.table_options|= (yyvsp[0].ulong_num) ? HA_OPTION_CHECKSUM : HA_OPTION_NO_CHECKSUM; Lex->create_info.used_fields|= HA_CREATE_USED_CHECKSUM; } -#line 24210 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24260 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 616: -#line 5651 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5649 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.used_fields|= HA_CREATE_USED_PAGE_CHECKSUM; Lex->create_info.page_checksum= (yyvsp[0].choice); } -#line 24219 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24269 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 617: -#line 5656 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5654 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.table_options|= (yyvsp[0].ulong_num) ? HA_OPTION_DELAY_KEY_WRITE : HA_OPTION_NO_DELAY_KEY_WRITE; Lex->create_info.used_fields|= HA_CREATE_USED_DELAY_KEY_WRITE; } -#line 24228 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24278 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 618: -#line 5661 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5659 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.row_type= (yyvsp[0].row_type); Lex->create_info.used_fields|= HA_CREATE_USED_ROW_FORMAT; } -#line 24237 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24287 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 619: -#line 5666 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5664 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->select_lex.table_list.save_and_clear(&Lex->save_list); } -#line 24245 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24295 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 620: -#line 5670 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5668 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* Move the union list to the merge_list and exclude its tables @@ -24267,84 +24317,84 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->create_info.used_fields|= HA_CREATE_USED_UNION; } -#line 24271 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24321 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 623: -#line 5694 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5692 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.merge_insert_method= (yyvsp[0].ulong_num); Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD; } -#line 24280 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24330 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 624: -#line 5699 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5697 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.data_file_name= (yyvsp[0].lex_str).str; Lex->create_info.used_fields|= HA_CREATE_USED_DATADIR; } -#line 24289 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24339 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 625: -#line 5704 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5702 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.index_file_name= (yyvsp[0].lex_str).str; Lex->create_info.used_fields|= HA_CREATE_USED_INDEXDIR; } -#line 24298 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24348 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 626: -#line 5709 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5707 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {Lex->create_info.tablespace= (yyvsp[0].lex_str).str;} -#line 24304 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24354 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 627: -#line 5711 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5709 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {Lex->create_info.storage_media= HA_SM_DISK;} -#line 24310 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24360 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 628: -#line 5713 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5711 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {Lex->create_info.storage_media= HA_SM_MEMORY;} -#line 24316 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24366 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 629: -#line 5715 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5713 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.connect_string.str= (yyvsp[0].lex_str).str; Lex->create_info.connect_string.length= (yyvsp[0].lex_str).length; Lex->create_info.used_fields|= HA_CREATE_USED_CONNECTION; } -#line 24326 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24376 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 630: -#line 5721 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5719 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.used_fields|= HA_CREATE_USED_KEY_BLOCK_SIZE; Lex->create_info.key_block_size= (yyvsp[0].ulong_num); } -#line 24335 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24385 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 631: -#line 5726 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5724 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.used_fields|= HA_CREATE_USED_TRANSACTIONAL; Lex->create_info.transactional= (yyvsp[0].choice); } -#line 24344 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24394 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 632: -#line 5731 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5729 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if ((yyvsp[0].lex_str).length > ENGINE_OPTION_MAX_LENGTH) my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), (yyvsp[-2].lex_str).str)); @@ -24352,11 +24402,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); engine_option_value((yyvsp[-2].lex_str), (yyvsp[0].lex_str), true, &Lex->create_info.option_list, &Lex->option_list_last); } -#line 24356 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24406 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 633: -#line 5739 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5737 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if ((yyvsp[0].lex_str).length > ENGINE_OPTION_MAX_LENGTH) my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), (yyvsp[-2].lex_str).str)); @@ -24364,40 +24414,40 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); engine_option_value((yyvsp[-2].lex_str), (yyvsp[0].lex_str), false, &Lex->create_info.option_list, &Lex->option_list_last); } -#line 24368 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24418 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 634: -#line 5747 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5745 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { new (thd->mem_root) engine_option_value((yyvsp[-2].lex_str), (yyvsp[0].ulonglong_number), &Lex->create_info.option_list, &Lex->option_list_last, thd->mem_root); } -#line 24378 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24428 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 635: -#line 5753 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5751 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { new (thd->mem_root) engine_option_value((yyvsp[-2].lex_str), &Lex->create_info.option_list, &Lex->option_list_last); } -#line 24388 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24438 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 636: -#line 5762 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5760 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->create_info.add_table_option_default_charset((yyvsp[0].charset))) MYSQL_YYABORT; } -#line 24397 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24447 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 637: -#line 5770 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5768 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { HA_CREATE_INFO *cinfo= &Lex->create_info; if ((cinfo->used_fields & HA_CREATE_USED_DEFAULT_CHARSET) && @@ -24411,11 +24461,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Lex->create_info.default_table_charset= (yyvsp[0].charset); Lex->create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET; } -#line 24415 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24465 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 638: -#line 5787 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5785 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { plugin_ref plugin= ha_resolve_by_name(thd, &(yyvsp[0].lex_str), thd->lex->create_info.tmp_table()); @@ -24433,11 +24483,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyvsp[0].lex_str).str); } } -#line 24437 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24487 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 639: -#line 5808 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5806 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { plugin_ref plugin; if ((plugin= ha_resolve_by_name(thd, &(yyvsp[0].lex_str), false))) @@ -24445,199 +24495,199 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); else my_yyabort_error((ER_UNKNOWN_STORAGE_ENGINE, MYF(0), (yyvsp[0].lex_str).str)); } -#line 24449 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24499 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 640: -#line 5818 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5816 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.row_type)= ROW_TYPE_DEFAULT; } -#line 24455 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24505 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 641: -#line 5819 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5817 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.row_type)= ROW_TYPE_FIXED; } -#line 24461 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24511 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 642: -#line 5820 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5818 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.row_type)= ROW_TYPE_DYNAMIC; } -#line 24467 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24517 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 643: -#line 5821 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5819 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.row_type)= ROW_TYPE_COMPRESSED; } -#line 24473 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24523 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 644: -#line 5822 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5820 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.row_type)= ROW_TYPE_REDUNDANT; } -#line 24479 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24529 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 645: -#line 5823 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5821 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.row_type)= ROW_TYPE_COMPACT; } -#line 24485 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24535 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 646: -#line 5824 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5822 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.row_type)= ROW_TYPE_PAGE; } -#line 24491 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24541 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 647: -#line 5828 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5826 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= MERGE_INSERT_DISABLED; } -#line 24497 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24547 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 648: -#line 5829 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5827 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= MERGE_INSERT_TO_FIRST; } -#line 24503 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24553 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 649: -#line 5830 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5828 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= MERGE_INSERT_TO_LAST; } -#line 24509 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24559 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 650: -#line 5834 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5832 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {(yyval.num) = (int) STRING_RESULT; } -#line 24515 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24565 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 651: -#line 5835 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5833 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {(yyval.num) = (int) REAL_RESULT; } -#line 24521 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24571 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 652: -#line 5836 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5834 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {(yyval.num) = (int) DECIMAL_RESULT; } -#line 24527 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24577 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 653: -#line 5837 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5835 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {(yyval.num) = (int) INT_RESULT; } -#line 24533 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24583 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 654: -#line 5843 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5841 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_last_non_select_table= Lex->last_table(); } -#line 24541 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24591 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 661: -#line 5865 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5863 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->option_list= NULL; if (Lex->add_key(Key::MULTIPLE, (yyvsp[-1].lex_str), (yyvsp[0].key_alg), (yyvsp[-2].object_ddl_options))) MYSQL_YYABORT; } -#line 24551 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24601 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 662: -#line 5870 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5868 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 24557 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24607 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 663: -#line 5872 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5870 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->option_list= NULL; if (Lex->add_key(Key::MULTIPLE, (yyvsp[-2].lex_str), (yyvsp[0].key_alg), (yyvsp[-3].object_ddl_options))) MYSQL_YYABORT; } -#line 24567 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24617 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 664: -#line 5877 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5875 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 24573 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24623 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 665: -#line 5879 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5877 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->option_list= NULL; if (Lex->add_key((yyvsp[-3].key_type), (yyvsp[0].lex_str), HA_KEY_ALG_UNDEF, (yyvsp[-1].object_ddl_options))) MYSQL_YYABORT; } -#line 24583 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24633 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 666: -#line 5884 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5882 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 24589 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24639 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 667: -#line 5886 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5884 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->option_list= NULL; if (Lex->add_key((yyvsp[-3].key_type), (yyvsp[0].lex_str), HA_KEY_ALG_UNDEF, (yyvsp[-1].object_ddl_options))) MYSQL_YYABORT; } -#line 24599 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24649 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 668: -#line 5891 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5889 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 24605 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24655 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 669: -#line 5895 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5893 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->option_list= NULL; if (Lex->add_key((yyvsp[-3].key_type), (yyvsp[-1].lex_str).str ? (yyvsp[-1].lex_str) : (yyvsp[-4].lex_str), (yyvsp[0].key_alg), (yyvsp[-2].object_ddl_options))) MYSQL_YYABORT; } -#line 24615 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24665 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 670: -#line 5900 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5898 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 24621 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24671 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 671: -#line 5903 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5901 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->option_list= NULL; if (Lex->add_key((yyvsp[-4].key_type), (yyvsp[-2].lex_str).str ? (yyvsp[-2].lex_str) : (yyvsp[-5].lex_str), (yyvsp[0].key_alg), (yyvsp[-3].object_ddl_options))) MYSQL_YYABORT; } -#line 24631 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24681 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 672: -#line 5908 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5906 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 24637 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24687 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 673: -#line 5910 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5908 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->check_add_key((yyvsp[-1].object_ddl_options)) || !(Lex->last_key= (new (thd->mem_root) @@ -24646,11 +24696,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; Lex->option_list= NULL; } -#line 24650 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24700 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 674: -#line 5919 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5917 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; Key *key= (new (thd->mem_root) @@ -24676,35 +24726,35 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); /* Only used for ALTER TABLE. Ignored otherwise. */ lex->alter_info.flags|= Alter_info::ADD_FOREIGN_KEY; } -#line 24680 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24730 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 675: -#line 5944 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5942 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 24686 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24736 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 679: -#line 5957 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5955 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)= null_lex_str; } -#line 24692 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24742 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 680: -#line 5958 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5956 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)= (yyvsp[0].lex_str); } -#line 24698 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24748 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 681: -#line 5962 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5960 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)=(yyvsp[0].lex_str); } -#line 24704 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24754 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 682: -#line 5967 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5965 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; Create_field *f= new (thd->mem_root) Create_field(); @@ -24718,17 +24768,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->init_last_field(f, (yyvsp[0].lex_str).str, NULL); } -#line 24722 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24772 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 683: -#line 5980 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5978 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->set_last_field_type((yyvsp[0].field_type)); } -#line 24728 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24778 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 684: -#line 5982 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 5980 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; Create_field *f= lex->last_field; @@ -24743,91 +24793,91 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); else if (f->flags & (UNIQUE_FLAG | UNIQUE_KEY_FLAG)) add_key_to_list(lex, &(yyvsp[-4].lex_str), Key::UNIQUE, Lex->check_exists); } -#line 24747 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24797 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 687: -#line 6006 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6004 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 24753 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24803 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 688: -#line 6007 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6005 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 24759 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24809 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 689: -#line 6012 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6010 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_field->vcol_info->set_stored_in_db_flag(FALSE); } -#line 24767 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24817 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 690: -#line 6016 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6014 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_field->vcol_info->set_stored_in_db_flag(FALSE); } -#line 24775 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24825 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 691: -#line 6020 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6018 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_field->vcol_info->set_stored_in_db_flag(TRUE); } -#line 24783 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24833 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 692: -#line 6026 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6024 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 24789 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24839 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 693: -#line 6027 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6025 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 24795 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24845 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 694: -#line 6031 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6029 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 24801 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24851 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 696: -#line 6037 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6035 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->last_field->flags|= UNIQUE_FLAG; lex->alter_info.flags|= Alter_info::ALTER_ADD_INDEX; } -#line 24811 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24861 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 697: -#line 6043 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6041 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->last_field->flags|= UNIQUE_FLAG; lex->alter_info.flags|= Alter_info::ALTER_ADD_INDEX; } -#line 24821 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24871 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 698: -#line 6048 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6046 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_field->comment= (yyvsp[0].lex_str); } -#line 24827 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24877 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 699: -#line 6053 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6051 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* "PARSE_VCOL_EXPR" can only be used by the SQL server @@ -24837,11 +24887,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (!Lex->parse_vcol_expr) my_yyabort_error((ER_SYNTAX_ERROR, MYF(0))); } -#line 24841 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24891 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 700: -#line 6066 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6064 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Virtual_column_info *v= new (thd->mem_root) Virtual_column_info(); if (!v) @@ -24855,23 +24905,23 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); v->expr_item= (yyvsp[-1].item); Lex->last_field->vcol_info= v; } -#line 24859 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24909 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 701: -#line 6082 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6080 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=(yyvsp[-2].field_type); } -#line 24865 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24915 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 702: -#line 6083 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6081 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=(yyvsp[-2].field_type); } -#line 24871 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24921 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 703: -#line 6085 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6083 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_FLOAT; if (Lex->length && !Lex->dec) @@ -24886,127 +24936,127 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Lex->length= 0; } } -#line 24890 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24940 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 704: -#line 6100 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6098 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->length= (char*) "1"; (yyval.field_type)=MYSQL_TYPE_BIT; } -#line 24899 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24949 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 705: -#line 6105 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6103 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_BIT; } -#line 24907 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24957 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 706: -#line 6109 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6107 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->length= (char*) "1"; (yyval.field_type)=MYSQL_TYPE_TINY; } -#line 24916 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24966 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 707: -#line 6114 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6112 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->length= (char*) "1"; (yyval.field_type)=MYSQL_TYPE_TINY; } -#line 24925 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24975 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 708: -#line 6119 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6117 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_STRING; } -#line 24933 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24983 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 709: -#line 6123 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6121 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->length= (char*) "1"; (yyval.field_type)=MYSQL_TYPE_STRING; } -#line 24942 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 24992 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 710: -#line 6128 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6126 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_STRING; bincmp_collation(national_charset_info, (yyvsp[0].num)); } -#line 24951 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25001 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 711: -#line 6133 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6131 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->length= (char*) "1"; (yyval.field_type)=MYSQL_TYPE_STRING; bincmp_collation(national_charset_info, (yyvsp[0].num)); } -#line 24961 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25011 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 712: -#line 6139 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6137 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->charset=&my_charset_bin; (yyval.field_type)=MYSQL_TYPE_STRING; } -#line 24970 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25020 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 713: -#line 6144 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6142 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->length= (char*) "1"; Lex->charset=&my_charset_bin; (yyval.field_type)=MYSQL_TYPE_STRING; } -#line 24980 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25030 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 714: -#line 6150 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6148 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)= MYSQL_TYPE_VARCHAR; } -#line 24988 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25038 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 715: -#line 6154 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6152 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)= MYSQL_TYPE_VARCHAR; bincmp_collation(national_charset_info, (yyvsp[0].num)); } -#line 24997 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25047 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 716: -#line 6159 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6157 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->charset=&my_charset_bin; (yyval.field_type)= MYSQL_TYPE_VARCHAR; } -#line 25006 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25056 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 717: -#line 6164 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6162 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->length) { @@ -25024,24 +25074,24 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } (yyval.field_type)=MYSQL_TYPE_YEAR; } -#line 25028 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25078 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 718: -#line 6182 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6180 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_DATE; } -#line 25034 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25084 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 719: -#line 6184 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6182 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)= opt_mysql56_temporal_format ? MYSQL_TYPE_TIME2 : MYSQL_TYPE_TIME; } -#line 25041 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25091 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 720: -#line 6187 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6185 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (thd->variables.sql_mode & MODE_MAXDB) (yyval.field_type)= opt_mysql56_temporal_format ? @@ -25058,36 +25108,36 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); : MYSQL_TYPE_TIMESTAMP; } } -#line 25062 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25112 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 721: -#line 6204 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6202 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)= opt_mysql56_temporal_format ? MYSQL_TYPE_DATETIME2 : MYSQL_TYPE_DATETIME; } -#line 25069 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25119 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 722: -#line 6207 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6205 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->charset=&my_charset_bin; (yyval.field_type)=MYSQL_TYPE_TINY_BLOB; } -#line 25078 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25128 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 723: -#line 6212 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6210 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->charset=&my_charset_bin; (yyval.field_type)=MYSQL_TYPE_BLOB; } -#line 25087 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25137 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 724: -#line 6217 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6215 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { #ifdef HAVE_SPATIAL Lex->charset=&my_charset_bin; @@ -25098,519 +25148,519 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); sym_group_geom.needed_define)); #endif } -#line 25102 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25152 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 725: -#line 6228 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6226 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->charset=&my_charset_bin; (yyval.field_type)=MYSQL_TYPE_MEDIUM_BLOB; } -#line 25111 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25161 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 726: -#line 6233 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6231 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->charset=&my_charset_bin; (yyval.field_type)=MYSQL_TYPE_LONG_BLOB; } -#line 25120 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25170 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 727: -#line 6238 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6236 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->charset=&my_charset_bin; (yyval.field_type)=MYSQL_TYPE_MEDIUM_BLOB; } -#line 25129 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25179 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 728: -#line 6243 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6241 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_MEDIUM_BLOB; } -#line 25135 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25185 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 729: -#line 6245 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6243 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_TINY_BLOB; } -#line 25141 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25191 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 730: -#line 6247 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6245 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_BLOB; } -#line 25147 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25197 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 731: -#line 6249 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6247 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_MEDIUM_BLOB; } -#line 25153 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25203 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 732: -#line 6251 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6249 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_LONG_BLOB; } -#line 25159 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25209 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 733: -#line 6253 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6251 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_NEWDECIMAL;} -#line 25165 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25215 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 734: -#line 6255 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6253 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_NEWDECIMAL;} -#line 25171 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25221 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 735: -#line 6257 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6255 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_NEWDECIMAL;} -#line 25177 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25227 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 736: -#line 6259 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6257 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_ENUM; } -#line 25183 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25233 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 737: -#line 6261 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6259 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_SET; } -#line 25189 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25239 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 738: -#line 6263 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6261 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_MEDIUM_BLOB; } -#line 25195 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25245 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 739: -#line 6265 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6263 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_LONGLONG; Lex->last_field->flags|= (AUTO_INCREMENT_FLAG | NOT_NULL_FLAG | UNSIGNED_FLAG | UNIQUE_FLAG); } -#line 25205 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25255 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 740: -#line 6273 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6271 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.geom_type)= Field::GEOM_GEOMETRY; } -#line 25211 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25261 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 741: -#line 6274 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6272 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.geom_type)= Field::GEOM_GEOMETRYCOLLECTION; } -#line 25217 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25267 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 742: -#line 6276 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6274 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->length= const_cast(STRINGIFY_ARG (MAX_LEN_GEOM_POINT_FIELD)); (yyval.geom_type)= Field::GEOM_POINT; } -#line 25227 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25277 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 743: -#line 6281 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6279 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.geom_type)= Field::GEOM_MULTIPOINT; } -#line 25233 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25283 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 744: -#line 6282 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6280 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.geom_type)= Field::GEOM_LINESTRING; } -#line 25239 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25289 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 745: -#line 6283 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6281 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.geom_type)= Field::GEOM_MULTILINESTRING; } -#line 25245 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25295 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 746: -#line 6284 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6282 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.geom_type)= Field::GEOM_POLYGON; } -#line 25251 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25301 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 747: -#line 6285 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6283 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.geom_type)= Field::GEOM_MULTIPOLYGON; } -#line 25257 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25307 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 748: -#line 6289 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6287 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25263 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25313 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 749: -#line 6293 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6291 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25269 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25319 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 750: -#line 6294 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6292 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25275 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25325 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 751: -#line 6298 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6296 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25281 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25331 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 752: -#line 6299 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6297 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25287 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25337 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 753: -#line 6303 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6301 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25293 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25343 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 754: -#line 6304 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6302 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25299 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25349 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 755: -#line 6305 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6303 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25305 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25355 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 756: -#line 6306 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6304 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25311 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25361 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 757: -#line 6307 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6305 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25317 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25367 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 758: -#line 6311 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6309 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_LONG; } -#line 25323 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25373 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 759: -#line 6312 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6310 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_TINY; } -#line 25329 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25379 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 760: -#line 6313 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6311 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_SHORT; } -#line 25335 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25385 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 761: -#line 6314 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6312 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_INT24; } -#line 25341 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25391 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 762: -#line 6315 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6313 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_LONGLONG; } -#line 25347 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25397 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 763: -#line 6320 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6318 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)= thd->variables.sql_mode & MODE_REAL_AS_FLOAT ? MYSQL_TYPE_FLOAT : MYSQL_TYPE_DOUBLE; } -#line 25356 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25406 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 764: -#line 6325 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6323 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_DOUBLE; } -#line 25362 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25412 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 765: -#line 6327 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6325 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)=MYSQL_TYPE_DOUBLE; } -#line 25368 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25418 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 766: -#line 6332 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6330 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_field->srid= 0; } -#line 25374 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25424 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 767: -#line 6335 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6333 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_field->srid=atoi((yyvsp[0].lex_str).str); } -#line 25382 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25432 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 768: -#line 6342 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6340 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->dec=Lex->length= (char*)0; } -#line 25388 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25438 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 769: -#line 6344 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6342 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->dec= (char*)0; } -#line 25394 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25444 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 770: -#line 6346 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6344 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25400 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25450 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 771: -#line 6351 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6349 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->length=(yyvsp[-3].lex_str).str; lex->dec=(yyvsp[-1].lex_str).str; } -#line 25410 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25460 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 772: -#line 6359 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6357 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25416 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25466 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 773: -#line 6360 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6358 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25422 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25472 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 774: -#line 6364 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6362 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25428 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25478 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 775: -#line 6365 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6363 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25434 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25484 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 776: -#line 6369 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6367 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25440 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25490 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 777: -#line 6370 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6368 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_field->flags|= UNSIGNED_FLAG;} -#line 25446 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25496 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 778: -#line 6371 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6369 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_field->flags|= UNSIGNED_FLAG | ZEROFILL_FLAG; } -#line 25452 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25502 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 779: -#line 6375 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6373 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->length= (yyvsp[-1].lex_str).str; } -#line 25458 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25508 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 780: -#line 6376 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6374 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->length= (yyvsp[-1].lex_str).str; } -#line 25464 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25514 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 781: -#line 6377 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6375 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->length= (yyvsp[-1].lex_str).str; } -#line 25470 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25520 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 782: -#line 6378 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6376 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->length= (yyvsp[-1].lex_str).str; } -#line 25476 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25526 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 783: -#line 6381 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6379 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->length=(char*) 0; /* use default length */ } -#line 25482 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25532 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 784: -#line 6382 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6380 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 25488 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25538 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 785: -#line 6386 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6384 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25494 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25544 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 786: -#line 6387 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6385 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25500 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25550 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 787: -#line 6391 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6389 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25506 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25556 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 788: -#line 6392 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6390 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25512 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25562 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 789: -#line 6396 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6394 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25518 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25568 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 791: -#line 6401 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6399 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_field->flags&= ~ NOT_NULL_FLAG; } -#line 25524 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25574 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 792: -#line 6402 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6400 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_field->flags|= NOT_NULL_FLAG; } -#line 25530 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25580 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 793: -#line 6403 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6401 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_field->def= (yyvsp[0].item); } -#line 25536 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25586 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 794: -#line 6405 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6403 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item *item= new (thd->mem_root) Item_func_now_local(thd, (yyvsp[0].num)); if (item == NULL) MYSQL_YYABORT; Lex->last_field->on_update= item; } -#line 25547 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25597 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 795: -#line 6411 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6409 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_field->flags|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG; } -#line 25553 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25603 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 796: -#line 6413 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6411 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->last_field->flags|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG | UNIQUE_FLAG; lex->alter_info.flags|= Alter_info::ALTER_ADD_INDEX; } -#line 25563 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25613 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 797: -#line 6419 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6417 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->last_field->flags|= PRI_KEY_FLAG | NOT_NULL_FLAG; lex->alter_info.flags|= Alter_info::ALTER_ADD_INDEX; } -#line 25573 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25623 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 798: -#line 6425 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6423 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->last_field->flags|= UNIQUE_FLAG; lex->alter_info.flags|= Alter_info::ALTER_ADD_INDEX; } -#line 25583 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25633 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 799: -#line 6431 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6429 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->last_field->flags|= UNIQUE_KEY_FLAG; lex->alter_info.flags|= Alter_info::ALTER_ADD_INDEX; } -#line 25593 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25643 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 800: -#line 6436 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6434 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_field->comment= (yyvsp[0].lex_str); } -#line 25599 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25649 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 801: -#line 6438 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6436 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->charset && !my_charset_same(Lex->charset,(yyvsp[0].charset))) my_yyabort_error((ER_COLLATION_CHARSET_MISMATCH, MYF(0), (yyvsp[0].charset)->name,Lex->charset->csname)); Lex->last_field->charset= (yyvsp[0].charset); } -#line 25610 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25660 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 802: -#line 6445 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6443 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if ((yyvsp[0].lex_str).length > ENGINE_OPTION_MAX_LENGTH) my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), (yyvsp[-2].lex_str).str)); @@ -25618,11 +25668,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); engine_option_value((yyvsp[-2].lex_str), (yyvsp[0].lex_str), true, &Lex->last_field->option_list, &Lex->option_list_last); } -#line 25622 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25672 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 803: -#line 6453 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6451 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if ((yyvsp[0].lex_str).length > ENGINE_OPTION_MAX_LENGTH) my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), (yyvsp[-2].lex_str).str)); @@ -25630,30 +25680,30 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); engine_option_value((yyvsp[-2].lex_str), (yyvsp[0].lex_str), false, &Lex->last_field->option_list, &Lex->option_list_last); } -#line 25634 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25684 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 804: -#line 6461 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6459 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { new (thd->mem_root) engine_option_value((yyvsp[-2].lex_str), (yyvsp[0].ulonglong_number), &Lex->last_field->option_list, &Lex->option_list_last, thd->mem_root); } -#line 25644 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25694 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 805: -#line 6467 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6465 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { new (thd->mem_root) engine_option_value((yyvsp[-2].lex_str), &Lex->last_field->option_list, &Lex->option_list_last); } -#line 25653 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25703 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 806: -#line 6476 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6474 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.field_type)= (yyvsp[-1].field_type); @@ -25664,214 +25714,214 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } Lex->set_last_field_type((yyvsp[-1].field_type)); } -#line 25668 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25718 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 807: -#line 6491 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6489 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_now_local(thd, (yyvsp[0].num)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 25678 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25728 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 808: -#line 6497 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6495 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)=(yyvsp[0].item); } -#line 25684 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25734 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 809: -#line 6501 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6499 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25690 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25740 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 810: -#line 6502 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6500 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25696 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25746 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 811: -#line 6507 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6505 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!((yyval.charset)=get_charset_by_csname((yyvsp[0].lex_str).str,MY_CS_PRIMARY,MYF(0)))) my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), (yyvsp[0].lex_str).str)); } -#line 25705 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25755 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 812: -#line 6511 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6509 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.charset)= &my_charset_bin; } -#line 25711 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25761 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 813: -#line 6515 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6513 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.charset)=(yyvsp[0].charset); } -#line 25717 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25767 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 814: -#line 6516 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6514 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.charset)=NULL; } -#line 25723 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25773 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 815: -#line 6520 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6518 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.charset)= NULL; } -#line 25729 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25779 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 816: -#line 6521 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6519 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.charset)= (yyvsp[0].charset); } -#line 25735 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25785 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 817: -#line 6526 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6524 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!((yyval.charset)=get_charset_by_csname((yyvsp[0].lex_str).str,MY_CS_PRIMARY,MYF(0))) && !((yyval.charset)=get_old_charset_by_name((yyvsp[0].lex_str).str))) my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), (yyvsp[0].lex_str).str)); } -#line 25745 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25795 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 818: -#line 6531 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6529 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.charset)= &my_charset_bin; } -#line 25751 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25801 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 819: -#line 6535 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6533 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.charset)=(yyvsp[0].charset); } -#line 25757 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25807 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 820: -#line 6536 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6534 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.charset)=NULL; } -#line 25763 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25813 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 821: -#line 6541 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6539 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!((yyval.charset)= mysqld_collation_get_by_name((yyvsp[0].lex_str).str))) MYSQL_YYABORT; } -#line 25772 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25822 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 822: -#line 6548 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6546 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.charset)=NULL; } -#line 25778 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25828 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 823: -#line 6549 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6547 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.charset)=(yyvsp[0].charset); } -#line 25784 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25834 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 824: -#line 6553 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6551 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.charset)=(yyvsp[0].charset); } -#line 25790 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25840 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 825: -#line 6554 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6552 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.charset)=NULL; } -#line 25796 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25846 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 826: -#line 6558 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6556 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25802 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25852 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 827: -#line 6559 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6557 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 25808 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25858 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 828: -#line 6563 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6561 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.charset)= (yyvsp[0].charset); } -#line 25814 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25864 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 829: -#line 6564 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6562 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.charset)= &my_charset_latin1; } -#line 25820 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25870 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 830: -#line 6566 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6564 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!((yyval.charset)= get_charset_by_csname("ucs2", MY_CS_PRIMARY,MYF(0)))) my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), "ucs2")); } -#line 25829 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25879 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 831: -#line 6573 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6571 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { bincmp_collation(NULL, false); } -#line 25835 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25885 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 832: -#line 6574 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6572 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { bincmp_collation(&my_charset_bin, false); } -#line 25841 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25891 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 833: -#line 6575 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6573 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { bincmp_collation((yyvsp[-1].charset), (yyvsp[0].num)); } -#line 25847 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25897 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 834: -#line 6576 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6574 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { bincmp_collation(NULL, true); } -#line 25853 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25903 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 835: -#line 6577 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6575 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { bincmp_collation((yyvsp[0].charset), true); } -#line 25859 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25909 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 836: -#line 6581 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6579 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= false; } -#line 25865 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25915 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 837: -#line 6582 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6580 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= true; } -#line 25871 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25921 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 838: -#line 6587 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6585 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if ((yyvsp[0].ulong_num) == 0) { @@ -25879,148 +25929,148 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 25883 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25933 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 839: -#line 6595 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6593 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= (yyvsp[-2].ulong_num); } -#line 25889 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25939 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 840: -#line 6599 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6597 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= 0; } -#line 25895 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25945 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 841: -#line 6600 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6598 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= 1 << MY_STRXFRM_DESC_SHIFT; } -#line 25901 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25951 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 842: -#line 6604 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6602 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= 1 << MY_STRXFRM_REVERSE_SHIFT; } -#line 25907 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25957 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 843: -#line 6607 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6605 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= 0; } -#line 25913 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25963 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 844: -#line 6608 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6606 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= (yyvsp[0].ulong_num); } -#line 25919 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25969 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 845: -#line 6609 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6607 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= (yyvsp[-1].ulong_num) | (yyvsp[0].ulong_num); } -#line 25925 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25975 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 846: -#line 6610 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6608 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= (yyvsp[0].ulong_num) ; } -#line 25931 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25981 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 847: -#line 6615 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6613 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= (yyvsp[0].ulong_num) < 1 ? 1 : ((yyvsp[0].ulong_num) > MY_STRXFRM_NLEVELS ? MY_STRXFRM_NLEVELS : (yyvsp[0].ulong_num)); (yyval.ulong_num)--; } -#line 25940 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25990 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 848: -#line 6623 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6621 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= (1 | (yyvsp[0].ulong_num)) << (yyvsp[-1].ulong_num); } -#line 25948 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 25998 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 849: -#line 6629 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6627 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= (yyvsp[0].ulong_num); } -#line 25954 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26004 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 850: -#line 6630 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6628 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)|= (yyvsp[0].ulong_num); } -#line 25960 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26010 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 851: -#line 6635 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6633 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { uint start= (yyvsp[-2].ulong_num); uint end= (yyvsp[0].ulong_num); for ((yyval.ulong_num)= 0; start <= end; start++) (yyval.ulong_num)|= (1 << start); } -#line 25971 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26021 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 852: -#line 6644 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6642 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= (yyvsp[0].ulong_num); } -#line 25977 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26027 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 853: -#line 6645 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6643 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= (yyvsp[0].ulong_num); } -#line 25983 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26033 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 854: -#line 6649 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6647 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= 0; } -#line 25989 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26039 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 855: -#line 6650 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6648 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= (yyvsp[0].ulong_num); } -#line 25995 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26045 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 858: -#line 6664 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6662 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.table)=(yyvsp[-3].table); } -#line 26003 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26053 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 859: -#line 6671 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6669 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ref_list.empty(); } -#line 26009 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26059 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 861: -#line 6677 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6675 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Key_part_spec *key= new (thd->mem_root) Key_part_spec((yyvsp[0].lex_str), 0); if (key == NULL) MYSQL_YYABORT; Lex->ref_list.push_back(key, thd->mem_root); } -#line 26020 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26070 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 862: -#line 6684 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6682 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Key_part_spec *key= new (thd->mem_root) Key_part_spec((yyvsp[0].lex_str), 0); if (key == NULL) @@ -26029,181 +26079,181 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->ref_list.empty(); lex->ref_list.push_back(key, thd->mem_root); } -#line 26033 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26083 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 863: -#line 6696 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6694 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->fk_match_option= Foreign_key::FK_MATCH_UNDEF; } -#line 26039 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26089 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 864: -#line 6698 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6696 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->fk_match_option= Foreign_key::FK_MATCH_FULL; } -#line 26045 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26095 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 865: -#line 6700 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6698 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->fk_match_option= Foreign_key::FK_MATCH_PARTIAL; } -#line 26051 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26101 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 866: -#line 6702 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6700 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->fk_match_option= Foreign_key::FK_MATCH_SIMPLE; } -#line 26057 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26107 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 867: -#line 6707 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6705 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->fk_update_opt= Foreign_key::FK_OPTION_UNDEF; lex->fk_delete_opt= Foreign_key::FK_OPTION_UNDEF; } -#line 26067 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26117 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 868: -#line 6713 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6711 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->fk_update_opt= (yyvsp[0].m_fk_option); lex->fk_delete_opt= Foreign_key::FK_OPTION_UNDEF; } -#line 26077 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26127 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 869: -#line 6719 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6717 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->fk_update_opt= Foreign_key::FK_OPTION_UNDEF; lex->fk_delete_opt= (yyvsp[0].m_fk_option); } -#line 26087 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26137 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 870: -#line 6726 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6724 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->fk_update_opt= (yyvsp[-3].m_fk_option); lex->fk_delete_opt= (yyvsp[0].m_fk_option); } -#line 26097 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26147 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 871: -#line 6733 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6731 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->fk_update_opt= (yyvsp[0].m_fk_option); lex->fk_delete_opt= (yyvsp[-3].m_fk_option); } -#line 26107 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26157 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 872: -#line 6741 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6739 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.m_fk_option)= Foreign_key::FK_OPTION_RESTRICT; } -#line 26113 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26163 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 873: -#line 6742 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6740 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.m_fk_option)= Foreign_key::FK_OPTION_CASCADE; } -#line 26119 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26169 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 874: -#line 6743 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6741 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.m_fk_option)= Foreign_key::FK_OPTION_SET_NULL; } -#line 26125 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26175 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 875: -#line 6744 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6742 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.m_fk_option)= Foreign_key::FK_OPTION_NO_ACTION; } -#line 26131 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26181 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 876: -#line 6745 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6743 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.m_fk_option)= Foreign_key::FK_OPTION_DEFAULT; } -#line 26137 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26187 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 877: -#line 6749 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6747 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.key_type)= Key::PRIMARY; } -#line 26143 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26193 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 878: -#line 6750 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6748 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.key_type)= Key::UNIQUE; } -#line 26149 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26199 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 879: -#line 6754 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6752 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 26155 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26205 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 880: -#line 6755 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6753 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 26161 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26211 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 881: -#line 6759 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6757 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 26167 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26217 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 883: -#line 6764 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6762 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 26173 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26223 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 884: -#line 6765 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6763 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 26179 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26229 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 885: -#line 6766 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6764 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 26185 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26235 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 886: -#line 6770 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6768 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.key_type)= Key::MULTIPLE; } -#line 26191 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26241 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 887: -#line 6771 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6769 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.key_type)= Key::UNIQUE; } -#line 26197 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26247 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 888: -#line 6775 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6773 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.key_type)= Key::FULLTEXT;} -#line 26203 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26253 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 889: -#line 6780 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6778 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { #ifdef HAVE_SPATIAL (yyval.key_type)= Key::SPATIAL; @@ -26212,101 +26262,101 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); sym_group_geom.needed_define)); #endif } -#line 26216 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26266 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 890: -#line 6791 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6789 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 26222 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26272 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 891: -#line 6792 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6790 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_key->option_list= Lex->option_list; } -#line 26228 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26278 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 892: -#line 6796 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6794 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 26234 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26284 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 893: -#line 6797 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6795 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_key->option_list= Lex->option_list; } -#line 26240 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26290 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 894: -#line 6801 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6799 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 26246 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26296 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 895: -#line 6802 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6800 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_key->option_list= Lex->option_list; } -#line 26252 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26302 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 902: -#line 6821 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6819 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.key_alg)= HA_KEY_ALG_UNDEF; } -#line 26258 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26308 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 903: -#line 6822 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6820 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.key_alg)= (yyvsp[0].key_alg); } -#line 26264 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26314 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 904: -#line 6826 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6824 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.key_alg)= HA_KEY_ALG_UNDEF; } -#line 26270 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26320 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 905: -#line 6827 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6825 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.key_alg)= (yyvsp[0].key_alg); } -#line 26276 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26326 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 906: -#line 6828 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6826 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.key_alg)= (yyvsp[0].key_alg); } -#line 26282 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26332 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 907: -#line 6832 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6830 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_key->key_create_info.algorithm= (yyvsp[0].key_alg); } -#line 26288 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26338 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 908: -#line 6834 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6832 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_key->key_create_info.algorithm= (yyvsp[0].key_alg); } -#line 26294 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26344 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 909: -#line 6839 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6837 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_key->key_create_info.block_size= (yyvsp[0].ulong_num); } -#line 26300 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26350 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 910: -#line 6841 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6839 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_key->key_create_info.comment= (yyvsp[0].lex_str); } -#line 26306 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26356 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 911: -#line 6843 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6841 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if ((yyvsp[0].lex_str).length > ENGINE_OPTION_MAX_LENGTH) my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), (yyvsp[-2].lex_str).str)); @@ -26314,11 +26364,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); engine_option_value((yyvsp[-2].lex_str), (yyvsp[0].lex_str), true, &Lex->option_list, &Lex->option_list_last); } -#line 26318 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26368 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 912: -#line 6851 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6849 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if ((yyvsp[0].lex_str).length > ENGINE_OPTION_MAX_LENGTH) my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), (yyvsp[-2].lex_str).str)); @@ -26326,85 +26376,85 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); engine_option_value((yyvsp[-2].lex_str), (yyvsp[0].lex_str), false, &Lex->option_list, &Lex->option_list_last); } -#line 26330 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26380 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 913: -#line 6859 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6857 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { new (thd->mem_root) engine_option_value((yyvsp[-2].lex_str), (yyvsp[0].ulonglong_number), &Lex->option_list, &Lex->option_list_last, thd->mem_root); } -#line 26340 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26390 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 914: -#line 6865 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6863 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { new (thd->mem_root) engine_option_value((yyvsp[-2].lex_str), &Lex->option_list, &Lex->option_list_last); } -#line 26349 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26399 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 919: -#line 6883 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6881 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (plugin_is_ready(&(yyvsp[0].lex_str), MYSQL_FTPARSER_PLUGIN)) Lex->last_key->key_create_info.parser_name= (yyvsp[0].lex_str); else my_yyabort_error((ER_FUNCTION_NOT_DEFINED, MYF(0), (yyvsp[0].lex_str).str)); } -#line 26360 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26410 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 920: -#line 6892 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6890 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.key_alg)= HA_KEY_ALG_BTREE; } -#line 26366 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26416 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 921: -#line 6893 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6891 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.key_alg)= HA_KEY_ALG_RTREE; } -#line 26372 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26422 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 922: -#line 6894 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6892 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.key_alg)= HA_KEY_ALG_HASH; } -#line 26378 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26428 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 923: -#line 6899 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6897 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_key->columns.push_back((yyvsp[-1].key_part), thd->mem_root); } -#line 26386 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26436 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 924: -#line 6903 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6901 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_key->columns.push_back((yyvsp[-1].key_part), thd->mem_root); } -#line 26394 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26444 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 925: -#line 6910 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6908 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.key_part)= new (thd->mem_root) Key_part_spec((yyvsp[0].lex_str), 0); if ((yyval.key_part) == NULL) MYSQL_YYABORT; } -#line 26404 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26454 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 926: -#line 6916 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6914 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int key_part_len= atoi((yyvsp[-1].lex_str).str); if (!key_part_len) @@ -26413,47 +26463,47 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.key_part) == NULL) MYSQL_YYABORT; } -#line 26417 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26467 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 927: -#line 6927 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6925 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)= null_lex_str; } -#line 26423 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26473 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 928: -#line 6928 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6926 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)= (yyvsp[0].lex_str); } -#line 26429 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26479 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 929: -#line 6932 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6930 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)= null_lex_str; } -#line 26435 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26485 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 930: -#line 6933 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6931 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)= (yyvsp[0].lex_str); } -#line 26441 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26491 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 931: -#line 6938 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6936 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_field->interval_list.push_back((yyvsp[0].string), thd->mem_root); } -#line 26447 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26497 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 932: -#line 6940 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6938 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->last_field->interval_list.push_back((yyvsp[0].string), thd->mem_root); } -#line 26453 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26503 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 933: -#line 6948 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6946 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->name= null_lex_str; Lex->only_view= FALSE; @@ -26467,11 +26517,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Lex->create_info.storage_media= HA_SM_DEFAULT; DBUG_ASSERT(!Lex->m_sql_cmd); } -#line 26471 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26521 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 934: -#line 6962 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6960 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!Lex->select_lex.add_table_to_list(thd, (yyvsp[0].table), NULL, TL_OPTION_UPDATING, @@ -26481,11 +26531,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Lex->select_lex.db= (Lex->select_lex.table_list.first)->db; Lex->create_last_non_select_table= Lex->last_table(); } -#line 26485 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26535 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 935: -#line 6972 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6970 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!Lex->m_sql_cmd) { @@ -26495,20 +26545,20 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 26499 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26549 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 936: -#line 6982 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6980 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.default_table_charset= NULL; Lex->create_info.used_fields= 0; } -#line 26508 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26558 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 937: -#line 6987 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6985 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command=SQLCOM_ALTER_DB; @@ -26517,11 +26567,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->copy_db_to(&lex->name.str, &lex->name.length)) MYSQL_YYABORT; } -#line 26521 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26571 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 938: -#line 6996 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 6994 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->sphead) @@ -26529,11 +26579,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sql_command= SQLCOM_ALTER_DB_UPGRADE; lex->name= (yyvsp[-4].lex_str); } -#line 26533 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26583 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 939: -#line 7004 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7002 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; @@ -26541,22 +26591,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); my_yyabort_error((ER_SP_NO_DROP_SP, MYF(0), "PROCEDURE")); bzero((char *)&lex->sp_chistics, sizeof(st_sp_chistics)); } -#line 26545 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26595 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 940: -#line 7012 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7010 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_ALTER_PROCEDURE; lex->spname= (yyvsp[-2].spname); } -#line 26556 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26606 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 941: -#line 7019 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7017 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; @@ -26564,22 +26614,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); my_yyabort_error((ER_SP_NO_DROP_SP, MYF(0), "FUNCTION")); bzero((char *)&lex->sp_chistics, sizeof(st_sp_chistics)); } -#line 26568 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26618 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 942: -#line 7027 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7025 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_ALTER_FUNCTION; lex->spname= (yyvsp[-2].spname); } -#line 26579 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26629 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 943: -#line 7034 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7032 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; @@ -26587,17 +26637,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "ALTER VIEW")); lex->create_view_mode= VIEW_ALTER; } -#line 26591 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26641 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 944: -#line 7042 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7040 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 26597 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26647 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 945: -#line 7049 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7047 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; @@ -26606,17 +26656,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->create_view_algorithm= VIEW_ALGORITHM_INHERIT; lex->create_view_mode= VIEW_ALTER; } -#line 26610 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26660 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 946: -#line 7058 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7056 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 26616 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26666 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 947: -#line 7060 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7058 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* It is safe to use Lex->spname because @@ -26633,11 +26683,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Lex->sql_command= SQLCOM_ALTER_EVENT; Lex->stmt_definition_begin= (yyvsp[-2].simple_string); } -#line 26637 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26687 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 948: -#line 7081 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7079 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!((yyvsp[-4].num) || (yyvsp[-3].num) || (yyvsp[-2].num) || (yyvsp[-1].num) || (yyvsp[0].num))) { @@ -26651,93 +26701,93 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Lex->sql_command= SQLCOM_ALTER_EVENT; Lex->stmt_definition_end= (char*)YYLIP->get_cpp_ptr(); } -#line 26655 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26705 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 949: -#line 7095 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7093 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->ts_cmd_type= ALTER_TABLESPACE; } -#line 26664 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26714 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 950: -#line 7100 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7098 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->ts_cmd_type= ALTER_LOGFILE_GROUP; } -#line 26673 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26723 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 951: -#line 7105 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7103 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->ts_cmd_type= CHANGE_FILE_TABLESPACE; } -#line 26682 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26732 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 952: -#line 7110 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7108 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->ts_cmd_type= ALTER_ACCESS_MODE_TABLESPACE; } -#line 26691 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26741 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 953: -#line 7115 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7113 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_ALTER_SERVER; lex->server_options.reset((yyvsp[0].lex_str)); } -#line 26701 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26751 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 954: -#line 7119 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7117 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 26707 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26757 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 955: -#line 7123 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7121 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0;} -#line 26713 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26763 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 956: -#line 7124 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7122 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 1; } -#line 26719 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26769 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 957: -#line 7125 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7123 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 1; } -#line 26725 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26775 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 958: -#line 7126 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7124 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 1; } -#line 26731 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26781 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 959: -#line 7130 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7128 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0;} -#line 26737 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26787 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 960: -#line 7132 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7130 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* Use lex's spname to hold the new name. @@ -26746,35 +26796,35 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Lex->spname= (yyvsp[0].spname); (yyval.num)= 1; } -#line 26750 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26800 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 961: -#line 7143 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7141 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0;} -#line 26756 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26806 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 962: -#line 7144 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7142 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 1; } -#line 26762 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26812 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 963: -#line 7148 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7146 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)= null_lex_str; } -#line 26768 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26818 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 964: -#line 7149 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7147 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)= (yyvsp[0].lex_str); } -#line 26774 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26824 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 966: -#line 7155 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7153 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_discard_import_tablespace( @@ -26782,11 +26832,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (Lex->m_sql_cmd == NULL) MYSQL_YYABORT; } -#line 26786 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26836 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 967: -#line 7163 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7161 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_discard_import_tablespace( @@ -26794,31 +26844,31 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (Lex->m_sql_cmd == NULL) MYSQL_YYABORT; } -#line 26798 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26848 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 973: -#line 7185 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7183 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->alter_info.flags|= Alter_info::ALTER_DROP_PARTITION; DBUG_ASSERT(!Lex->if_exists()); Lex->create_info.add((yyvsp[-1].object_ddl_options)); } -#line 26808 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26858 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 974: -#line 7192 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7190 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_info.flags|= Alter_info::ALTER_REBUILD_PARTITION; lex->no_write_to_binlog= (yyvsp[-1].num); } -#line 26818 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26868 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 975: -#line 7199 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7197 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; lex->no_write_to_binlog= (yyvsp[-1].num); @@ -26829,11 +26879,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->m_sql_cmd == NULL) MYSQL_YYABORT; } -#line 26833 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26883 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 977: -#line 7212 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7210 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; lex->no_write_to_binlog= (yyvsp[-1].num); @@ -26844,11 +26894,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->m_sql_cmd == NULL) MYSQL_YYABORT; } -#line 26848 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26898 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 978: -#line 7223 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7221 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; lex->check_opt.init(); @@ -26858,11 +26908,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->m_sql_cmd == NULL) MYSQL_YYABORT; } -#line 26862 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26912 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 980: -#line 7235 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7233 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; lex->no_write_to_binlog= (yyvsp[-1].num); @@ -26873,22 +26923,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->m_sql_cmd == NULL) MYSQL_YYABORT; } -#line 26877 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26927 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 982: -#line 7247 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7245 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_info.flags|= Alter_info::ALTER_COALESCE_PARTITION; lex->no_write_to_binlog= (yyvsp[-1].num); lex->alter_info.num_parts= (yyvsp[0].ulong_num); } -#line 26888 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26938 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 983: -#line 7254 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7252 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; lex->check_opt.init(); @@ -26898,11 +26948,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->m_sql_cmd == NULL) MYSQL_YYABORT; } -#line 26902 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26952 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 985: -#line 7266 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7264 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; size_t dummy; @@ -26925,27 +26975,27 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->m_sql_cmd == NULL) MYSQL_YYABORT; } -#line 26929 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26979 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 986: -#line 7292 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7290 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->alter_info.flags|= Alter_info::ALTER_REMOVE_PARTITIONING; } -#line 26937 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26987 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 987: -#line 7299 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7297 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->alter_info.flags|= Alter_info::ALTER_ALL_PARTITION; } -#line 26945 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 26995 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 989: -#line 7308 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7306 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->part_info= new (thd->mem_root) partition_info(); @@ -26959,34 +27009,34 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->create_info.set((yyvsp[-1].object_ddl_options)); lex->no_write_to_binlog= (yyvsp[0].num); } -#line 26963 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27013 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 990: -#line 7322 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7320 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 26969 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27019 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 992: -#line 7328 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7326 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->part_info->num_parts= lex->part_info->partitions.elements; } -#line 26978 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27028 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 993: -#line 7333 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7331 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->part_info->num_parts= (yyvsp[0].ulong_num); } -#line 26986 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27036 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 994: -#line 7340 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7338 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->part_info= new (thd->mem_root) partition_info(); @@ -26997,48 +27047,48 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } lex->no_write_to_binlog= (yyvsp[0].num); } -#line 27001 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27051 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 996: -#line 7355 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7353 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->alter_info.flags|= Alter_info::ALTER_TABLE_REORG; } -#line 27009 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27059 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 997: -#line 7359 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7357 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->alter_info.flags|= Alter_info::ALTER_REORGANIZE_PARTITION; } -#line 27017 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27067 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 998: -#line 7363 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7361 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { partition_info *part_info= Lex->part_info; part_info->num_parts= part_info->partitions.elements; } -#line 27026 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27076 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 999: -#line 7370 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7368 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27032 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27082 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1000: -#line 7371 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7369 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27038 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27088 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1001: -#line 7376 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7374 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->alter_info.partition_names.push_back((yyvsp[0].lex_str).str, thd->mem_root)) @@ -27047,66 +27097,66 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 27051 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27101 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1004: -#line 7397 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7395 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->alter_info.flags|= Alter_info::ALTER_ADD_COLUMN; } -#line 27060 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27110 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1005: -#line 7405 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7403 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_last_non_select_table= Lex->last_table(); } -#line 27068 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27118 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1006: -#line 7409 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7407 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_last_non_select_table= Lex->last_table(); Lex->alter_info.flags|= Alter_info::ALTER_ADD_INDEX; } -#line 27077 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27127 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1007: -#line 7414 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7412 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->alter_info.flags|= Alter_info::ALTER_ADD_COLUMN | Alter_info::ALTER_ADD_INDEX; } -#line 27086 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27136 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1008: -#line 7420 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7418 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->alter_info.flags|= Alter_info::ALTER_CHANGE_COLUMN; Lex->create_last_non_select_table= Lex->last_table(); Lex->last_field->change= (yyvsp[-2].lex_str).str; } -#line 27096 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27146 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1009: -#line 7427 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7425 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->alter_info.flags|= Alter_info::ALTER_CHANGE_COLUMN; Lex->create_last_non_select_table= Lex->last_table(); Lex->last_field->change= Lex->last_field->field_name; } -#line 27106 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27156 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1010: -#line 7433 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7431 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; Alter_drop *ad= (new (thd->mem_root) @@ -27116,11 +27166,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->alter_info.drop_list.push_back(ad, thd->mem_root); lex->alter_info.flags|= Alter_info::ALTER_DROP_COLUMN; } -#line 27120 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27170 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1011: -#line 7443 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7441 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; Alter_drop *ad= (new (thd->mem_root) @@ -27130,11 +27180,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->alter_info.drop_list.push_back(ad, thd->mem_root); lex->alter_info.flags|= Alter_info::DROP_FOREIGN_KEY; } -#line 27134 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27184 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1012: -#line 7453 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7451 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; Alter_drop *ad= (new (thd->mem_root) @@ -27145,11 +27195,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->alter_info.drop_list.push_back(ad, thd->mem_root); lex->alter_info.flags|= Alter_info::ALTER_DROP_INDEX; } -#line 27149 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27199 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1013: -#line 7464 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7462 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; Alter_drop *ad= (new (thd->mem_root) @@ -27159,31 +27209,31 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->alter_info.drop_list.push_back(ad, thd->mem_root); lex->alter_info.flags|= Alter_info::ALTER_DROP_INDEX; } -#line 27163 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27213 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1014: -#line 7474 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7472 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->alter_info.keys_onoff= Alter_info::DISABLE; lex->alter_info.flags|= Alter_info::ALTER_KEYS_ONOFF; } -#line 27173 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27223 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1015: -#line 7480 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7478 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->alter_info.keys_onoff= Alter_info::ENABLE; lex->alter_info.flags|= Alter_info::ALTER_KEYS_ONOFF; } -#line 27183 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27233 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1016: -#line 7486 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7484 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; Alter_column *ac= new (thd->mem_root) Alter_column((yyvsp[-3].lex_str).str,(yyvsp[0].item)); @@ -27192,11 +27242,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->alter_info.alter_list.push_back(ac, thd->mem_root); lex->alter_info.flags|= Alter_info::ALTER_CHANGE_COLUMN_DEFAULT; } -#line 27196 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27246 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1017: -#line 7495 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7493 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; Alter_column *ac= (new (thd->mem_root) @@ -27206,11 +27256,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->alter_info.alter_list.push_back(ac, thd->mem_root); lex->alter_info.flags|= Alter_info::ALTER_CHANGE_COLUMN_DEFAULT; } -#line 27210 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27260 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1018: -#line 7505 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7503 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; size_t dummy; @@ -27226,11 +27276,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->name= (yyvsp[0].table)->table; lex->alter_info.flags|= Alter_info::ALTER_RENAME; } -#line 27230 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27280 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1019: -#line 7521 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7519 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!(yyvsp[-1].charset)) { @@ -27244,11 +27294,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; Lex->alter_info.flags|= Alter_info::ALTER_OPTIONS; } -#line 27248 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27298 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1020: -#line 7535 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7533 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->alter_info.flags|= Alter_info::ALTER_OPTIONS; @@ -27258,230 +27308,230 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->create_info.used_fields&= ~HA_CREATE_USED_ENGINE; } } -#line 27262 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27312 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1021: -#line 7545 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7543 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->alter_info.flags|= Alter_info::ALTER_RECREATE; } -#line 27270 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27320 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1022: -#line 7549 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7547 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->alter_info.flags|= Alter_info::ALTER_ORDER; } -#line 27279 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27329 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1030: -#line 7566 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7564 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->alter_info.requested_algorithm= Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT; } -#line 27288 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27338 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1031: -#line 7571 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7569 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->alter_info.set_requested_algorithm(&(yyvsp[0].lex_str))) my_yyabort_error((ER_UNKNOWN_ALTER_ALGORITHM, MYF(0), (yyvsp[0].lex_str).str)); } -#line 27297 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27347 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1032: -#line 7579 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7577 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->alter_info.requested_lock= Alter_info::ALTER_TABLE_LOCK_DEFAULT; } -#line 27306 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27356 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1033: -#line 7584 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7582 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->alter_info.set_requested_lock(&(yyvsp[0].lex_str))) my_yyabort_error((ER_UNKNOWN_ALTER_LOCK, MYF(0), (yyvsp[0].lex_str).str)); } -#line 27315 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27365 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1034: -#line 7591 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7589 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27321 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27371 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1035: -#line 7592 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7590 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27327 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27377 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1036: -#line 7596 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7594 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ignore= 0;} -#line 27333 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27383 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1037: -#line 7597 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7595 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ignore= 1;} -#line 27339 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27389 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1038: -#line 7601 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7599 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ignore= 0;} -#line 27345 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27395 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1044: -#line 7615 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7613 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ignore= 1;} -#line 27351 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27401 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1045: -#line 7617 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7615 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->alter_info.requested_lock= Alter_info::ALTER_TABLE_LOCK_NONE; } -#line 27360 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27410 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1046: -#line 7624 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7622 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->drop_mode= DROP_DEFAULT; } -#line 27366 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27416 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1047: -#line 7625 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7623 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->drop_mode= DROP_RESTRICT; } -#line 27372 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27422 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1048: -#line 7626 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7624 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->drop_mode= DROP_CASCADE; } -#line 27378 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27428 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1049: -#line 7630 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7628 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27384 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27434 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1050: -#line 7632 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7630 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { store_position_for_column((yyvsp[0].lex_str).str); Lex->alter_info.flags |= Alter_info::ALTER_COLUMN_ORDER; } -#line 27393 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27443 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1051: -#line 7637 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7635 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { store_position_for_column(first_keyword); Lex->alter_info.flags |= Alter_info::ALTER_COLUMN_ORDER; } -#line 27402 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27452 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1052: -#line 7644 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7642 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27408 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27458 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1053: -#line 7645 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7643 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27414 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27464 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1054: -#line 7646 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7644 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27420 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27470 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1055: -#line 7647 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7645 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27426 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27476 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1056: -#line 7652 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7650 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command = SQLCOM_SLAVE_START; lex->type = 0; /* If you change this code don't forget to update SLAVE START too */ } -#line 27437 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27487 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1057: -#line 7659 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7657 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27443 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27493 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1058: -#line 7661 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7659 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command = SQLCOM_SLAVE_ALL_START; lex->type = 0; } -#line 27453 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27503 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1059: -#line 7666 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7664 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27459 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27509 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1060: -#line 7668 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7666 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command = SQLCOM_SLAVE_STOP; lex->type = 0; /* If you change this code don't forget to update SLAVE STOP too */ } -#line 27470 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27520 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1061: -#line 7675 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7673 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command = SQLCOM_SLAVE_ALL_STOP; lex->type = 0; /* If you change this code don't forget to update SLAVE STOP too */ } -#line 27481 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27531 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1062: -#line 7685 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7683 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_BEGIN; @@ -27494,103 +27544,103 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } lex->start_transaction_opt= (yyvsp[0].num); } -#line 27498 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27548 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1063: -#line 7701 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7699 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0; } -#line 27506 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27556 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1064: -#line 7705 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7703 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= (yyvsp[0].num); } -#line 27514 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27564 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1065: -#line 7712 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7710 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= (yyvsp[0].num); } -#line 27522 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27572 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1066: -#line 7716 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7714 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= (yyvsp[-2].num) | (yyvsp[0].num); } -#line 27530 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27580 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1067: -#line 7723 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7721 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT; } -#line 27538 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27588 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1068: -#line 7727 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7725 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= MYSQL_START_TRANS_OPT_READ_ONLY; } -#line 27546 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27596 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1069: -#line 7731 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7729 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= MYSQL_START_TRANS_OPT_READ_WRITE; } -#line 27554 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27604 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1070: -#line 7737 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7735 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->slave_thd_opt= 0; } -#line 27560 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27610 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1071: -#line 7739 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7737 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27566 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27616 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1074: -#line 7748 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7746 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27572 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27622 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1075: -#line 7749 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7747 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->slave_thd_opt|=SLAVE_SQL; } -#line 27578 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27628 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1076: -#line 7750 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7748 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->slave_thd_opt|=SLAVE_IO; } -#line 27584 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27634 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1077: -#line 7754 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7752 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27590 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27640 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1078: -#line 7756 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7754 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (((lex->mi.log_file_name || lex->mi.pos) && @@ -27599,60 +27649,60 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (lex->mi.relay_log_name && lex->mi.relay_log_pos))) my_yyabort_error((ER_BAD_SLAVE_UNTIL_COND, MYF(0))); } -#line 27603 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27653 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1079: -#line 7765 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7763 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.gtid_pos_str = (yyvsp[0].lex_str); } -#line 27611 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27661 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1082: -#line 7777 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7775 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command = SQLCOM_CHECKSUM; /* Will be overriden during execution. */ YYPS->m_lock_type= TL_UNLOCK; } -#line 27622 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27672 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1083: -#line 7784 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7782 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27628 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27678 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1084: -#line 7788 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7786 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_opt.flags= 0; } -#line 27634 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27684 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1085: -#line 7789 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7787 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_opt.flags= T_QUICK; } -#line 27640 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27690 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1086: -#line 7790 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7788 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_opt.flags= T_EXTEND; } -#line 27646 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27696 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1088: -#line 7795 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7793 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->only_view= TRUE; } -#line 27652 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27702 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1090: -#line 7800 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7798 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command = SQLCOM_REPAIR; @@ -27662,11 +27712,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); /* Will be overriden during execution. */ YYPS->m_lock_type= TL_UNLOCK; } -#line 27666 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27716 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1091: -#line 7810 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7808 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX* lex= thd->lex; DBUG_ASSERT(!lex->m_sql_cmd); @@ -27674,65 +27724,65 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->m_sql_cmd == NULL) MYSQL_YYABORT; } -#line 27678 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27728 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1092: -#line 7820 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7818 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_opt.flags = T_MEDIUM; } -#line 27684 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27734 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1093: -#line 7821 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7819 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27690 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27740 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1094: -#line 7825 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7823 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27696 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27746 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1095: -#line 7826 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7824 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27702 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27752 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1096: -#line 7830 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7828 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_opt.flags|= T_QUICK; } -#line 27708 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27758 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1097: -#line 7831 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7829 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_opt.flags|= T_EXTEND; } -#line 27714 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27764 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1098: -#line 7832 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7830 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_opt.sql_flags|= TT_USEFRM; } -#line 27720 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27770 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1099: -#line 7836 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7834 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 27726 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27776 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1100: -#line 7837 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7835 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_opt.sql_flags|= TT_FROM_MYSQL; } -#line 27732 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27782 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1101: -#line 7842 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7840 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command = SQLCOM_ANALYZE; @@ -27742,11 +27792,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); /* Will be overriden during execution. */ YYPS->m_lock_type= TL_UNLOCK; } -#line 27746 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27796 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1102: -#line 7852 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7850 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX* lex= thd->lex; DBUG_ASSERT(!lex->m_sql_cmd); @@ -27754,137 +27804,137 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->m_sql_cmd == NULL) MYSQL_YYABORT; } -#line 27758 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27808 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1106: -#line 7872 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7870 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27764 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27814 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1107: -#line 7874 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7872 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { thd->lex->with_persistent_for_clause= TRUE; } -#line 27772 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27822 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1108: -#line 7881 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7879 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27778 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27828 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1109: -#line 7883 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7881 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27784 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27834 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1110: -#line 7886 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7884 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27790 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27840 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1111: -#line 7888 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7886 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX* lex= thd->lex; lex->column_list= new (thd->mem_root) List; if (lex->column_list == NULL) MYSQL_YYABORT; } -#line 27801 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27851 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1113: -#line 7899 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7897 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27807 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27857 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1114: -#line 7901 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7899 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX* lex= thd->lex; lex->index_list= new (thd->mem_root) List; if (lex->index_list == NULL) MYSQL_YYABORT; } -#line 27818 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27868 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1116: -#line 7913 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7911 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27824 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27874 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1117: -#line 7915 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7913 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->column_list->push_back((LEX_STRING*) thd->memdup(&(yyvsp[0].lex_str), sizeof(LEX_STRING)), thd->mem_root); } -#line 27833 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27883 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1118: -#line 7920 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7918 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->column_list->push_back((LEX_STRING*) thd->memdup(&(yyvsp[0].lex_str), sizeof(LEX_STRING)), thd->mem_root); } -#line 27842 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27892 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1119: -#line 7928 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7926 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27848 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27898 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1122: -#line 7935 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7933 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->index_list->push_back((LEX_STRING*) thd->memdup(&(yyvsp[0].lex_str), sizeof(LEX_STRING)), thd->mem_root); } -#line 27858 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27908 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1123: -#line 7942 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7940 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX_STRING str= {(char*) "PRIMARY", 7}; Lex->index_list->push_back((LEX_STRING*) thd->memdup(&str, sizeof(LEX_STRING)), thd->mem_root); } -#line 27869 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27919 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1124: -#line 7952 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7950 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_BINLOG_BASE64_EVENT; Lex->comment= (yyvsp[0].lex_str); } -#line 27878 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27928 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1126: -#line 7960 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7958 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->only_view= TRUE; } -#line 27884 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27934 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1128: -#line 7964 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7962 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; @@ -27894,11 +27944,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); /* Will be overriden during execution. */ YYPS->m_lock_type= TL_UNLOCK; } -#line 27898 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27948 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1129: -#line 7974 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7972 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX* lex= thd->lex; if (lex->sphead) @@ -27908,83 +27958,83 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->m_sql_cmd == NULL) MYSQL_YYABORT; } -#line 27912 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27962 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1130: -#line 7986 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7984 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_opt.flags = T_MEDIUM; } -#line 27918 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27968 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1131: -#line 7987 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7985 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27924 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27974 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1132: -#line 7991 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7989 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27930 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27980 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1133: -#line 7992 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7990 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 27936 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27986 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1134: -#line 7996 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7994 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_opt.flags|= T_QUICK; } -#line 27942 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27992 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1135: -#line 7997 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7995 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_opt.flags|= T_FAST; } -#line 27948 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 27998 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1136: -#line 7998 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7996 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_opt.flags|= T_MEDIUM; } -#line 27954 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28004 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1137: -#line 7999 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7997 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_opt.flags|= T_EXTEND; } -#line 27960 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28010 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1138: -#line 8000 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7998 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_opt.flags|= T_CHECK_ONLY_CHANGED; } -#line 27966 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28016 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1139: -#line 8001 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 7999 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; } -#line 27972 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28022 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1140: -#line 8005 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8003 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 27978 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28028 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1141: -#line 8006 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8004 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; } -#line 27984 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28034 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1142: -#line 8011 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8009 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command = SQLCOM_OPTIMIZE; @@ -27994,11 +28044,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); /* Will be overriden during execution. */ YYPS->m_lock_type= TL_UNLOCK; } -#line 27998 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28048 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1143: -#line 8021 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8019 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX* lex= thd->lex; DBUG_ASSERT(!lex->m_sql_cmd); @@ -28006,71 +28056,71 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->m_sql_cmd == NULL) MYSQL_YYABORT; } -#line 28010 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28060 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1144: -#line 8031 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8029 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0; } -#line 28016 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28066 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1145: -#line 8032 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8030 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 1; } -#line 28022 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28072 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1146: -#line 8033 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8031 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 1; } -#line 28028 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28078 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1147: -#line 8038 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8036 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command= SQLCOM_RENAME_TABLE; } -#line 28036 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28086 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1148: -#line 8042 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8040 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 28042 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28092 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1149: -#line 8044 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8042 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_RENAME_USER; } -#line 28050 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28100 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1150: -#line 8051 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8049 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->users_list.push_back((yyvsp[-2].lex_user), thd->mem_root) || Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root)) MYSQL_YYABORT; } -#line 28060 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28110 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1151: -#line 8057 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8055 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->users_list.push_back((yyvsp[-2].lex_user), thd->mem_root) || Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root)) MYSQL_YYABORT; } -#line 28070 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28120 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1154: -#line 8071 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8069 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; SELECT_LEX *sl= lex->current_select; @@ -28080,146 +28130,146 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); TL_IGNORE, MDL_EXCLUSIVE)) MYSQL_YYABORT; } -#line 28084 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28134 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1155: -#line 8084 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8082 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->alter_info.reset(); } -#line 28092 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28142 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1156: -#line 8088 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8086 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_ASSIGN_TO_KEYCACHE; lex->ident= (yyvsp[0].lex_str); } -#line 28102 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28152 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1161: -#line 8107 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8105 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!Select->add_table_to_list(thd, (yyvsp[-1].table), NULL, 0, TL_READ, MDL_SHARED_READ, Select->pop_index_hints())) MYSQL_YYABORT; } -#line 28113 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28163 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1162: -#line 8117 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8115 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!Select->add_table_to_list(thd, (yyvsp[-2].table), NULL, 0, TL_READ, MDL_SHARED_READ, Select->pop_index_hints())) MYSQL_YYABORT; } -#line 28124 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28174 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1163: -#line 8126 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8124 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)= (yyvsp[0].lex_str); } -#line 28130 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28180 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1164: -#line 8127 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8125 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str) = default_key_cache_base; } -#line 28136 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28186 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1165: -#line 8132 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8130 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command=SQLCOM_PRELOAD_KEYS; lex->alter_info.reset(); } -#line 28146 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28196 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1166: -#line 8138 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8136 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 28152 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28202 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1171: -#line 8153 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8151 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!Select->add_table_to_list(thd, (yyvsp[-2].table), NULL, (yyvsp[0].num), TL_READ, MDL_SHARED_READ, Select->pop_index_hints())) MYSQL_YYABORT; } -#line 28163 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28213 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1172: -#line 8163 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8161 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!Select->add_table_to_list(thd, (yyvsp[-3].table), NULL, (yyvsp[0].num), TL_READ, MDL_SHARED_READ, Select->pop_index_hints())) MYSQL_YYABORT; } -#line 28174 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28224 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1173: -#line 8173 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8171 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->alter_info.flags|= Alter_info::ALTER_ADMIN_PARTITION; } -#line 28182 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28232 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1175: -#line 8180 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8178 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->select_lex.alloc_index_hints(thd); Select->set_index_hint_type(INDEX_HINT_USE, INDEX_HINT_MASK_ALL); } -#line 28192 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28242 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1177: -#line 8189 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8187 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 28198 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28248 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1179: -#line 8195 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8193 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0; } -#line 28204 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28254 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1180: -#line 8196 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8194 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= TL_OPTION_IGNORE_LEAVES; } -#line 28210 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28260 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1181: -#line 8206 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8204 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SELECT; } -#line 28219 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28269 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1184: -#line 8219 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8217 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* In order to correctly parse UNION's global ORDER BY we need to @@ -28227,47 +28277,47 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); */ Lex->current_select->set_braces(true); } -#line 28231 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28281 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1185: -#line 8227 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8225 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (setup_select_in_parentheses(Lex)) MYSQL_YYABORT; } -#line 28240 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28290 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1187: -#line 8236 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8234 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->current_select->set_braces(true); } -#line 28248 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28298 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1188: -#line 8241 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8239 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (setup_select_in_parentheses(Lex)) MYSQL_YYABORT; } -#line 28257 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28307 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1190: -#line 8250 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8248 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; /* Parentheses carry no meaning here */ lex->current_select->set_braces(false); } -#line 28267 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28317 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1194: -#line 8280 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8278 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if ((yyvsp[-9].num) && (yyvsp[-1].num)) /* double "INTO" clause */ my_yyabort_error((ER_WRONG_USAGE, MYF(0), "INTO", "INTO")); @@ -28275,11 +28325,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyvsp[-2].num) && ((yyvsp[-9].num) || (yyvsp[-1].num))) /* "INTO" with "PROCEDURE ANALYSE" */ my_yyabort_error((ER_WRONG_USAGE, MYF(0), "PROCEDURE", "INTO")); } -#line 28279 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28329 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1195: -#line 8290 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8288 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; SELECT_LEX *sel= lex->current_select; @@ -28287,38 +28337,38 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); mysql_init_select(lex); lex->current_select->parsing_place= SELECT_LIST; } -#line 28291 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28341 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1196: -#line 8298 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8296 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->parsing_place= NO_MATTER; } -#line 28299 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28349 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1201: -#line 8325 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8323 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->context.table_list= Select->context.first_name_resolution_table= Select->table_list.first; } -#line 28309 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28359 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1204: -#line 8340 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8338 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Select->options & SELECT_DISTINCT && Select->options & SELECT_ALL) my_yyabort_error((ER_WRONG_USAGE, MYF(0), "ALL", "DISTINCT")); } -#line 28318 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28368 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1208: -#line 8354 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8352 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* Allow this flag only on the first top-level SELECT statement, if @@ -28335,11 +28385,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Lex->select_lex.options&= ~OPTION_TO_QUERY_CACHE; Lex->select_lex.sql_cache= SELECT_LEX::SQL_NO_CACHE; } -#line 28339 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28389 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1209: -#line 8371 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8369 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* Allow this flag only on the first top-level SELECT statement, if @@ -28356,22 +28406,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Lex->select_lex.options|= OPTION_TO_QUERY_CACHE; Lex->select_lex.sql_cache= SELECT_LEX::SQL_CACHE; } -#line 28360 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28410 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1211: -#line 8392 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8390 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->current_select->lock_type= TL_WRITE; lex->current_select->set_lock_for_tables(TL_WRITE); lex->safe_to_cache_query=0; } -#line 28371 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28421 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1212: -#line 8399 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8397 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->current_select->lock_type= TL_READ_WITH_SHARED_LOCKS; @@ -28379,11 +28429,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); set_lock_for_tables(TL_READ_WITH_SHARED_LOCKS); lex->safe_to_cache_query=0; } -#line 28383 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28433 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1215: -#line 8412 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8410 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item *item= new (thd->mem_root) Item_field(thd, &thd->lex->current_select->context, @@ -28394,20 +28444,20 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; (thd->lex->current_select->with_wild)++; } -#line 28398 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28448 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1216: -#line 8426 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8424 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (add_item_to_list(thd, (yyvsp[-1].item))) MYSQL_YYABORT; } -#line 28407 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28457 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1217: -#line 8431 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8429 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { DBUG_ASSERT((yyvsp[-3].simple_string) < (yyvsp[-1].simple_string)); @@ -28426,113 +28476,113 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyvsp[-2].item)->set_name((yyvsp[-3].simple_string), (uint) ((yyvsp[-1].simple_string) - (yyvsp[-3].simple_string)), thd->charset()); } } -#line 28430 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28480 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1218: -#line 8452 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8450 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.simple_string)= (char*) YYLIP->get_tok_start(); } -#line 28438 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28488 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1219: -#line 8458 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8456 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.simple_string)= (char*) YYLIP->get_cpp_tok_start(); } -#line 28446 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28496 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1220: -#line 8464 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8462 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.simple_string)= (char*) YYLIP->get_cpp_tok_end(); } -#line 28454 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28504 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1221: -#line 8470 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8468 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)=null_lex_str;} -#line 28460 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28510 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1222: -#line 8471 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8469 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)=(yyvsp[0].lex_str); } -#line 28466 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28516 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1223: -#line 8472 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8470 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)=(yyvsp[0].lex_str); } -#line 28472 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28522 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1224: -#line 8473 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8471 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)=(yyvsp[0].lex_str); } -#line 28478 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28528 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1225: -#line 8474 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8472 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)=(yyvsp[0].lex_str); } -#line 28484 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28534 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1226: -#line 8478 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8476 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= NOT_FIXED_DEC; } -#line 28490 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28540 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1227: -#line 8479 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8477 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= NOT_FIXED_DEC; } -#line 28496 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28546 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1228: -#line 8480 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8478 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= (yyvsp[-1].ulong_num); } -#line 28502 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28552 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1229: -#line 8484 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8482 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0; } -#line 28508 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28558 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1230: -#line 8485 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8483 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0; } -#line 28514 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28564 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1231: -#line 8486 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8484 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= (yyvsp[-1].ulong_num); } -#line 28520 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28570 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1232: -#line 8490 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8488 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 28526 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28576 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1233: -#line 8491 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8489 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 28532 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28582 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1234: -#line 8497 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8495 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* Design notes: @@ -28583,22 +28633,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 28587 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28637 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1235: -#line 8548 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8546 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* XOR is a proprietary extension */ (yyval.item)= new (thd->mem_root) Item_func_xor(thd, (yyvsp[-2].item), (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28598 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28648 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1236: -#line 8555 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8553 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* See comments in rule expr: expr or expr */ Item_cond_and *item1; @@ -28641,141 +28691,141 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 28645 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28695 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1237: -#line 8598 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8596 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= negate_expression(thd, (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28655 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28705 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1238: -#line 8604 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8602 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_istrue(thd, (yyvsp[-2].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28665 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28715 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1239: -#line 8610 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8608 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_isnottrue(thd, (yyvsp[-3].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28675 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28725 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1240: -#line 8616 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8614 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_isfalse(thd, (yyvsp[-2].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28685 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28735 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1241: -#line 8622 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8620 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_isnotfalse(thd, (yyvsp[-3].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28695 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28745 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1242: -#line 8628 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8626 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_isnull(thd, (yyvsp[-2].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28705 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28755 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1243: -#line 8634 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8632 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_isnotnull(thd, (yyvsp[-3].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28715 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28765 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1245: -#line 8644 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8642 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_isnull(thd, (yyvsp[-2].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28725 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28775 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1246: -#line 8650 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8648 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_isnotnull(thd, (yyvsp[-3].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28735 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28785 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1247: -#line 8656 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8654 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_equal(thd, (yyvsp[-2].item), (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28745 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28795 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1248: -#line 8662 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8660 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= (*(yyvsp[-1].boolfunc2creator))(0)->create(thd, (yyvsp[-2].item), (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28755 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28805 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1249: -#line 8668 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8666 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= all_any_subquery_creator(thd, (yyvsp[-5].item), (yyvsp[-4].boolfunc2creator), (yyvsp[-3].num), (yyvsp[-1].select_lex)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28765 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28815 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1251: -#line 8678 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8676 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_in_subselect(thd, (yyvsp[-4].item), (yyvsp[-1].select_lex)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28775 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28825 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1252: -#line 8684 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8682 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item *item= new (thd->mem_root) Item_in_subselect(thd, (yyvsp[-5].item), (yyvsp[-1].select_lex)); if (item == NULL) @@ -28784,21 +28834,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28788 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28838 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1253: -#line 8693 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8691 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= handle_sql2003_note184_exception(thd, (yyvsp[-4].item), true, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28798 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28848 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1254: -#line 8699 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8697 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); (yyvsp[-1].item_list)->push_front((yyvsp[-6].item), thd->mem_root); @@ -28806,21 +28856,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28810 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28860 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1255: -#line 8707 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8705 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= handle_sql2003_note184_exception(thd, (yyvsp[-5].item), false, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28820 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28870 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1256: -#line 8713 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8711 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); (yyvsp[-1].item_list)->push_front((yyvsp[-7].item), thd->mem_root); @@ -28830,21 +28880,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); item->negate(); (yyval.item)= item; } -#line 28834 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28884 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1257: -#line 8723 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8721 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_between(thd, (yyvsp[-4].item), (yyvsp[-2].item), (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28844 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28894 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1258: -#line 8729 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8727 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item_func_between *item; item= new (thd->mem_root) Item_func_between(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[0].item)); @@ -28853,11 +28903,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); item->negate(); (yyval.item)= item; } -#line 28857 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28907 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1259: -#line 8738 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8736 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item *item1= new (thd->mem_root) Item_func_soundex(thd, (yyvsp[-3].item)); Item *item4= new (thd->mem_root) Item_func_soundex(thd, (yyvsp[0].item)); @@ -28867,22 +28917,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28871 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28921 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1260: -#line 8748 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8746 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_like(thd, (yyvsp[-3].item), (yyvsp[-1].item), (yyvsp[0].item), Lex->escape_used); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28882 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28932 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1261: -#line 8755 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8753 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item *item= new (thd->mem_root) Item_func_like(thd, (yyvsp[-4].item), (yyvsp[-1].item), (yyvsp[0].item), Lex->escape_used); @@ -28892,21 +28942,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28896 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28946 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1262: -#line 8765 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8763 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_regex(thd, (yyvsp[-2].item), (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28906 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28956 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1263: -#line 8771 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8769 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item *item= new (thd->mem_root) Item_func_regex(thd, (yyvsp[-3].item), (yyvsp[0].item)); if (item == NULL) @@ -28915,318 +28965,318 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28919 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28969 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1265: -#line 8784 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8782 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_bit_or(thd, (yyvsp[-2].item), (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28929 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28979 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1266: -#line 8790 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8788 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_bit_and(thd, (yyvsp[-2].item), (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28939 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28989 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1267: -#line 8796 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8794 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_shift_left(thd, (yyvsp[-2].item), (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28949 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 28999 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1268: -#line 8802 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8800 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_shift_right(thd, (yyvsp[-2].item), (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28959 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29009 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1269: -#line 8808 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8806 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_plus(thd, (yyvsp[-2].item), (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28969 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29019 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1270: -#line 8814 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8812 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_minus(thd, (yyvsp[-2].item), (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28979 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29029 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1271: -#line 8820 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8818 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-4].item), (yyvsp[-1].item), (yyvsp[0].interval), 0); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28989 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29039 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1272: -#line 8826 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8824 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-4].item), (yyvsp[-1].item), (yyvsp[0].interval), 1); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 28999 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29049 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1273: -#line 8832 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8830 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_mul(thd, (yyvsp[-2].item), (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29009 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29059 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1274: -#line 8838 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8836 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_div(thd, (yyvsp[-2].item), (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29019 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29069 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1275: -#line 8844 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8842 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_mod(thd, (yyvsp[-2].item), (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29029 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29079 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1276: -#line 8850 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8848 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_int_div(thd, (yyvsp[-2].item), (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29039 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29089 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1277: -#line 8856 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8854 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_mod(thd, (yyvsp[-2].item), (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29049 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29099 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1278: -#line 8862 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8860 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_bit_xor(thd, (yyvsp[-2].item), (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29059 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29109 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1288: -#line 8891 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8889 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.boolfunc2creator) = &comp_eq_creator; } -#line 29065 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29115 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1289: -#line 8892 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8890 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.boolfunc2creator) = &comp_ge_creator; } -#line 29071 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29121 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1290: -#line 8893 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8891 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.boolfunc2creator) = &comp_gt_creator; } -#line 29077 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29127 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1291: -#line 8894 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8892 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.boolfunc2creator) = &comp_le_creator; } -#line 29083 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29133 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1292: -#line 8895 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8893 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.boolfunc2creator) = &comp_lt_creator; } -#line 29089 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29139 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1293: -#line 8896 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8894 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.boolfunc2creator) = &comp_ne_creator; } -#line 29095 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29145 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1294: -#line 8900 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8898 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num) = 1; } -#line 29101 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29151 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1295: -#line 8901 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8899 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num) = 0; } -#line 29107 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29157 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1296: -#line 8906 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8904 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; (yyval.num)= DYN_COL_NULL; /* automatic type */ lex->charset= NULL; lex->length= lex->dec= 0; } -#line 29118 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29168 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1297: -#line 8912 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8910 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= (yyvsp[0].num); } -#line 29124 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29174 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1298: -#line 8917 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8915 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; (yyval.num)= DYN_COL_INT; lex->charset= NULL; lex->length= lex->dec= 0; } -#line 29135 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29185 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1299: -#line 8924 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8922 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; (yyval.num)= DYN_COL_UINT; lex->charset= NULL; lex->length= lex->dec= 0; } -#line 29146 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29196 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1300: -#line 8931 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8929 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; (yyval.num)= DYN_COL_DOUBLE; lex->charset= NULL; lex->length= lex->dec= 0; } -#line 29157 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29207 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1301: -#line 8938 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8936 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; (yyval.num)= DYN_COL_DOUBLE; lex->charset= NULL; lex->length= lex->dec= 0; } -#line 29168 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29218 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1302: -#line 8945 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8943 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; (yyval.num)= DYN_COL_DOUBLE; lex->charset= NULL; lex->length= lex->dec= 0; } -#line 29179 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29229 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1303: -#line 8952 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8950 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= DYN_COL_DECIMAL; Lex->charset= NULL; } -#line 29188 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29238 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1304: -#line 8957 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8955 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->charset= thd->variables.collation_connection; } -#line 29194 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29244 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1305: -#line 8959 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8957 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; (yyval.num)= DYN_COL_STRING; lex->length= lex->dec= 0; } -#line 29204 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29254 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1306: -#line 8965 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8963 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; (yyval.num)= DYN_COL_STRING; lex->charset= national_charset_info; lex->length= lex->dec= 0; } -#line 29215 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29265 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1307: -#line 8972 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8970 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; (yyval.num)= DYN_COL_DATE; lex->charset= NULL; lex->length= lex->dec= 0; } -#line 29226 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29276 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1308: -#line 8979 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8977 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; (yyval.num)= DYN_COL_TIME; @@ -29234,11 +29284,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->dec= lex->length; lex->length= 0; } -#line 29238 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29288 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1309: -#line 8987 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8985 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; (yyval.num)= DYN_COL_DATETIME; @@ -29246,11 +29296,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->dec= lex->length; lex->length= 0; } -#line 29250 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29300 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1310: -#line 8998 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 8996 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; (yyval.dyncol_def)= (DYNCALL_CREATE_DEF *) @@ -29270,31 +29320,31 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); else (yyval.dyncol_def)->len= 0; } -#line 29274 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29324 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1311: -#line 9020 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9018 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.dyncol_def_list)= new (thd->mem_root) List; if ((yyval.dyncol_def_list) == NULL) MYSQL_YYABORT; (yyval.dyncol_def_list)->push_back((yyvsp[0].dyncol_def), thd->mem_root); } -#line 29285 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29335 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1312: -#line 9027 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9025 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyvsp[-2].dyncol_def_list)->push_back((yyvsp[0].dyncol_def), thd->mem_root); (yyval.dyncol_def_list)= (yyvsp[-2].dyncol_def_list); } -#line 29294 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29344 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1318: -#line 9040 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9038 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item *i1= new (thd->mem_root) Item_string(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length, @@ -29305,113 +29355,113 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29309 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29359 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1320: -#line 9051 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9049 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= (yyvsp[0].item_param); } -#line 29315 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29365 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1323: -#line 9055 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9053 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_concat(thd, (yyvsp[-2].item), (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29325 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29375 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1324: -#line 9061 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9059 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= (yyvsp[0].item); } -#line 29333 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29383 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1325: -#line 9065 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9063 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_neg(thd, (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29343 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29393 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1326: -#line 9071 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9069 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_bit_neg(thd, (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29353 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29403 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1327: -#line 9077 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9075 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= negate_expression(thd, (yyvsp[0].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29363 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29413 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1328: -#line 9083 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9081 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_singlerow_subselect(thd, (yyvsp[-1].select_lex)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29373 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29423 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1329: -#line 9089 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9087 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= (yyvsp[-1].item); } -#line 29379 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29429 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1330: -#line 9091 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9089 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); (yyval.item)= new (thd->mem_root) Item_row(thd, *(yyvsp[-1].item_list)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29390 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29440 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1331: -#line 9098 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9096 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); (yyval.item)= new (thd->mem_root) Item_row(thd, *(yyvsp[-1].item_list)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29401 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29451 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1332: -#line 9105 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9103 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_exists_subselect(thd, (yyvsp[-1].select_lex)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29411 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29461 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1333: -#line 9111 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9109 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= NULL; /* @@ -29435,11 +29485,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) (yyval.item)= (yyvsp[-1].item); } -#line 29439 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29489 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1334: -#line 9135 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9133 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyvsp[-5].item_list)->push_front((yyvsp[-2].item), thd->mem_root); Item_func_match *i1= new (thd->mem_root) Item_func_match(thd, *(yyvsp[-5].item_list), @@ -29449,22 +29499,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Select->add_ftfunc_to_list(thd, i1); (yyval.item)= i1; } -#line 29453 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29503 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1335: -#line 9145 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9143 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= create_func_cast(thd, (yyvsp[0].item), ITEM_CAST_CHAR, NULL, NULL, &my_charset_bin); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29464 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29514 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1336: -#line 9152 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9150 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; (yyval.item)= create_func_cast(thd, (yyvsp[-3].item), (yyvsp[-1].cast_type), lex->length, lex->dec, @@ -29472,42 +29522,42 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29476 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29526 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1337: -#line 9160 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9158 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_case(thd, *(yyvsp[-2].item_list), (yyvsp[-3].item), (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29486 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29536 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1338: -#line 9166 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9164 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= create_func_cast(thd, (yyvsp[-3].item), (yyvsp[-1].cast_type), Lex->length, Lex->dec, Lex->charset); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29497 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29547 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1339: -#line 9173 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9171 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_conv_charset(thd, (yyvsp[-3].item), (yyvsp[-1].charset)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29507 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29557 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1340: -#line 9179 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9177 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item_splocal *il= (yyvsp[-1].item)->get_item_splocal(); if (il) @@ -29517,52 +29567,52 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29521 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29571 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1341: -#line 9189 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9187 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_insert_value(thd, Lex->current_context(), (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29532 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29582 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1342: -#line 9197 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9195 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[0].item), (yyvsp[-3].item), (yyvsp[-2].interval), 0); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29542 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29592 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1343: -#line 9212 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9210 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_char(thd, *(yyvsp[-1].item_list)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29552 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29602 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1344: -#line 9218 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9216 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_char(thd, *(yyvsp[-3].item_list), (yyvsp[-1].charset)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29562 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29612 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1345: -#line 9224 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9222 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_current_user(thd, Lex->current_context()); @@ -29571,11 +29621,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); Lex->safe_to_cache_query= 0; } -#line 29575 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29625 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1346: -#line 9233 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9231 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_current_role(thd, Lex->current_context()); @@ -29584,51 +29634,51 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); Lex->safe_to_cache_query= 0; } -#line 29588 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29638 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1347: -#line 9242 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9240 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_date_typecast(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29598 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29648 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1348: -#line 9248 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9246 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_dayofmonth(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29608 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29658 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1349: -#line 9254 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9252 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_hour(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29618 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29668 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1350: -#line 9260 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9258 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_insert(thd, (yyvsp[-7].item), (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29628 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29678 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1351: -#line 9266 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9264 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { List *list= new (thd->mem_root) List; if (list == NULL) @@ -29642,11 +29692,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29646 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29696 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1352: -#line 9280 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9278 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); (yyvsp[-1].item_list)->push_front((yyvsp[-5].item), thd->mem_root); @@ -29657,173 +29707,173 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29661 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29711 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1353: -#line 9291 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9289 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_left(thd, (yyvsp[-3].item), (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29671 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29721 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1354: -#line 9297 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9295 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_minute(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29681 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29731 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1355: -#line 9303 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9301 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_month(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29691 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29741 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1356: -#line 9309 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9307 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_right(thd, (yyvsp[-3].item), (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29701 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29751 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1357: -#line 9315 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9313 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_second(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29711 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29761 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1358: -#line 9321 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9319 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_time_typecast(thd, (yyvsp[-1].item), AUTO_SEC_PART_DIGITS); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29722 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29772 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1359: -#line 9328 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9326 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_datetime_typecast(thd, (yyvsp[-1].item), AUTO_SEC_PART_DIGITS); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29733 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29783 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1360: -#line 9335 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9333 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_add_time(thd, (yyvsp[-3].item), (yyvsp[-1].item), 1, 0); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29743 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29793 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1361: -#line 9341 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9339 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_trim(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29753 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29803 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1362: -#line 9347 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9345 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_ltrim(thd, (yyvsp[-1].item), (yyvsp[-3].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29763 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29813 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1363: -#line 9353 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9351 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_rtrim(thd, (yyvsp[-1].item), (yyvsp[-3].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29773 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29823 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1364: -#line 9359 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9357 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_trim(thd, (yyvsp[-1].item), (yyvsp[-3].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29783 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29833 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1365: -#line 9365 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9363 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_ltrim(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29793 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29843 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1366: -#line 9371 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9369 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_rtrim(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29803 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29853 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1367: -#line 9377 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9375 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_trim(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29813 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29863 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1368: -#line 9383 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9381 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_trim(thd, (yyvsp[-1].item), (yyvsp[-3].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29823 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29873 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1369: -#line 9389 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9387 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_user(thd); if ((yyval.item) == NULL) @@ -29831,186 +29881,186 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); Lex->safe_to_cache_query=0; } -#line 29835 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29885 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1370: -#line 9397 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9395 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_year(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29845 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29895 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1371: -#line 9418 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9416 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-3].item), (yyvsp[-1].item), INTERVAL_DAY, 0); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29856 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29906 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1372: -#line 9425 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9423 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 0); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29866 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29916 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1373: -#line 9431 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9429 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_curdate_local(thd); if ((yyval.item) == NULL) MYSQL_YYABORT; Lex->safe_to_cache_query=0; } -#line 29877 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29927 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1374: -#line 9438 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9436 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_curtime_local(thd, (yyvsp[0].num)); if ((yyval.item) == NULL) MYSQL_YYABORT; Lex->safe_to_cache_query=0; } -#line 29888 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29938 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1375: -#line 9446 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9444 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 0); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29898 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29948 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1376: -#line 9453 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9451 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 1); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29908 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29958 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1377: -#line 9459 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9457 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)=new (thd->mem_root) Item_extract(thd, (yyvsp[-3].interval), (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29918 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29968 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1378: -#line 9465 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9463 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_get_format(thd, (yyvsp[-3].date_time_type), (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29928 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29978 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1379: -#line 9471 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9469 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_now_local(thd, (yyvsp[0].num)); if ((yyval.item) == NULL) MYSQL_YYABORT; Lex->safe_to_cache_query=0; } -#line 29939 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29989 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1380: -#line 9478 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9476 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_locate(thd, (yyvsp[-1].item), (yyvsp[-3].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29949 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 29999 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1381: -#line 9484 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9482 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-3].item), (yyvsp[-1].item), INTERVAL_DAY, 1); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29960 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30010 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1382: -#line 9491 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9489 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 1); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29970 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30020 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1383: -#line 9497 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9495 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_substr(thd, (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29980 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30030 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1384: -#line 9503 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9501 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_substr(thd, (yyvsp[-3].item), (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 29990 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30040 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1385: -#line 9509 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9507 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_substr(thd, (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30000 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30050 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1386: -#line 9515 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9513 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_substr(thd, (yyvsp[-3].item), (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30010 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30060 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1387: -#line 9521 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9519 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* Unlike other time-related functions, SYSDATE() is @@ -30028,104 +30078,104 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; Lex->safe_to_cache_query=0; } -#line 30032 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30082 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1388: -#line 9539 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9537 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-1].item), (yyvsp[-3].item), (yyvsp[-5].interval_time_st), 0); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30042 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30092 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1389: -#line 9545 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9543 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_timestamp_diff(thd, (yyvsp[-3].item), (yyvsp[-1].item), (yyvsp[-5].interval_time_st)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30052 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30102 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1390: -#line 9551 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9549 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_curdate_utc(thd); if ((yyval.item) == NULL) MYSQL_YYABORT; Lex->safe_to_cache_query=0; } -#line 30063 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30113 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1391: -#line 9558 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9556 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_curtime_utc(thd, (yyvsp[0].num)); if ((yyval.item) == NULL) MYSQL_YYABORT; Lex->safe_to_cache_query=0; } -#line 30074 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30124 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1392: -#line 9565 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9563 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_now_utc(thd, (yyvsp[0].num)); if ((yyval.item) == NULL) MYSQL_YYABORT; Lex->safe_to_cache_query=0; } -#line 30085 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30135 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1393: -#line 9573 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9571 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= create_func_dyncol_add(thd, (yyvsp[-3].item), *(yyvsp[-1].dyncol_def_list)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30095 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30145 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1394: -#line 9580 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9578 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= create_func_dyncol_delete(thd, (yyvsp[-3].item), *(yyvsp[-1].item_list)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30105 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30155 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1395: -#line 9587 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9585 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_dyncol_check(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30115 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30165 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1396: -#line 9594 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9592 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= create_func_dyncol_create(thd, *(yyvsp[-1].dyncol_def_list)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30125 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30175 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1397: -#line 9601 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9599 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; (yyval.item)= create_func_dyncol_get(thd, (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].cast_type), @@ -30134,133 +30184,133 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30138 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30188 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1398: -#line 9618 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9616 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_ascii(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30148 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30198 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1399: -#line 9624 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9622 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_charset(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30158 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30208 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1400: -#line 9630 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9628 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_coalesce(thd, *(yyvsp[-1].item_list)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30168 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30218 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1401: -#line 9636 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9634 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_collation(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30178 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30228 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1402: -#line 9642 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9640 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_database(thd); if ((yyval.item) == NULL) MYSQL_YYABORT; Lex->safe_to_cache_query=0; } -#line 30189 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30239 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1403: -#line 9649 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9647 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_if(thd, (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30199 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30249 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1404: -#line 9655 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9653 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_format(thd, (yyvsp[-3].item), (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30209 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30259 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1405: -#line 9661 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9659 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_format(thd, (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30219 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30269 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1406: -#line 9667 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9665 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_last_value(thd, *(yyvsp[-1].item_list)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30229 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30279 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1407: -#line 9673 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9671 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_microsecond(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30239 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30289 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1408: -#line 9679 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9677 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_mod(thd, (yyvsp[-3].item), (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30249 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30299 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1409: -#line 9685 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9683 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_password(thd, (yyvsp[-1].item), Item_func_password::OLD); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30260 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30310 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1410: -#line 9692 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9690 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item* i1; i1= new (thd->mem_root) Item_func_password(thd, (yyvsp[-1].item)); @@ -30268,51 +30318,51 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; (yyval.item)= i1; } -#line 30272 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30322 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1411: -#line 9700 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9698 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_quarter(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30282 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30332 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1412: -#line 9706 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9704 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_repeat(thd, (yyvsp[-3].item), (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30292 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30342 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1413: -#line 9712 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9710 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_replace(thd, (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30302 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30352 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1414: -#line 9718 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9716 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_reverse(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30312 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30362 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1415: -#line 9724 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9722 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_row_count(thd); if ((yyval.item) == NULL) @@ -30320,21 +30370,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); Lex->safe_to_cache_query= 0; } -#line 30324 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30374 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1416: -#line 9732 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9730 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_round(thd, (yyvsp[-3].item), (yyvsp[-1].item), 1); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30334 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30384 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1417: -#line 9738 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9736 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item *i1; LEX_STRING name= {C_STRING_WITH_LEN("default_week_format")}; @@ -30348,31 +30398,31 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30352 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30402 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1418: -#line 9752 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9750 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_week(thd, (yyvsp[-3].item), (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30362 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30412 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1419: -#line 9758 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9756 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_weight_string(thd, (yyvsp[-2].item), 0, 0, (yyvsp[-1].ulong_num)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30372 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30422 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1420: -#line 9764 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9762 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_weight_string(thd, (yyvsp[-5].item), 0, (yyvsp[-2].ulong_num), @@ -30380,11 +30430,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30384 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30434 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1421: -#line 9772 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9770 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item *item= new (thd->mem_root) Item_char_typecast(thd, (yyvsp[-4].item), (yyvsp[-1].ulong_num), &my_charset_bin); @@ -30396,22 +30446,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30400 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30450 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1422: -#line 9784 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9782 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_weight_string(thd, (yyvsp[-7].item), (yyvsp[-5].ulong_num), (yyvsp[-3].ulong_num), (yyvsp[-1].ulong_num)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30411 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30461 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1423: -#line 9791 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9789 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { #ifdef HAVE_SPATIAL (yyval.item)= (yyvsp[0].item); @@ -30423,95 +30473,95 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); sym_group_geom.needed_define)); #endif } -#line 30427 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30477 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1424: -#line 9806 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9804 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= GEOM_NEW(thd, Item_func_spatial_precise_rel(thd, (yyvsp[-3].item), (yyvsp[-1].item), Item_func::SP_CONTAINS_FUNC)); } -#line 30437 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30487 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1425: -#line 9812 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9810 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= GEOM_NEW(thd, Item_func_spatial_collection(thd, *(yyvsp[-1].item_list), Geometry::wkb_geometrycollection, Geometry::wkb_point)); } -#line 30448 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30498 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1426: -#line 9819 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9817 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= GEOM_NEW(thd, Item_func_spatial_collection(thd, *(yyvsp[-1].item_list), Geometry::wkb_linestring, Geometry::wkb_point)); } -#line 30459 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30509 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1427: -#line 9826 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9824 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= GEOM_NEW(thd, Item_func_spatial_collection(thd, *(yyvsp[-1].item_list), Geometry::wkb_multilinestring, Geometry::wkb_linestring)); } -#line 30470 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30520 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1428: -#line 9833 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9831 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= GEOM_NEW(thd, Item_func_spatial_collection(thd, *(yyvsp[-1].item_list), Geometry::wkb_multipoint, Geometry::wkb_point)); } -#line 30481 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30531 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1429: -#line 9840 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9838 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= GEOM_NEW(thd, Item_func_spatial_collection(thd, *(yyvsp[-1].item_list), Geometry::wkb_multipolygon, Geometry::wkb_polygon)); } -#line 30492 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30542 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1430: -#line 9847 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9845 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= GEOM_NEW(thd, Item_func_point(thd, (yyvsp[-3].item), (yyvsp[-1].item))); } -#line 30500 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30550 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1431: -#line 9851 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9849 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= GEOM_NEW(thd, Item_func_spatial_collection(thd, *(yyvsp[-1].item_list), Geometry::wkb_polygon, Geometry::wkb_linestring)); } -#line 30511 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30561 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1432: -#line 9870 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9868 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { #ifdef HAVE_DLOPEN udf_func *udf= 0; @@ -30530,11 +30580,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.udf)= udf; #endif } -#line 30534 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30584 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1433: -#line 9889 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9887 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Create_func *builder; Item *item= NULL; @@ -30587,11 +30637,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 30591 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30641 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1434: -#line 9942 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9940 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Create_qfunc *builder; Item *item= NULL; @@ -30626,79 +30676,79 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 30630 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30680 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1435: -#line 9980 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9978 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= (yyvsp[-1].num) | (yyvsp[0].num); } -#line 30636 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30686 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1436: -#line 9982 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9980 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= FT_BOOL; } -#line 30642 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30692 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1437: -#line 9986 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9984 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= FT_NL; } -#line 30648 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30698 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1438: -#line 9987 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9985 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= FT_NL; } -#line 30654 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30704 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1439: -#line 9991 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9989 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0; } -#line 30660 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30710 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1440: -#line 9992 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9990 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= FT_EXPAND; } -#line 30666 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30716 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1441: -#line 9996 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9994 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item_list)= NULL; } -#line 30672 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30722 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1442: -#line 9997 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 9995 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item_list)= (yyvsp[0].item_list); } -#line 30678 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30728 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1443: -#line 10002 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10000 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item_list)= new (thd->mem_root) List; if ((yyval.item_list) == NULL) MYSQL_YYABORT; (yyval.item_list)->push_back((yyvsp[0].item), thd->mem_root); } -#line 30689 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30739 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1444: -#line 10009 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10007 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root); (yyval.item_list)= (yyvsp[-2].item_list); } -#line 30698 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30748 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1445: -#line 10017 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10015 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* Use Item::name as a storage for the attribute value of user @@ -30722,61 +30772,61 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyvsp[-2].item)->set_name((yyvsp[-3].simple_string), (uint) ((yyvsp[-1].simple_string) - (yyvsp[-3].simple_string)), thd->charset()); (yyval.item)= (yyvsp[-2].item); } -#line 30726 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30776 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1446: -#line 10044 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10042 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_sum_avg(thd, (yyvsp[-1].item), FALSE); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30736 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30786 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1447: -#line 10050 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10048 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_sum_avg(thd, (yyvsp[-1].item), TRUE); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30746 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30796 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1448: -#line 10056 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10054 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_sum_and(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30756 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30806 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1449: -#line 10062 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10060 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_sum_or(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30766 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30816 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1450: -#line 10068 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10066 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_sum_xor(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30776 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30826 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1451: -#line 10074 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10072 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item *item= new (thd->mem_root) Item_int(thd, (int32) 0L, 1); if (item == NULL) @@ -30785,149 +30835,149 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30789 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30839 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1452: -#line 10083 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10081 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_sum_count(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30799 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30849 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1453: -#line 10089 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10087 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->in_sum_expr++; } -#line 30805 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30855 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1454: -#line 10091 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10089 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->in_sum_expr--; } -#line 30811 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30861 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1455: -#line 10093 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10091 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_sum_count(thd, *(yyvsp[-2].item_list)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30821 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30871 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1456: -#line 10099 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10097 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_sum_min(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30831 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30881 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1457: -#line 10110 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10108 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_sum_min(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30841 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30891 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1458: -#line 10116 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10114 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_sum_max(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30851 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30901 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1459: -#line 10122 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10120 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_sum_max(thd, (yyvsp[-1].item)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30861 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30911 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1460: -#line 10128 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10126 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_sum_std(thd, (yyvsp[-1].item), 0); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30871 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30921 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1461: -#line 10134 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10132 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_sum_variance(thd, (yyvsp[-1].item), 0); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30881 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30931 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1462: -#line 10140 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10138 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_sum_std(thd, (yyvsp[-1].item), 1); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30891 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30941 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1463: -#line 10146 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10144 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_sum_variance(thd, (yyvsp[-1].item), 1); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30901 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30951 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1464: -#line 10152 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10150 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_sum_sum(thd, (yyvsp[-1].item), FALSE); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30911 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30961 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1465: -#line 10158 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10156 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_sum_sum(thd, (yyvsp[-1].item), TRUE); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 30921 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30971 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1466: -#line 10164 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10162 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->in_sum_expr++; } -#line 30927 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30977 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1467: -#line 10168 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10166 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { SELECT_LEX *sel= Select; sel->in_sum_expr--; @@ -30939,28 +30989,28 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyvsp[-3].item_list)->empty(); sel->gorder_list.empty(); } -#line 30943 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 30993 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1468: -#line 10183 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10181 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (! Lex->parsing_options.allows_variable) my_yyabort_error((ER_VIEW_SELECT_VARIABLE, MYF(0))); } -#line 30952 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31002 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1469: -#line 10188 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10186 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= (yyvsp[0].item); } -#line 30960 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31010 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1470: -#line 10195 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10193 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item_func_set_user_var *item; (yyval.item)= item= new (thd->mem_root) Item_func_set_user_var(thd, (yyvsp[-2].lex_str), (yyvsp[0].item)); @@ -30970,11 +31020,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->uncacheable(UNCACHEABLE_SIDEEFFECT); lex->set_var_list.push_back(item, thd->mem_root); } -#line 30974 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31024 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1471: -#line 10205 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10203 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_func_get_user_var(thd, (yyvsp[0].lex_str)); if ((yyval.item) == NULL) @@ -30982,11 +31032,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); LEX *lex= Lex; lex->uncacheable(UNCACHEABLE_SIDEEFFECT); } -#line 30986 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31036 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1472: -#line 10213 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10211 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* disallow "SELECT @@global.global.variable" */ if ((yyvsp[-1].lex_str).str && (yyvsp[0].lex_str).str && check_reserved_words(&(yyvsp[-1].lex_str))) @@ -30999,39 +31049,39 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (!((Item_func_get_system_var*) (yyval.item))->is_written_to_binlog()) Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_VARIABLE); } -#line 31003 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31053 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1473: -#line 10228 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10226 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num) = 0; } -#line 31009 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31059 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1474: -#line 10229 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10227 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num) = 1; } -#line 31015 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31065 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1475: -#line 10234 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10232 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.string)= new (thd->mem_root) String(",", 1, &my_charset_latin1); if ((yyval.string) == NULL) MYSQL_YYABORT; } -#line 31025 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31075 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1476: -#line 10239 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10237 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.string) = (yyvsp[0].string); } -#line 31031 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31081 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1478: -#line 10245 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10243 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; SELECT_LEX *sel= lex->current_select; @@ -31043,23 +31093,23 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); "CUBE/ROLLUP", "ORDER BY")); } } -#line 31047 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31097 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1480: -#line 10261 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10259 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (add_gorder_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num))) MYSQL_YYABORT; } -#line 31053 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31103 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1481: -#line 10263 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10261 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (add_gorder_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num))) MYSQL_YYABORT; } -#line 31059 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31109 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1482: -#line 10268 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10266 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->current_select->inc_in_sum_expr()) @@ -31068,206 +31118,206 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 31072 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31122 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1483: -#line 10277 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10275 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->in_sum_expr--; (yyval.item)= (yyvsp[0].item); } -#line 31081 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31131 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1484: -#line 10285 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10283 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cast_type)=ITEM_CAST_CHAR; Lex->charset= &my_charset_bin; Lex->dec= 0; } -#line 31087 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31137 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1485: -#line 10287 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10285 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->charset= thd->variables.collation_connection; } -#line 31093 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31143 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1486: -#line 10289 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10287 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cast_type)=ITEM_CAST_CHAR; Lex->dec= 0; } -#line 31099 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31149 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1487: -#line 10291 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10289 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cast_type)=ITEM_CAST_CHAR; Lex->charset= national_charset_info; Lex->dec=0; } -#line 31105 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31155 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1488: -#line 10293 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10291 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cast_type)=ITEM_CAST_SIGNED_INT; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } -#line 31111 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31161 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1489: -#line 10295 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10293 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cast_type)=ITEM_CAST_SIGNED_INT; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } -#line 31117 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31167 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1490: -#line 10297 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10295 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cast_type)=ITEM_CAST_SIGNED_INT; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } -#line 31123 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31173 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1491: -#line 10299 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10297 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cast_type)=ITEM_CAST_UNSIGNED_INT; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } -#line 31129 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31179 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1492: -#line 10301 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10299 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cast_type)=ITEM_CAST_UNSIGNED_INT; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } -#line 31135 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31185 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1493: -#line 10303 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10301 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cast_type)=ITEM_CAST_DATE; Lex->charset= NULL; Lex->dec=Lex->length= (char*)0; } -#line 31141 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31191 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1494: -#line 10305 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10303 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cast_type)=ITEM_CAST_TIME; LEX *lex= Lex; lex->charset= NULL; lex->dec= lex->length; lex->length= (char*)0; } -#line 31151 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31201 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1495: -#line 10311 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10309 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cast_type)=ITEM_CAST_DATETIME; LEX *lex= Lex; lex->charset= NULL; lex->dec= lex->length; lex->length= (char*)0; } -#line 31161 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31211 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1496: -#line 10317 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10315 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cast_type)=ITEM_CAST_DECIMAL; Lex->charset= NULL; } -#line 31167 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31217 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1497: -#line 10319 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10317 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->charset= NULL; Lex->length= Lex->dec= 0;} -#line 31173 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31223 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1498: -#line 10321 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10319 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.cast_type)=ITEM_CAST_DOUBLE; } -#line 31179 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31229 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1499: -#line 10324 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10322 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item_list)= NULL; } -#line 31185 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31235 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1500: -#line 10325 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10323 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item_list)= (yyvsp[0].item_list);} -#line 31191 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31241 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1501: -#line 10330 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10328 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item_list)= new (thd->mem_root) List; if ((yyval.item_list) == NULL) MYSQL_YYABORT; (yyval.item_list)->push_back((yyvsp[0].item), thd->mem_root); } -#line 31202 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31252 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1502: -#line 10337 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10335 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root); (yyval.item_list)= (yyvsp[-2].item_list); } -#line 31211 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31261 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1503: -#line 10344 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10342 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item_list)= (yyvsp[0].item_list); } -#line 31217 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31267 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1504: -#line 10345 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10343 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item_list)= (yyvsp[-1].item_list); } -#line 31223 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31273 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1505: -#line 10350 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10348 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item_list)= new (thd->mem_root) List; if ((yyval.item_list) == NULL) MYSQL_YYABORT; (yyval.item_list)->push_back((yyvsp[0].item), thd->mem_root); } -#line 31234 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31284 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1506: -#line 10357 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10355 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root); (yyval.item_list)= (yyvsp[-2].item_list); } -#line 31243 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31293 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1507: -#line 10364 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10362 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= NULL; } -#line 31249 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31299 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1508: -#line 10365 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10363 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= (yyvsp[0].item); } -#line 31255 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31305 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1509: -#line 10369 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10367 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= NULL; } -#line 31261 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31311 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1510: -#line 10370 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10368 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= (yyvsp[0].item); } -#line 31267 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31317 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1511: -#line 10375 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10373 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item_list)= new (thd->mem_root) List; if ((yyval.item_list) == NULL) @@ -31275,27 +31325,27 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.item_list)->push_back((yyvsp[-2].item), thd->mem_root); (yyval.item_list)->push_back((yyvsp[0].item), thd->mem_root); } -#line 31279 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31329 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1512: -#line 10383 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10381 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyvsp[-4].item_list)->push_back((yyvsp[-2].item), thd->mem_root); (yyvsp[-4].item_list)->push_back((yyvsp[0].item), thd->mem_root); (yyval.item_list)= (yyvsp[-4].item_list); } -#line 31289 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31339 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1513: -#line 10393 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10391 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.table_list)=(yyvsp[0].table_list); } -#line 31295 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31345 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1514: -#line 10395 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10393 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (!((yyval.table_list)= lex->current_select->nest_last_join(thd))) @@ -31304,49 +31354,49 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 31308 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31358 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1515: -#line 10406 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10404 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS((yyval.table_list)=(yyvsp[0].table_list)); } -#line 31314 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31364 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1516: -#line 10417 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10415 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.table_list)=(yyvsp[0].table_list); } -#line 31320 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31370 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1517: -#line 10418 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10416 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.table_list)=(yyvsp[-1].table_list); } -#line 31326 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31376 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1518: -#line 10424 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10422 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.table_list)=(yyvsp[0].table_list); } -#line 31332 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31382 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1519: -#line 10426 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10424 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS((yyvsp[-2].table_list) && ((yyval.table_list)=(yyvsp[0].table_list))); } -#line 31340 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31390 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1520: -#line 10446 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10444 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS((yyvsp[-2].table_list) && ((yyval.table_list)=(yyvsp[0].table_list))); (yyvsp[0].table_list)->straight=(yyvsp[-1].num); } -#line 31346 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31396 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1521: -#line 10449 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10447 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS((yyvsp[-3].table_list) && (yyvsp[-1].table_list)); /* Change the current name resolution context to a local context. */ @@ -31354,50 +31404,50 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; Select->parsing_place= IN_ON; } -#line 31358 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31408 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1522: -#line 10457 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10455 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyvsp[-3].table_list)->straight=(yyvsp[-4].num); add_join_on(thd, (yyvsp[-3].table_list), (yyvsp[0].item)); Lex->pop_context(); Select->parsing_place= NO_MATTER; } -#line 31369 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31419 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1523: -#line 10465 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10463 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS((yyvsp[-3].table_list) && (yyvsp[-1].table_list)); } -#line 31377 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31427 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1524: -#line 10469 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10467 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyvsp[-5].table_list)->straight=(yyvsp[-6].num); add_join_natural((yyvsp[-7].table_list),(yyvsp[-5].table_list),(yyvsp[-1].string_list),Select); (yyval.table_list)=(yyvsp[-5].table_list); } -#line 31387 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31437 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1525: -#line 10475 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10473 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS((yyvsp[-3].table_list) && ((yyval.table_list)=(yyvsp[0].table_list))); (yyvsp[0].table_list)->straight=(yyvsp[-1].num); add_join_natural((yyvsp[-3].table_list),(yyvsp[0].table_list),NULL,Select); } -#line 31397 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31447 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1526: -#line 10484 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10482 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[-1].table_list)); /* Change the current name resolution context to a local context. */ @@ -31405,11 +31455,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; Select->parsing_place= IN_ON; } -#line 31409 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31459 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1527: -#line 10492 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10490 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { add_join_on(thd, (yyvsp[-3].table_list), (yyvsp[0].item)); Lex->pop_context(); @@ -31417,40 +31467,40 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.table_list)=(yyvsp[-3].table_list); Select->parsing_place= NO_MATTER; } -#line 31421 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31471 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1528: -#line 10500 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10498 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS((yyvsp[-4].table_list) && (yyvsp[0].table_list)); } -#line 31429 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31479 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1529: -#line 10504 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10502 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { add_join_natural((yyvsp[-9].table_list),(yyvsp[-5].table_list),(yyvsp[-1].string_list),Select); (yyvsp[-5].table_list)->outer_join|=JOIN_TYPE_LEFT; (yyval.table_list)=(yyvsp[-5].table_list); } -#line 31439 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31489 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1530: -#line 10510 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10508 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[0].table_list)); add_join_natural((yyvsp[-5].table_list),(yyvsp[0].table_list),NULL,Select); (yyvsp[0].table_list)->outer_join|=JOIN_TYPE_LEFT; (yyval.table_list)=(yyvsp[0].table_list); } -#line 31450 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31500 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1531: -#line 10520 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10518 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[-1].table_list)); /* Change the current name resolution context to a local context. */ @@ -31458,11 +31508,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; Select->parsing_place= IN_ON; } -#line 31462 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31512 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1532: -#line 10528 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10526 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (!((yyval.table_list)= lex->current_select->convert_right_join())) @@ -31471,30 +31521,30 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Lex->pop_context(); Select->parsing_place= NO_MATTER; } -#line 31475 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31525 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1533: -#line 10537 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10535 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS((yyvsp[-4].table_list) && (yyvsp[0].table_list)); } -#line 31483 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31533 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1534: -#line 10541 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10539 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (!((yyval.table_list)= lex->current_select->convert_right_join())) MYSQL_YYABORT; add_join_natural((yyval.table_list),(yyvsp[-5].table_list),(yyvsp[-1].string_list),Select); } -#line 31494 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31544 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1535: -#line 10548 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10546 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[0].table_list)); add_join_natural((yyvsp[0].table_list),(yyvsp[-5].table_list),NULL,Select); @@ -31502,64 +31552,64 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (!((yyval.table_list)= lex->current_select->convert_right_join())) MYSQL_YYABORT; } -#line 31506 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31556 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1536: -#line 10559 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10557 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num) = 0; } -#line 31512 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31562 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1537: -#line 10560 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10558 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num) = 0; } -#line 31518 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31568 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1538: -#line 10561 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10559 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num) = 1; } -#line 31524 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31574 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1539: -#line 10565 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10563 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num) = (yyvsp[0].num); } -#line 31530 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31580 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1540: -#line 10566 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10564 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num) = 0; } -#line 31536 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31586 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1541: -#line 10574 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10572 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.string_list)= 0;} -#line 31542 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31592 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1543: -#line 10580 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10578 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.string_list)= (yyvsp[-2].string_list); } -#line 31550 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31600 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1544: -#line 10594 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10592 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { SELECT_LEX *sel= Select; sel->table_join_options= 0; } -#line 31559 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31609 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1545: -#line 10599 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10597 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!((yyval.table_list)= Select->add_table_to_list(thd, (yyvsp[-3].table), (yyvsp[-1].lex_str_ptr), Select->get_table_join_options(), @@ -31570,11 +31620,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; Select->add_joined_table((yyval.table_list)); } -#line 31574 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31624 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1546: -#line 10610 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10608 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; SELECT_LEX *sel= lex->current_select; @@ -31592,11 +31642,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); /* incomplete derived tables return NULL, we must be nested in select_derived rule to be here. */ } -#line 31596 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31646 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1547: -#line 10646 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10644 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* Use $2 instead of Lex->current_select as derived table will alter value of Lex->current_select. */ @@ -31659,11 +31709,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); !(yyval.table_list)->derived->first_select()->next_select()) (yyval.table_list)->select_lex->add_where_field((yyval.table_list)->derived->first_select()); } -#line 31663 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31713 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1548: -#line 10731 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10729 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if ((yyvsp[-1].table_list) && (yyvsp[0].num)) { @@ -31671,20 +31721,20 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 31675 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31725 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1549: -#line 10741 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10739 "/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 31684 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31734 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1550: -#line 10746 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10744 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* Remove from the name resolution context stack the context of the @@ -31698,11 +31748,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 31702 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31752 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1551: -#line 10764 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10762 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->current_select->set_braces(0)) @@ -31711,11 +31761,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 31715 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31765 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1552: -#line 10776 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10774 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; SELECT_LEX *sel= lex->current_select; @@ -31723,28 +31773,28 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); mysql_init_select(lex); lex->current_select->parsing_place= SELECT_LIST; } -#line 31727 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31777 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1553: -#line 10784 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10782 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->parsing_place= NO_MATTER; } -#line 31735 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31785 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1554: -#line 10792 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10790 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if ((yyvsp[0].select_lex)->init_nested_join(thd)) MYSQL_YYABORT; } -#line 31744 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31794 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1555: -#line 10797 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10795 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* for normal joins, $3 != NULL and end_nested_join() != NULL, for derived tables, both must equal NULL */ @@ -31757,11 +31807,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 31761 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31811 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1556: -#line 10812 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10810 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->derived_tables|= DERIVED_SUBQUERY; @@ -31778,25 +31828,25 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->current_select->linkage= DERIVED_TABLE_TYPE; lex->current_select->parsing_place= SELECT_LIST; } -#line 31782 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31832 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1557: -#line 10829 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10827 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->parsing_place= NO_MATTER; } -#line 31790 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31840 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1559: -#line 10836 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10834 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.select_lex)= Select; } -#line 31796 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31846 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1560: -#line 10841 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10839 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; @@ -31816,113 +31866,113 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); !embedding->nested_join->join_list.elements; /* return true if we are deeply nested */ } -#line 31820 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31870 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1561: -#line 10863 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10861 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 31826 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31876 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1562: -#line 10864 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10862 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 31832 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31882 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1563: -#line 10869 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10867 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= thd->variables.old_mode ? INDEX_HINT_MASK_JOIN : INDEX_HINT_MASK_ALL; } -#line 31840 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31890 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1564: -#line 10872 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10870 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= INDEX_HINT_MASK_JOIN; } -#line 31846 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31896 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1565: -#line 10873 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10871 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= INDEX_HINT_MASK_ORDER; } -#line 31852 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31902 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1566: -#line 10874 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10872 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= INDEX_HINT_MASK_GROUP; } -#line 31858 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31908 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1567: -#line 10878 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10876 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.index_hint)= INDEX_HINT_FORCE; } -#line 31864 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31914 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1568: -#line 10879 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10877 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.index_hint)= INDEX_HINT_IGNORE; } -#line 31870 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31920 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1569: -#line 10884 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10882 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->set_index_hint_type((yyvsp[-2].index_hint), (yyvsp[0].num)); } -#line 31878 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31928 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1571: -#line 10889 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10887 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->set_index_hint_type(INDEX_HINT_USE, (yyvsp[0].num)); } -#line 31886 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31936 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1576: -#line 10902 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10900 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->alloc_index_hints(thd); } -#line 31892 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31942 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1578: -#line 10906 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10904 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->clear_index_hints(); } -#line 31898 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31948 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1580: -#line 10911 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10909 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->add_index_hint(thd, NULL, 0); } -#line 31904 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31954 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1581: -#line 10912 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10910 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 31910 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31960 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1582: -#line 10917 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10915 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->add_index_hint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); } -#line 31916 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31966 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1583: -#line 10919 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10917 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->add_index_hint(thd, (char *)"PRIMARY", 7); } -#line 31922 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31972 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1586: -#line 10929 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10927 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!((yyval.string_list)= new (thd->mem_root) List)) MYSQL_YYABORT; @@ -31933,11 +31983,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; (yyval.string_list)->push_back(s, thd->mem_root); } -#line 31937 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 31987 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1587: -#line 10940 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10938 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { String *s= new (thd->mem_root) String((const char *) (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length, @@ -31947,191 +31997,191 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyvsp[-2].string_list)->push_back(s, thd->mem_root); (yyval.string_list)= (yyvsp[-2].string_list); } -#line 31951 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32001 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1588: -#line 10952 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10950 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 31957 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32007 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1589: -#line 10953 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10951 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval)=INTERVAL_DAY_HOUR; } -#line 31963 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32013 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1590: -#line 10954 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10952 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval)=INTERVAL_DAY_MICROSECOND; } -#line 31969 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32019 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1591: -#line 10955 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10953 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval)=INTERVAL_DAY_MINUTE; } -#line 31975 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32025 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1592: -#line 10956 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10954 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval)=INTERVAL_DAY_SECOND; } -#line 31981 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32031 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1593: -#line 10957 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10955 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval)=INTERVAL_HOUR_MICROSECOND; } -#line 31987 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32037 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1594: -#line 10958 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10956 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval)=INTERVAL_HOUR_MINUTE; } -#line 31993 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32043 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1595: -#line 10959 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10957 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval)=INTERVAL_HOUR_SECOND; } -#line 31999 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32049 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1596: -#line 10960 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10958 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval)=INTERVAL_MINUTE_MICROSECOND; } -#line 32005 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32055 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1597: -#line 10961 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10959 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval)=INTERVAL_MINUTE_SECOND; } -#line 32011 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32061 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1598: -#line 10962 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10960 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval)=INTERVAL_SECOND_MICROSECOND; } -#line 32017 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32067 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1599: -#line 10963 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10961 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval)=INTERVAL_YEAR_MONTH; } -#line 32023 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32073 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1600: -#line 10967 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10965 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval_time_st)=INTERVAL_DAY; } -#line 32029 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32079 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1601: -#line 10968 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10966 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval_time_st)=INTERVAL_WEEK; } -#line 32035 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32085 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1602: -#line 10969 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10967 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval_time_st)=INTERVAL_HOUR; } -#line 32041 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32091 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1603: -#line 10970 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10968 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval_time_st)=INTERVAL_MINUTE; } -#line 32047 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32097 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1604: -#line 10971 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10969 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval_time_st)=INTERVAL_MONTH; } -#line 32053 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32103 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1605: -#line 10972 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10970 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval_time_st)=INTERVAL_QUARTER; } -#line 32059 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32109 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1606: -#line 10973 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10971 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval_time_st)=INTERVAL_SECOND; } -#line 32065 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32115 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1607: -#line 10974 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10972 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval_time_st)=INTERVAL_MICROSECOND; } -#line 32071 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32121 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1608: -#line 10975 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10973 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.interval_time_st)=INTERVAL_YEAR; } -#line 32077 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32127 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1609: -#line 10979 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10977 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {(yyval.date_time_type)=MYSQL_TIMESTAMP_DATE;} -#line 32083 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32133 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1610: -#line 10980 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10978 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {(yyval.date_time_type)=MYSQL_TIMESTAMP_TIME;} -#line 32089 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32139 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1611: -#line 10981 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10979 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {(yyval.date_time_type)=MYSQL_TIMESTAMP_DATETIME;} -#line 32095 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32145 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1612: -#line 10982 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10980 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {(yyval.date_time_type)=MYSQL_TIMESTAMP_DATETIME;} -#line 32101 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32151 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1616: -#line 10992 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10990 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str_ptr)=0; } -#line 32107 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32157 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1617: -#line 10994 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 10992 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str_ptr)= (LEX_STRING*) thd->memdup(&(yyvsp[0].lex_str),sizeof(LEX_STRING)); if ((yyval.lex_str_ptr) == NULL) MYSQL_YYABORT; } -#line 32117 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32167 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1620: -#line 11007 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11005 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->where= 0; } -#line 32123 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32173 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1621: -#line 11009 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11007 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->parsing_place= IN_WHERE; } -#line 32131 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32181 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1622: -#line 11013 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11011 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { SELECT_LEX *select= Select; select->where= normalize_cond(thd, (yyvsp[0].item)); @@ -32139,19 +32189,19 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyvsp[0].item)) (yyvsp[0].item)->top_level_item(); } -#line 32143 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32193 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1624: -#line 11025 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11023 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->parsing_place= IN_HAVING; } -#line 32151 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32201 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1625: -#line 11029 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11027 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { SELECT_LEX *sel= Select; sel->having= normalize_cond(thd, (yyvsp[0].item)); @@ -32159,20 +32209,20 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyvsp[0].item)) (yyvsp[0].item)->top_level_item(); } -#line 32163 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32213 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1626: -#line 11040 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11038 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->escape_used= TRUE; (yyval.item)= (yyvsp[0].item); } -#line 32172 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32222 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1627: -#line 11045 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11043 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->escape_used= FALSE; (yyval.item)= ((thd->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES) ? @@ -32181,29 +32231,29 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 32185 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32235 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1630: -#line 11066 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11064 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (add_group_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num))) MYSQL_YYABORT; } -#line 32191 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32241 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1631: -#line 11068 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11066 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (add_group_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num))) MYSQL_YYABORT; } -#line 32197 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32247 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1632: -#line 11072 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11070 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 32203 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32253 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1633: -#line 11074 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11072 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* 'WITH CUBE' is reserved in the MySQL syntax, but not implemented, @@ -32220,11 +32270,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); my_yyabort_error((ER_NOT_SUPPORTED_YET, MYF(0), "CUBE")); } -#line 32224 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32274 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1634: -#line 11091 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11089 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* 'WITH ROLLUP' is needed for backward compatibility, @@ -32239,21 +32289,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); "global union parameters")); lex->current_select->olap= ROLLUP_TYPE; } -#line 32243 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32293 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1638: -#line 11122 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11120 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { bool ascending= ((yyvsp[0].num) == 1) ? true : false; if (add_order_to_list(thd, (yyvsp[-1].item), ascending)) MYSQL_YYABORT; } -#line 32253 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32303 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1641: -#line 11140 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11138 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; SELECT_LEX *sel= lex->current_select; @@ -32296,61 +32346,61 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->current_select= sel->master_unit()->fake_select_lex; } } -#line 32300 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32350 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1642: -#line 11183 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11181 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 32308 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32358 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1643: -#line 11190 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11188 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (add_order_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num))) MYSQL_YYABORT; } -#line 32314 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32364 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1644: -#line 11192 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11190 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (add_order_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num))) MYSQL_YYABORT; } -#line 32320 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32370 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1645: -#line 11196 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11194 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num) = 1; } -#line 32326 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32376 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1646: -#line 11197 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11195 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num) =1; } -#line 32332 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32382 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1647: -#line 11198 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11196 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num) =0; } -#line 32338 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32388 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1648: -#line 11202 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11200 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 32344 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32394 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1649: -#line 11203 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11201 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 32350 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32400 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1650: -#line 11208 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11206 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { SELECT_LEX *sel= Select; if (sel->master_unit()->is_union() && !sel->braces) @@ -32360,71 +32410,71 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); DBUG_ASSERT(Select); } } -#line 32364 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32414 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1651: -#line 11221 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11219 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { SELECT_LEX *sel= Select; if (!sel->select_limit->basic_const_item() || sel->select_limit->val_int() > 0) Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); } -#line 32375 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32425 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1652: -#line 11229 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11227 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); } -#line 32383 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32433 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1653: -#line 11233 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11231 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); } -#line 32391 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32441 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1654: -#line 11240 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11238 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { SELECT_LEX *sel= Select; sel->select_limit= (yyvsp[0].item); sel->offset_limit= 0; sel->explicit_limit= 1; } -#line 32402 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32452 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1655: -#line 11247 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11245 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { SELECT_LEX *sel= Select; sel->select_limit= (yyvsp[0].item); sel->offset_limit= (yyvsp[-2].item); sel->explicit_limit= 1; } -#line 32413 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32463 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1656: -#line 11254 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11252 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { SELECT_LEX *sel= Select; sel->select_limit= (yyvsp[-2].item); sel->offset_limit= (yyvsp[0].item); sel->explicit_limit= 1; } -#line 32424 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32474 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1657: -#line 11264 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11262 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item_splocal *splocal; LEX *lex= thd->lex; @@ -32451,258 +32501,258 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); splocal->limit_clause_param= TRUE; (yyval.item)= splocal; } -#line 32455 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32505 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1658: -#line 11291 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11289 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyvsp[0].item_param)->limit_clause_param= TRUE; } -#line 32463 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32513 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1659: -#line 11295 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11293 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 32473 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32523 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1660: -#line 11301 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11299 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 32483 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32533 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1661: -#line 11307 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11305 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 32493 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32543 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1662: -#line 11316 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11314 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->limit_rows_examined= (yyvsp[0].item); } -#line 32502 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32552 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1663: -#line 11323 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11321 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->current_select->select_limit= 0; } -#line 32511 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32561 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1664: -#line 11328 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11326 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { SELECT_LEX *sel= Select; sel->select_limit= (yyvsp[0].item); Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); sel->explicit_limit= 1; } -#line 32522 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32572 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1665: -#line 11334 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11332 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { my_parse_error(thd, ER_SYNTAX_ERROR); MYSQL_YYABORT; } -#line 32528 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32578 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1666: -#line 11335 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11333 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { my_parse_error(thd, ER_SYNTAX_ERROR); MYSQL_YYABORT; } -#line 32534 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32584 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1667: -#line 11339 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11337 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.num)= (int) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32540 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32590 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1668: -#line 11340 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11338 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.num)= -(int) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32546 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32596 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1669: -#line 11341 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11339 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.num)= -(int) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32552 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32602 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1670: -#line 11345 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11343 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32558 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32608 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1671: -#line 11346 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11344 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= (ulong) strtol((yyvsp[0].lex_str).str, (char**) 0, 16); } -#line 32564 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32614 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1672: -#line 11347 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11345 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32570 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32620 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1673: -#line 11348 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11346 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32576 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32626 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1674: -#line 11349 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11347 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32582 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32632 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1675: -#line 11350 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11348 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32588 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32638 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1676: -#line 11354 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11352 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32594 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32644 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1677: -#line 11355 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11353 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulong_num)= (ulong) strtol((yyvsp[0].lex_str).str, (char**) 0, 16); } -#line 32600 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32650 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1678: -#line 11356 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11354 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32606 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32656 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1679: -#line 11357 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11355 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32612 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32662 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1680: -#line 11358 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11356 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT; } -#line 32618 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32668 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1681: -#line 11362 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11360 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32624 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32674 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1682: -#line 11363 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11361 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32630 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32680 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1683: -#line 11364 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11362 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32636 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32686 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1684: -#line 11365 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11363 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32642 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32692 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1685: -#line 11366 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11364 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32648 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32698 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1686: -#line 11370 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11368 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32654 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32704 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1687: -#line 11371 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11369 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32660 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32710 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1688: -#line 11372 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11370 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ulonglong_number)= strtoull((yyvsp[0].lex_str).str, (char**) 0, 16); } -#line 32666 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32716 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1689: -#line 11373 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11371 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } -#line 32672 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32722 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1690: -#line 11374 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11372 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { MYSQL_YYABORT; } -#line 32678 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32728 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1691: -#line 11379 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11377 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { my_parse_error(thd, ER_ONLY_INTEGERS_ALLOWED); } -#line 32684 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32734 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1694: -#line 11388 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11386 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.choice)= (yyvsp[0].ulong_num) != 0 ? HA_CHOICE_YES : HA_CHOICE_NO; } -#line 32690 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32740 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1695: -#line 11389 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11387 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.choice)= HA_CHOICE_UNDEF; } -#line 32696 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32746 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1696: -#line 11393 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11391 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= false; } -#line 32702 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32752 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1697: -#line 11395 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11393 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; @@ -32731,67 +32781,67 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); */ Lex->expr_allows_subselect= false; } -#line 32735 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32785 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1698: -#line 11424 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11422 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* Subqueries are allowed from now.*/ Lex->expr_allows_subselect= true; (yyval.num)= true; } -#line 32745 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32795 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1699: -#line 11432 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11430 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 32751 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32801 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1700: -#line 11433 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11431 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 32757 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32807 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1703: -#line 11443 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11441 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (add_proc_to_list(thd, (yyvsp[-1].item))) MYSQL_YYABORT; if (!(yyvsp[-1].item)->name) (yyvsp[-1].item)->set_name((yyvsp[-2].simple_string), (uint) ((yyvsp[0].simple_string) - (yyvsp[-2].simple_string)), thd->charset()); } -#line 32768 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32818 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1704: -#line 11452 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11450 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (!lex->describe && (!(lex->result= new (thd->mem_root) select_dumpvar(thd)))) MYSQL_YYABORT; } -#line 32779 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32829 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1705: -#line 11459 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11457 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 32785 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32835 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1707: -#line 11464 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11462 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 32791 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32841 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1708: -#line 11468 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11466 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->result) { @@ -32808,19 +32858,19 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); DBUG_ASSERT(Lex->describe); } } -#line 32812 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32862 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1709: -#line 11488 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11486 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.myvar) = Lex->result ? new (thd->mem_root) my_var_user((yyvsp[0].lex_str)) : NULL; } -#line 32820 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32870 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1710: -#line 11492 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11490 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { sp_variable *t; @@ -32831,32 +32881,32 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); Lex->sphead)) : NULL; } -#line 32835 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32885 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1711: -#line 11505 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11503 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= false; } -#line 32841 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32891 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1712: -#line 11506 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11504 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= true; } -#line 32847 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32897 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1713: -#line 11511 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11509 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (! Lex->parsing_options.allows_select_into) my_yyabort_error((ER_VIEW_SELECT_CLAUSE, MYF(0), "INTO")); } -#line 32856 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32906 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1715: -#line 11520 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11518 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->uncacheable(UNCACHEABLE_SIDEEFFECT); @@ -32866,17 +32916,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); new (thd->mem_root) select_export(thd, lex->exchange))) MYSQL_YYABORT; } -#line 32870 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32920 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1716: -#line 11530 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11528 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->exchange->cs= (yyvsp[0].charset); } -#line 32876 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32926 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1718: -#line 11533 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11531 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (!lex->describe) @@ -32889,60 +32939,60 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 32893 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32943 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1719: -#line 11546 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11544 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); } -#line 32901 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32951 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1720: -#line 11557 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11555 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command = SQLCOM_DO; mysql_init_select(lex); } -#line 32911 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32961 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1721: -#line 11563 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11561 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->insert_list= (yyvsp[0].item_list); } -#line 32919 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32969 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1722: -#line 11574 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11572 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->set_command(SQLCOM_DROP_TABLE, (yyvsp[-2].num), (yyvsp[0].object_ddl_options)); YYPS->m_lock_type= TL_UNLOCK; YYPS->m_mdl_type= MDL_EXCLUSIVE; } -#line 32930 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32980 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1723: -#line 11581 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11579 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 32936 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32986 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1724: -#line 11582 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11580 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 32942 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 32992 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1725: -#line 11583 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11581 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; Alter_drop *ad= (new (thd->mem_root) @@ -32959,21 +33009,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MDL_SHARED_UPGRADABLE)) MYSQL_YYABORT; } -#line 32963 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33013 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1726: -#line 11600 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11598 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->set_command(SQLCOM_DROP_DB, (yyvsp[-1].object_ddl_options)); lex->name= (yyvsp[0].lex_str); } -#line 32973 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33023 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1727: -#line 11606 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11604 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; sp_name *spname; @@ -32988,11 +33038,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); spname->init_qname(thd); lex->spname= spname; } -#line 32992 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33042 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1728: -#line 11621 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11619 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; LEX_STRING db= {0, 0}; @@ -33008,11 +33058,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); spname->init_qname(thd); lex->spname= spname; } -#line 33012 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33062 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1729: -#line 11637 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11635 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (lex->sphead) @@ -33020,90 +33070,90 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->set_command(SQLCOM_DROP_PROCEDURE, (yyvsp[-1].object_ddl_options)); lex->spname= (yyvsp[0].spname); } -#line 33024 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33074 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1730: -#line 11645 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11643 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->set_command(SQLCOM_DROP_USER, (yyvsp[-2].object_ddl_options)); } -#line 33032 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33082 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1731: -#line 11649 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11647 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->set_command(SQLCOM_DROP_ROLE, (yyvsp[-2].object_ddl_options)); } -#line 33040 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33090 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1732: -#line 11653 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11651 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->set_command(SQLCOM_DROP_VIEW, (yyvsp[0].object_ddl_options)); YYPS->m_lock_type= TL_UNLOCK; YYPS->m_mdl_type= MDL_EXCLUSIVE; } -#line 33051 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33101 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1733: -#line 11660 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11658 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33057 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33107 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1734: -#line 11662 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11660 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->spname= (yyvsp[0].spname); Lex->set_command(SQLCOM_DROP_EVENT, (yyvsp[-1].object_ddl_options)); } -#line 33066 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33116 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1735: -#line 11667 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11665 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->set_command(SQLCOM_DROP_TRIGGER, (yyvsp[-1].object_ddl_options)); lex->spname= (yyvsp[0].spname); } -#line 33076 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33126 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1736: -#line 11673 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11671 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->ts_cmd_type= DROP_TABLESPACE; } -#line 33085 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33135 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1737: -#line 11678 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11676 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->alter_tablespace_info->ts_cmd_type= DROP_LOGFILE_GROUP; } -#line 33094 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33144 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1738: -#line 11683 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11681 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->set_command(SQLCOM_DROP_SERVER, (yyvsp[-1].object_ddl_options)); Lex->server_options.reset((yyvsp[0].lex_str)); } -#line 33103 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33153 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1741: -#line 11696 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11694 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!Select->add_table_to_list(thd, (yyvsp[0].table), NULL, TL_OPTION_UPDATING, @@ -33111,11 +33161,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); YYPS->m_mdl_type)) MYSQL_YYABORT; } -#line 33115 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33165 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1742: -#line 11707 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11705 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!Select->add_table_to_list(thd, (yyvsp[-1].table), NULL, TL_OPTION_UPDATING, @@ -33125,11 +33175,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyvsp[0].string_list))) MYSQL_YYABORT; } -#line 33129 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33179 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1745: -#line 11725 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11723 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!Select->add_table_to_list(thd, (yyvsp[0].table), NULL, TL_OPTION_UPDATING | TL_OPTION_ALIAS, @@ -33137,109 +33187,109 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); YYPS->m_mdl_type)) MYSQL_YYABORT; } -#line 33141 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33191 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1746: -#line 11736 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11734 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_exists= FALSE; (yyval.num)= 0; } -#line 33150 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33200 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1747: -#line 11741 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11739 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->check_exists= TRUE; (yyval.num)= 1; } -#line 33159 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33209 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1748: -#line 11749 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11747 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.object_ddl_options).set(DDL_options_st::OPT_NONE); } -#line 33167 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33217 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1749: -#line 11753 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11751 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.object_ddl_options).set(DDL_options_st::OPT_IF_EXISTS); } -#line 33175 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33225 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1750: -#line 11759 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11757 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0; } -#line 33181 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33231 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1751: -#line 11760 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11758 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= HA_LEX_CREATE_TMP_TABLE; } -#line 33187 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33237 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1752: -#line 11768 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11766 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_INSERT; lex->duplicates= DUP_ERROR; mysql_init_select(lex); } -#line 33198 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33248 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1753: -#line 11776 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11774 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->set_lock_for_tables((yyvsp[-2].lock_type)); Lex->current_select= &Lex->select_lex; } -#line 33207 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33257 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1754: -#line 11781 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11779 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33213 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33263 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1755: -#line 11786 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11784 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command = SQLCOM_REPLACE; lex->duplicates= DUP_REPLACE; mysql_init_select(lex); } -#line 33224 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33274 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1756: -#line 11793 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11791 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->set_lock_for_tables((yyvsp[-1].lock_type)); Lex->current_select= &Lex->select_lex; } -#line 33233 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33283 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1757: -#line 11798 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11796 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33239 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33289 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1758: -#line 11803 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11801 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* If it is SP we do not allow insert optimisation when result of @@ -33248,17 +33298,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); */ (yyval.lock_type)= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); } -#line 33252 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33302 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1759: -#line 11811 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11809 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lock_type)= TL_WRITE_LOW_PRIORITY; } -#line 33258 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33308 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1760: -#line 11813 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11811 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->keyword_delayed_begin_offset= (uint)(YYLIP->get_tok_start() - thd->query()); @@ -33266,23 +33316,23 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); YYLIP->yyLength() + 1; (yyval.lock_type)= TL_WRITE_DELAYED; } -#line 33270 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33320 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1761: -#line 11820 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11818 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lock_type)= TL_WRITE; } -#line 33276 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33326 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1762: -#line 11824 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11822 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lock_type)= (yyvsp[0].lock_type); } -#line 33282 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33332 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1763: -#line 11826 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11824 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->keyword_delayed_begin_offset= (uint)(YYLIP->get_tok_start() - thd->query()); @@ -33290,222 +33340,222 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); YYLIP->yyLength() + 1; (yyval.lock_type)= TL_WRITE_DELAYED; } -#line 33294 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33344 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1764: -#line 11836 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11834 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33300 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33350 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1765: -#line 11837 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11835 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33306 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33356 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1766: -#line 11842 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11840 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->field_list.empty(); lex->many_values.empty(); lex->insert_list=0; } -#line 33317 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33367 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1767: -#line 11850 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11848 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33323 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33373 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1768: -#line 11851 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11849 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33329 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33379 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1769: -#line 11852 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11850 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33335 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33385 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1770: -#line 11854 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11852 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (!(lex->insert_list= new (thd->mem_root) List_item) || lex->many_values.push_back(lex->insert_list, thd->mem_root)) MYSQL_YYABORT; } -#line 33346 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33396 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1772: -#line 11865 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11863 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } -#line 33352 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33402 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1773: -#line 11866 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11864 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } -#line 33358 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33408 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1774: -#line 11870 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11868 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33364 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33414 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1775: -#line 11871 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11869 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33370 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33420 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1776: -#line 11873 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11871 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->set_braces(0);} -#line 33376 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33426 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1777: -#line 11874 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11872 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33382 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33432 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1778: -#line 11876 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11874 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->set_braces(1);} -#line 33388 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33438 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1779: -#line 11877 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11875 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33394 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33444 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1784: -#line 11892 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11890 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (lex->field_list.push_back((yyvsp[-2].item), thd->mem_root) || lex->insert_list->push_back((yyvsp[0].item), thd->mem_root)) MYSQL_YYABORT; } -#line 33405 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33455 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1785: -#line 11901 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11899 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33411 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33461 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1786: -#line 11902 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11900 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33417 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33467 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1787: -#line 11906 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11904 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33423 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33473 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1788: -#line 11907 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11905 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33429 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33479 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1789: -#line 11912 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11910 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!(Lex->insert_list= new (thd->mem_root) List_item)) MYSQL_YYABORT; } -#line 33438 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33488 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1790: -#line 11917 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11915 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (lex->many_values.push_back(lex->insert_list, thd->mem_root)) MYSQL_YYABORT; } -#line 33448 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33498 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1791: -#line 11925 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11923 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33454 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33504 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1793: -#line 11931 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11929 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->insert_list->push_back((yyvsp[0].item), thd->mem_root)) MYSQL_YYABORT; } -#line 33463 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33513 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1794: -#line 11936 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11934 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->insert_list->push_back((yyvsp[0].item), thd->mem_root)) MYSQL_YYABORT; } -#line 33472 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33522 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1795: -#line 11943 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11941 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= (yyvsp[0].item);} -#line 33478 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33528 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1796: -#line 11945 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11943 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_default_value(thd, Lex->current_context()); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 33488 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33538 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1798: -#line 11954 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11952 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->duplicates= DUP_UPDATE; } -#line 33494 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33544 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1800: -#line 11962 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11960 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; mysql_init_select(lex); lex->sql_command= SQLCOM_UPDATE; lex->duplicates= DUP_ERROR; } -#line 33505 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33555 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1801: -#line 11970 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11968 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->select_lex.table_list.elements > 1) @@ -33524,49 +33574,49 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); */ Select->set_lock_for_tables((yyvsp[-4].lock_type)); } -#line 33528 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33578 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1802: -#line 11988 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11986 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33534 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33584 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1805: -#line 11998 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 11996 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (add_item_to_list(thd, (yyvsp[-2].item)) || add_value_to_list(thd, (yyvsp[0].item))) MYSQL_YYABORT; } -#line 33543 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33593 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1808: -#line 12011 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12009 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->update_list.push_back((yyvsp[-2].item), thd->mem_root) || lex->value_list.push_back((yyvsp[0].item), thd->mem_root)) MYSQL_YYABORT; } -#line 33554 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33604 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1809: -#line 12020 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12018 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lock_type)= TL_WRITE_DEFAULT; } -#line 33560 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33610 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1810: -#line 12021 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12019 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lock_type)= TL_WRITE_LOW_PRIORITY; } -#line 33566 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33616 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1811: -#line 12028 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12026 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_DELETE; @@ -33577,11 +33627,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->ignore= 0; lex->select_lex.init_order(); } -#line 33581 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33631 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1813: -#line 12043 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12041 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!Select->add_table_to_list(thd, (yyvsp[-1].table), NULL, TL_OPTION_UPDATING, YYPS->m_lock_type, @@ -33592,61 +33642,61 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); YYPS->m_lock_type= TL_READ_DEFAULT; YYPS->m_mdl_type= MDL_SHARED_READ; } -#line 33596 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33646 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1814: -#line 12054 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12052 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33602 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33652 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1815: -#line 12055 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12053 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33608 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33658 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1816: -#line 12057 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12055 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { mysql_init_multi_delete(Lex); YYPS->m_lock_type= TL_READ_DEFAULT; YYPS->m_mdl_type= MDL_SHARED_READ; } -#line 33618 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33668 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1817: -#line 12063 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12061 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (multi_delete_set_locks_and_link_aux_tables(Lex)) MYSQL_YYABORT; } -#line 33627 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33677 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1818: -#line 12068 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12066 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { mysql_init_multi_delete(Lex); YYPS->m_lock_type= TL_READ_DEFAULT; YYPS->m_mdl_type= MDL_SHARED_READ; } -#line 33637 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33687 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1819: -#line 12074 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12072 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (multi_delete_set_locks_and_link_aux_tables(Lex)) MYSQL_YYABORT; } -#line 33646 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33696 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1824: -#line 12092 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12090 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Table_ident *ti= new (thd->mem_root) Table_ident((yyvsp[-1].lex_str)); if (ti == NULL) @@ -33659,11 +33709,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); YYPS->m_mdl_type)) MYSQL_YYABORT; } -#line 33663 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33713 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1825: -#line 12105 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12103 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Table_ident *ti= new (thd->mem_root) Table_ident(thd, (yyvsp[-3].lex_str), (yyvsp[-1].lex_str), 0); if (ti == NULL) @@ -33676,53 +33726,53 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); YYPS->m_mdl_type)) MYSQL_YYABORT; } -#line 33680 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33730 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1826: -#line 12120 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12118 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33686 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33736 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1827: -#line 12121 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12119 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33692 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33742 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1828: -#line 12125 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12123 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33698 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33748 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1829: -#line 12126 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12124 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 33704 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33754 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1830: -#line 12130 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12128 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->options|= OPTION_QUICK; } -#line 33710 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33760 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1831: -#line 12131 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12129 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { YYPS->m_lock_type= TL_WRITE_LOW_PRIORITY; } -#line 33716 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33766 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1832: -#line 12132 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12130 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ignore= 1; } -#line 33722 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33772 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1833: -#line 12137 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12135 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX* lex= Lex; lex->sql_command= SQLCOM_TRUNCATE; @@ -33733,11 +33783,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); YYPS->m_lock_type= TL_WRITE; YYPS->m_mdl_type= MDL_EXCLUSIVE; } -#line 33737 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33787 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1834: -#line 12148 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12146 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX* lex= thd->lex; DBUG_ASSERT(!lex->m_sql_cmd); @@ -33745,99 +33795,99 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->m_sql_cmd == NULL) MYSQL_YYABORT; } -#line 33749 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33799 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1841: -#line 12172 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12170 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->profile_options|= PROFILE_CPU; } -#line 33757 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33807 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1842: -#line 12176 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12174 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->profile_options|= PROFILE_MEMORY; } -#line 33765 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33815 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1843: -#line 12180 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12178 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->profile_options|= PROFILE_BLOCK_IO; } -#line 33773 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33823 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1844: -#line 12184 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12182 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->profile_options|= PROFILE_CONTEXT; } -#line 33781 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33831 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1845: -#line 12188 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12186 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->profile_options|= PROFILE_PAGE_FAULTS; } -#line 33789 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33839 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1846: -#line 12192 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12190 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->profile_options|= PROFILE_IPC; } -#line 33797 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33847 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1847: -#line 12196 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12194 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->profile_options|= PROFILE_SWAPS; } -#line 33805 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33855 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1848: -#line 12200 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12198 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->profile_options|= PROFILE_SOURCE; } -#line 33813 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33863 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1849: -#line 12204 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12202 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->profile_options|= PROFILE_ALL; } -#line 33821 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33871 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1850: -#line 12211 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12209 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->profile_query_id= 0; } -#line 33829 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33879 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1851: -#line 12215 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12213 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->profile_query_id= atoi((yyvsp[0].lex_str).str); } -#line 33837 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33887 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1852: -#line 12224 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12222 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->wild=0; @@ -33846,30 +33896,30 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->current_select->parsing_place= SELECT_LIST; lex->create_info.init(); } -#line 33850 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33900 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1853: -#line 12233 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12231 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->parsing_place= NO_MATTER; } -#line 33858 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33908 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1854: -#line 12240 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12238 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_DATABASES; if (prepare_schema_table(thd, lex, 0, SCH_SCHEMATA)) MYSQL_YYABORT; } -#line 33869 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33919 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1855: -#line 12247 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12245 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_TABLES; @@ -33877,11 +33927,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (prepare_schema_table(thd, lex, 0, SCH_TABLE_NAMES)) MYSQL_YYABORT; } -#line 33881 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33931 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1856: -#line 12255 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12253 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_TRIGGERS; @@ -33889,11 +33939,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (prepare_schema_table(thd, lex, 0, SCH_TRIGGERS)) MYSQL_YYABORT; } -#line 33893 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33943 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1857: -#line 12263 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12261 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_EVENTS; @@ -33901,11 +33951,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (prepare_schema_table(thd, lex, 0, SCH_EVENTS)) MYSQL_YYABORT; } -#line 33905 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33955 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1858: -#line 12271 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12269 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_TABLE_STATUS; @@ -33913,11 +33963,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (prepare_schema_table(thd, lex, 0, SCH_TABLES)) MYSQL_YYABORT; } -#line 33917 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33967 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1859: -#line 12279 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12277 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_OPEN_TABLES; @@ -33925,55 +33975,55 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (prepare_schema_table(thd, lex, 0, SCH_OPEN_TABLES)) MYSQL_YYABORT; } -#line 33929 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33979 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1860: -#line 12287 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12285 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_PLUGINS; if (prepare_schema_table(thd, lex, 0, SCH_PLUGINS)) MYSQL_YYABORT; } -#line 33940 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 33990 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1861: -#line 12294 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12292 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ident= (yyvsp[0].lex_str); Lex->sql_command= SQLCOM_SHOW_PLUGINS; if (prepare_schema_table(thd, Lex, 0, SCH_ALL_PLUGINS)) MYSQL_YYABORT; } -#line 33951 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34001 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1862: -#line 12301 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12299 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command= SQLCOM_SHOW_PLUGINS; if (prepare_schema_table(thd, Lex, 0, SCH_ALL_PLUGINS)) MYSQL_YYABORT; } -#line 33961 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34011 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1863: -#line 12307 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12305 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.db_type= (yyvsp[-1].db_type); } -#line 33967 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34017 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1864: -#line 12309 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12307 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_info.db_type= NULL; } -#line 33973 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34023 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1865: -#line 12311 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12309 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_FIELDS; @@ -33982,45 +34032,45 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (prepare_schema_table(thd, lex, (yyvsp[-2].table), SCH_COLUMNS)) MYSQL_YYABORT; } -#line 33986 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34036 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1866: -#line 12320 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12318 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_SHOW_BINLOGS; } -#line 33994 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34044 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1867: -#line 12324 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12322 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_SHOW_SLAVE_HOSTS; } -#line 34002 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34052 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1868: -#line 12328 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12326 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_BINLOG_EVENTS; } -#line 34011 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34061 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1870: -#line 12334 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12332 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_RELAYLOG_EVENTS; } -#line 34020 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34070 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1872: -#line 12339 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12337 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_KEYS; @@ -34029,90 +34079,90 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (prepare_schema_table(thd, lex, (yyvsp[-2].table), SCH_STATISTICS)) MYSQL_YYABORT; } -#line 34033 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34083 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1873: -#line 12348 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12346 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_SHOW_STORAGE_ENGINES; if (prepare_schema_table(thd, lex, 0, SCH_ENGINES)) MYSQL_YYABORT; } -#line 34044 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34094 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1874: -#line 12355 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12353 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_SHOW_AUTHORS; } -#line 34053 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34103 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1875: -#line 12360 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12358 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_SHOW_CONTRIBUTORS; } -#line 34062 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34112 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1876: -#line 12365 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12363 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_SHOW_PRIVILEGES; } -#line 34071 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34121 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1877: -#line 12370 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12368 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (void) create_select_for_variable("warning_count"); } -#line 34077 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34127 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1878: -#line 12372 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12370 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (void) create_select_for_variable("error_count"); } -#line 34083 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34133 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1879: -#line 12374 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12372 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_SHOW_WARNS;} -#line 34089 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34139 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1880: -#line 12376 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12374 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_SHOW_ERRORS;} -#line 34095 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34145 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1881: -#line 12378 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12376 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_SHOW_PROFILES; } -#line 34101 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34151 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1882: -#line 12380 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12378 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_PROFILE; if (prepare_schema_table(thd, lex, NULL, SCH_PROFILES) != 0) MYSQL_YYABORT; } -#line 34112 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34162 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1883: -#line 12387 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12385 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_STATUS; @@ -34120,17 +34170,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (prepare_schema_table(thd, lex, 0, SCH_SESSION_STATUS)) MYSQL_YYABORT; } -#line 34124 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34174 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1884: -#line 12395 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12393 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command= SQLCOM_SHOW_PROCESSLIST;} -#line 34130 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34180 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1885: -#line 12397 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12395 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_VARIABLES; @@ -34138,63 +34188,63 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (prepare_schema_table(thd, lex, 0, SCH_SESSION_VARIABLES)) MYSQL_YYABORT; } -#line 34142 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34192 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1886: -#line 12405 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12403 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_CHARSETS; if (prepare_schema_table(thd, lex, 0, SCH_CHARSETS)) MYSQL_YYABORT; } -#line 34153 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34203 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1887: -#line 12412 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12410 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_COLLATIONS; if (prepare_schema_table(thd, lex, 0, SCH_COLLATIONS)) MYSQL_YYABORT; } -#line 34164 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34214 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1888: -#line 12419 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12417 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command= SQLCOM_SHOW_GRANTS; if (!(Lex->grant_user= (LEX_USER*)thd->alloc(sizeof(LEX_USER)))) MYSQL_YYABORT; Lex->grant_user->user= current_user_and_current_role; } -#line 34175 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34225 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1889: -#line 12426 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12424 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_SHOW_GRANTS; lex->grant_user=(yyvsp[-1].lex_user); } -#line 34185 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34235 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1890: -#line 12432 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12430 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->set_command(SQLCOM_SHOW_CREATE_DB, (yyvsp[-1].object_ddl_options)); Lex->name= (yyvsp[0].lex_str); } -#line 34194 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34244 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1891: -#line 12437 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12435 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command = SQLCOM_SHOW_CREATE; @@ -34202,11 +34252,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; lex->create_info.storage_media= HA_SM_DEFAULT; } -#line 34206 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34256 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1892: -#line 12445 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12443 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command = SQLCOM_SHOW_CREATE; @@ -34214,140 +34264,140 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; lex->only_view= 1; } -#line 34218 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34268 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1893: -#line 12453 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12451 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_SHOW_MASTER_STAT; } -#line 34226 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34276 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1894: -#line 12457 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12455 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; Lex->verbose= 1; } -#line 34235 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34285 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1895: -#line 12462 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12460 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; lex->mi.connection_name= null_lex_str; lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; lex->verbose= 0; } -#line 34246 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34296 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1896: -#line 12469 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12467 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; Lex->verbose= 0; } -#line 34255 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34305 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1897: -#line 12474 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12472 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command = SQLCOM_SHOW_CREATE_PROC; lex->spname= (yyvsp[0].spname); } -#line 34266 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34316 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1898: -#line 12481 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12479 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command = SQLCOM_SHOW_CREATE_FUNC; lex->spname= (yyvsp[0].spname); } -#line 34277 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34327 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1899: -#line 12488 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12486 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_CREATE_TRIGGER; lex->spname= (yyvsp[0].spname); } -#line 34287 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34337 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1900: -#line 12494 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12492 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_STATUS_PROC; if (prepare_schema_table(thd, lex, 0, SCH_PROCEDURES)) MYSQL_YYABORT; } -#line 34298 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34348 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1901: -#line 12501 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12499 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_SHOW_STATUS_FUNC; if (prepare_schema_table(thd, lex, 0, SCH_PROCEDURES)) MYSQL_YYABORT; } -#line 34309 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34359 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1902: -#line 12508 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12506 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command= SQLCOM_SHOW_PROC_CODE; Lex->spname= (yyvsp[0].spname); } -#line 34318 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34368 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1903: -#line 12513 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12511 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command= SQLCOM_SHOW_FUNC_CODE; Lex->spname= (yyvsp[0].spname); } -#line 34327 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34377 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1904: -#line 12518 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12516 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->spname= (yyvsp[0].spname); Lex->sql_command = SQLCOM_SHOW_CREATE_EVENT; } -#line 34336 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34386 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1905: -#line 12523 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12521 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command= SQLCOM_SHOW_EXPLAIN; if (prepare_schema_table(thd, Lex, 0, SCH_EXPLAIN)) MYSQL_YYABORT; add_value_to_list(thd, (yyvsp[0].item)); } -#line 34347 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34397 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1906: -#line 12530 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12528 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; bool in_plugin; @@ -34366,83 +34416,83 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (make_schema_select(thd, Lex->current_select, table)) MYSQL_YYABORT; } -#line 34370 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34420 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1907: -#line 12552 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12550 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command= SQLCOM_SHOW_ENGINE_STATUS; } -#line 34376 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34426 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1908: -#line 12554 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12552 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command= SQLCOM_SHOW_ENGINE_MUTEX; } -#line 34382 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34432 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1909: -#line 12556 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12554 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command= SQLCOM_SHOW_ENGINE_LOGS; } -#line 34388 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34438 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1914: -#line 12570 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12568 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.simple_string)= 0; } -#line 34394 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34444 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1915: -#line 12571 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12569 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.simple_string)= (yyvsp[0].lex_str).str; } -#line 34400 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34450 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1916: -#line 12575 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12573 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->verbose=0; } -#line 34406 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34456 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1917: -#line 12576 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12574 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->verbose=1; } -#line 34412 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34462 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1920: -#line 12585 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12583 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.log_file_name = 0; } -#line 34418 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34468 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1921: -#line 12586 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12584 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.log_file_name = (yyvsp[0].lex_str).str; } -#line 34424 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34474 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1922: -#line 12590 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12588 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.pos = 4; /* skip magic number */ } -#line 34430 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34480 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1923: -#line 12591 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12589 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->mi.pos = (yyvsp[0].ulonglong_number); } -#line 34436 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34486 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1924: -#line 12595 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12593 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.simple_string)= 0; } -#line 34442 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34492 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1925: -#line 12597 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12595 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->wild= new (thd->mem_root) String((yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length, system_charset_info); @@ -34450,22 +34500,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; (yyval.simple_string)= (yyvsp[-1].simple_string); } -#line 34454 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34504 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1926: -#line 12605 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12603 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->where= normalize_cond(thd, (yyvsp[0].item)); if ((yyvsp[0].item)) (yyvsp[0].item)->top_level_item(); (yyval.simple_string)= (yyvsp[-1].simple_string); } -#line 34465 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34515 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1927: -#line 12616 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12614 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; mysql_init_select(lex); @@ -34476,66 +34526,66 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (prepare_schema_table(thd, lex, (yyvsp[0].table), SCH_COLUMNS)) MYSQL_YYABORT; } -#line 34480 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34530 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1928: -#line 12627 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12625 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->parsing_place= NO_MATTER; } -#line 34488 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34538 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1929: -#line 12631 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12629 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->describe|= DESCRIBE_NORMAL; } -#line 34494 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34544 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1930: -#line 12633 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12631 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->select_lex.options|= SELECT_DESCRIBE; } -#line 34503 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34553 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1938: -#line 12654 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12652 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->analyze_stmt= true; } -#line 34511 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34561 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1939: -#line 12660 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12658 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->describe|= DESCRIBE_EXTENDED; } -#line 34517 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34567 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1940: -#line 12661 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12659 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->describe|= DESCRIBE_PARTITIONS; } -#line 34523 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34573 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1941: -#line 12662 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12660 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 34529 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34579 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1942: -#line 12666 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12664 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 34535 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34585 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1943: -#line 12668 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12666 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!my_strcasecmp(system_charset_info, (yyvsp[0].lex_str).str, "JSON")) Lex->explain_json= true; @@ -34544,23 +34594,23 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); else my_yyabort_error((ER_UNKNOWN_EXPLAIN_FORMAT, MYF(0), (yyvsp[0].lex_str).str)); } -#line 34548 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34598 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1944: -#line 12679 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12677 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 34554 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34604 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1945: -#line 12680 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12678 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->wild= (yyvsp[0].string); } -#line 34560 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34610 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1946: -#line 12682 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12680 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->wild= new (thd->mem_root) String((const char*) (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length, @@ -34568,28 +34618,28 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (Lex->wild == NULL) MYSQL_YYABORT; } -#line 34572 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34622 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1947: -#line 12696 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12694 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_FLUSH; lex->type= 0; lex->no_write_to_binlog= (yyvsp[0].num); } -#line 34583 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34633 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1948: -#line 12703 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12701 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 34589 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34639 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1949: -#line 12708 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12706 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_TABLES; /* @@ -34599,23 +34649,23 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); YYPS->m_lock_type= TL_READ_NO_INSERT; YYPS->m_mdl_type= MDL_SHARED_HIGH_PRIO; } -#line 34603 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34653 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1950: -#line 12718 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12716 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 34609 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34659 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1952: -#line 12723 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12721 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 34615 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34665 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1953: -#line 12725 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12723 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { TABLE_LIST *tables= Lex->query_tables; for (; tables; tables= tables->next_global) @@ -34625,17 +34675,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); tables->open_type= OT_BASE_ONLY; /* Ignore temporary tables. */ } } -#line 34629 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34679 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1954: -#line 12738 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12736 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_READ_LOCK | (yyvsp[0].num); } -#line 34635 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34685 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1955: -#line 12740 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12738 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->query_tables == NULL) // Table list can't be empty { @@ -34644,53 +34694,53 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } Lex->type|= REFRESH_FOR_EXPORT; } -#line 34648 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34698 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1956: -#line 12747 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12745 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 34654 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34704 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1958: -#line 12753 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12751 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 34660 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34710 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1959: -#line 12758 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12756 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_ERROR_LOG; } -#line 34666 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34716 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1960: -#line 12760 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12758 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_ENGINE_LOG; } -#line 34672 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34722 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1961: -#line 12762 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12760 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_GENERAL_LOG; } -#line 34678 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34728 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1962: -#line 12764 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12762 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_SLOW_LOG; } -#line 34684 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34734 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1963: -#line 12766 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12764 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_BINARY_LOG; } -#line 34690 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34740 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1964: -#line 12768 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12766 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->type & REFRESH_RELAY_LOG) @@ -34698,44 +34748,44 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->type|= REFRESH_RELAY_LOG; lex->relay_log_connection_name= lex->mi.connection_name; } -#line 34702 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34752 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1965: -#line 12776 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12774 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_QUERY_CACHE_FREE; } -#line 34708 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34758 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1966: -#line 12778 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12776 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_HOSTS; } -#line 34714 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34764 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1967: -#line 12780 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12778 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_GRANT; } -#line 34720 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34770 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1968: -#line 12782 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12780 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_LOG; Lex->relay_log_connection_name= empty_lex_str; } -#line 34729 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34779 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1969: -#line 12787 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12785 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_STATUS; } -#line 34735 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34785 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1970: -#line 12789 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12787 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->type & REFRESH_SLAVE) @@ -34743,29 +34793,29 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->type|= REFRESH_SLAVE; lex->reset_slave_info.all= false; } -#line 34747 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34797 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1971: -#line 12797 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12795 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_MASTER; } -#line 34753 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34803 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1972: -#line 12799 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12797 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_DES_KEY_FILE; } -#line 34759 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34809 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1973: -#line 12801 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12799 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_USER_RESOURCES; } -#line 34765 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34815 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1974: -#line 12803 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12801 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_GENERIC; ST_SCHEMA_TABLE *table= find_schema_table(thd, (yyvsp[-1].lex_str).str); @@ -34778,138 +34828,158 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); thd->memdup(&(yyvsp[-1].lex_str), sizeof(LEX_STRING)), thd->mem_root); } -#line 34782 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34832 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1975: -#line 12818 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12816 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 34788 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34838 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1976: -#line 12819 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 12817 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 34794 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34844 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 1977: +#line 12821 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + {} +#line 34850 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ + break; + + case 1978: #line 12823 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + {} +#line 34856 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ + break; + + case 1982: +#line 12833 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + { + insert_dynamic(&Lex->delete_gtid_domain, (uchar*) &((yyvsp[0].ulong_num))); + } +#line 34864 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ + break; + + case 1983: +#line 12839 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {(yyval.num)= 0;} -#line 34800 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34870 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 1978: -#line 12824 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 1984: +#line 12840 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {(yyval.num)= REFRESH_CHECKPOINT; } -#line 34806 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34876 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 1979: -#line 12828 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 1985: +#line 12844 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_RESET; lex->type=0; } -#line 34815 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34885 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 1980: -#line 12833 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 1986: +#line 12849 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 34821 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34891 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 1983: -#line 12842 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 1989: +#line 12858 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_SLAVE; } -#line 34827 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34897 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 1984: -#line 12844 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 1990: +#line 12860 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 34833 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34903 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 1985: -#line 12846 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 1991: +#line 12862 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_MASTER; Lex->next_binlog_file_number= 0; } -#line 34842 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34912 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 1987: -#line 12851 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 1993: +#line 12867 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->type|= REFRESH_QUERY_CACHE;} -#line 34848 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34918 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 1988: -#line 12855 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 1994: +#line 12871 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->reset_slave_info.all= false; } -#line 34854 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34924 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 1989: -#line 12856 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 1995: +#line 12872 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->reset_slave_info.all= true; } -#line 34860 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34930 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 1990: -#line 12860 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 1996: +#line 12876 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 34866 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34936 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 1991: -#line 12862 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 1997: +#line 12878 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->next_binlog_file_number = (yyvsp[0].ulong_num); } -#line 34874 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34944 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 1992: -#line 12869 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 1998: +#line 12885 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->type=0; lex->sql_command = SQLCOM_PURGE; } -#line 34884 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34954 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 1993: -#line 12875 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 1999: +#line 12891 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 34890 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34960 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 1995: -#line 12884 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2001: +#line 12900 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->to_log = (yyvsp[0].lex_str).str; } -#line 34898 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34968 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 1996: -#line 12888 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2002: +#line 12904 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->value_list.empty(); lex->value_list.push_front((yyvsp[0].item), thd->mem_root); lex->sql_command= SQLCOM_PURGE_BEFORE; } -#line 34909 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34979 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 1997: -#line 12900 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2003: +#line 12916 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->value_list.empty(); @@ -34917,97 +34987,97 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sql_command= SQLCOM_KILL; lex->kill_type= KILL_TYPE_ID; } -#line 34921 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34991 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 1998: -#line 12908 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2004: +#line 12924 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->kill_signal= (killed_state) ((yyvsp[-2].num) | (yyvsp[-1].num)); } -#line 34929 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 34999 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 1999: -#line 12914 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2005: +#line 12930 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= (int) KILL_HARD_BIT; } -#line 34935 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35005 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2000: -#line 12915 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2006: +#line 12931 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= (int) KILL_HARD_BIT; } -#line 34941 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35011 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2001: -#line 12916 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2007: +#line 12932 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0; } -#line 34947 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35017 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2002: -#line 12919 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2008: +#line 12935 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= (int) KILL_CONNECTION; } -#line 34953 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35023 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2003: -#line 12920 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2009: +#line 12936 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= (int) KILL_CONNECTION; } -#line 34959 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35029 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2004: -#line 12921 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2010: +#line 12937 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= (int) KILL_QUERY; } -#line 34965 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35035 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2005: -#line 12923 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2011: +#line 12939 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= (int) KILL_QUERY; Lex->kill_type= KILL_TYPE_QUERY; } -#line 34974 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35044 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2006: -#line 12931 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2012: +#line 12947 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->value_list.push_front((yyval.item), thd->mem_root); } -#line 34982 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35052 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2007: -#line 12935 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2013: +#line 12951 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root); Lex->kill_type= KILL_TYPE_USER; } -#line 34991 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35061 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2008: -#line 12943 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2014: +#line 12959 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command= SQLCOM_SHUTDOWN; } -#line 34997 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35067 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2009: -#line 12950 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2015: +#line 12966 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command=SQLCOM_CHANGE_DB; lex->select_lex.db= (yyvsp[0].lex_str).str; } -#line 35007 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35077 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2010: -#line 12961 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2016: +#line 12977 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; @@ -35018,11 +35088,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 35022 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35092 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2011: -#line 12972 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2017: +#line 12988 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_LOAD; @@ -35032,11 +35102,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (!(lex->exchange= new (thd->mem_root) sql_exchange((yyvsp[0].lex_str).str, 0, (yyvsp[-5].filetype)))) MYSQL_YYABORT; } -#line 35036 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35106 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2012: -#line 12982 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2018: +#line 12998 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (!Select->add_table_to_list(thd, (yyvsp[-1].table), NULL, TL_OPTION_UPDATING, @@ -35046,53 +35116,53 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->update_list.empty(); lex->value_list.empty(); } -#line 35050 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35120 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2013: -#line 12992 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2019: +#line 13008 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->exchange->cs= (yyvsp[0].charset); } -#line 35056 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35126 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2014: -#line 12996 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2020: +#line 13012 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 35062 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35132 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2015: -#line 13000 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2021: +#line 13016 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.filetype)= FILETYPE_CSV; } -#line 35068 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35138 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2016: -#line 13001 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2022: +#line 13017 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.filetype)= FILETYPE_XML; } -#line 35074 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35144 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2017: -#line 13005 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2023: +#line 13021 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)=0;} -#line 35080 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35150 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2018: -#line 13006 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2024: +#line 13022 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)=1;} -#line 35086 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35156 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2019: -#line 13010 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2025: +#line 13026 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lock_type)= TL_WRITE_DEFAULT; } -#line 35092 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35162 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2020: -#line 13012 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2026: +#line 13028 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* Ignore this option in SP to avoid problem with query cache and @@ -35100,182 +35170,182 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); */ (yyval.lock_type)= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); } -#line 35104 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35174 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2021: -#line 13019 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2027: +#line 13035 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lock_type)= TL_WRITE_LOW_PRIORITY; } -#line 35110 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35180 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2022: -#line 13023 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2028: +#line 13039 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->duplicates=DUP_ERROR; } -#line 35116 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35186 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2023: -#line 13024 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2029: +#line 13040 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->duplicates=DUP_REPLACE; } -#line 35122 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35192 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2024: -#line 13025 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2030: +#line 13041 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ignore= 1; } -#line 35128 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35198 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2029: -#line 13040 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2035: +#line 13056 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { DBUG_ASSERT(Lex->exchange != 0); Lex->exchange->field_term= (yyvsp[0].string); } -#line 35137 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35207 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2030: -#line 13045 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2036: +#line 13061 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; DBUG_ASSERT(lex->exchange != 0); lex->exchange->enclosed= (yyvsp[0].string); lex->exchange->opt_enclosed= 1; } -#line 35148 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35218 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2031: -#line 13052 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2037: +#line 13068 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { DBUG_ASSERT(Lex->exchange != 0); Lex->exchange->enclosed= (yyvsp[0].string); } -#line 35157 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35227 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2032: -#line 13057 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2038: +#line 13073 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { DBUG_ASSERT(Lex->exchange != 0); Lex->exchange->escaped= (yyvsp[0].string); } -#line 35166 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35236 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2037: -#line 13075 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2043: +#line 13091 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { DBUG_ASSERT(Lex->exchange != 0); Lex->exchange->line_term= (yyvsp[0].string); } -#line 35175 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35245 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2038: -#line 13080 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2044: +#line 13096 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { DBUG_ASSERT(Lex->exchange != 0); Lex->exchange->line_start= (yyvsp[0].string); } -#line 35184 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35254 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2039: -#line 13087 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2045: +#line 13103 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 35190 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35260 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2040: -#line 13089 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2046: +#line 13105 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->exchange->line_term = (yyvsp[0].string); } -#line 35196 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35266 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2042: -#line 13094 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2048: +#line 13110 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { DBUG_ASSERT(Lex->exchange != 0); Lex->exchange->skip_lines= atol((yyvsp[-1].lex_str).str); } -#line 35205 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35275 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2043: -#line 13101 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2049: +#line 13117 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 35211 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35281 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2044: -#line 13102 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2050: +#line 13118 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 35217 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35287 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2045: -#line 13106 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2051: +#line 13122 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 35223 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35293 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2046: -#line 13107 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2052: +#line 13123 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 35229 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35299 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2047: -#line 13108 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2053: +#line 13124 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 35235 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35305 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2048: -#line 13113 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2054: +#line 13129 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } -#line 35241 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35311 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2049: -#line 13115 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2055: +#line 13131 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } -#line 35247 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35317 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2050: -#line 13119 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2056: +#line 13135 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {(yyval.item)= (yyvsp[0].item);} -#line 35253 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35323 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2051: -#line 13121 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2057: +#line 13137 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_user_var_as_out_param(thd, (yyvsp[0].lex_str)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 35263 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35333 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2052: -#line 13129 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2058: +#line 13145 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 35269 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35339 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2053: -#line 13130 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2059: +#line 13146 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 35275 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35345 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2056: -#line 13140 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2062: +#line 13156 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->update_list.push_back((yyvsp[-4].item), thd->mem_root) || @@ -35283,11 +35353,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; (yyvsp[-1].item)->set_name_no_truncate((yyvsp[-2].simple_string), (uint) ((yyvsp[0].simple_string) - (yyvsp[-2].simple_string)), thd->charset()); } -#line 35287 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35357 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2057: -#line 13153 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2063: +#line 13169 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX_STRING tmp; CHARSET_INFO *cs_con= thd->variables.collation_connection; @@ -35311,11 +35381,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 35315 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35385 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2058: -#line 13177 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2064: +#line 13193 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { uint repertoire= Lex->text_string_is_7bit ? MY_REPERTOIRE_ASCII : MY_REPERTOIRE_UNICODE30; @@ -35327,22 +35397,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 35331 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35401 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2059: -#line 13189 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2065: +#line 13205 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_string_with_introducer(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length, (yyvsp[-1].charset)); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 35342 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35412 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2060: -#line 13196 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2066: +#line 13212 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item_string* item= (Item_string*) (yyvsp[-1].item); item->append((yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); @@ -35358,11 +35428,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyvsp[0].lex_str).length); } } -#line 35362 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35432 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2061: -#line 13215 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2067: +#line 13231 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.string)= new (thd->mem_root) String((yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length, @@ -35370,17 +35440,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.string) == NULL) MYSQL_YYABORT; } -#line 35374 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35444 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2062: -#line 13222 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2068: +#line 13238 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.string)= (yyvsp[0].string); } -#line 35380 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35450 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2063: -#line 13228 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2069: +#line 13244 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item *tmp= new (thd->mem_root) Item_hex_hybrid(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); @@ -35393,11 +35463,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); tmp->quick_fix_field(); (yyval.string)= tmp->val_str((String*) 0); } -#line 35397 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35467 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2064: -#line 13241 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2070: +#line 13257 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item *tmp= new (thd->mem_root) Item_hex_string(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); @@ -35406,11 +35476,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); tmp->quick_fix_field(); (yyval.string)= tmp->val_str((String*) 0); } -#line 35410 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35480 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2065: -#line 13250 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2071: +#line 13266 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item *tmp= new (thd->mem_root) Item_bin_string(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); @@ -35423,11 +35493,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); tmp->quick_fix_field(); (yyval.string)= tmp->val_str((String*) 0); } -#line 35427 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35497 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2066: -#line 13266 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2072: +#line 13282 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; Lex_input_stream *lip= YYLIP; @@ -35441,50 +35511,50 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (!((yyval.item_param)= item) || lex->param_list.push_back(item, thd->mem_root)) my_yyabort_error((ER_OUT_OF_RESOURCES, MYF(0))); } -#line 35445 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35515 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2067: -#line 13282 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2073: +#line 13298 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item) = (yyvsp[0].item); } -#line 35451 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35521 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2068: -#line 13283 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2074: +#line 13299 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item) = (yyvsp[0].item_num); } -#line 35457 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35527 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2069: -#line 13285 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2075: +#line 13301 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyvsp[0].item_num)->max_length++; (yyval.item)= (yyvsp[0].item_num)->neg(thd); } -#line 35466 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35536 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2070: -#line 13292 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2076: +#line 13308 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item) = (yyvsp[0].item); } -#line 35472 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35542 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2071: -#line 13293 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2077: +#line 13309 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item) = (yyvsp[0].item_num); } -#line 35478 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35548 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2072: -#line 13294 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2078: +#line 13310 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= (yyvsp[0].item); } -#line 35484 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35554 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2073: -#line 13296 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2079: +#line 13312 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* For the digest computation, in this context only, @@ -35498,61 +35568,61 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; YYLIP->next_state= MY_LEX_OPERATOR_OR_IDENT; } -#line 35502 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35572 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2074: -#line 13310 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2080: +#line 13326 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_int(thd, (char*) "FALSE",0,1); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 35512 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35582 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2075: -#line 13316 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2081: +#line 13332 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_int(thd, (char*) "TRUE",1,1); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 35522 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35592 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2076: -#line 13322 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2082: +#line 13338 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_hex_hybrid(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 35532 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35602 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2077: -#line 13328 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2083: +#line 13344 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_hex_string(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 35542 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35612 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2078: -#line 13334 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2084: +#line 13350 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= new (thd->mem_root) Item_bin_string(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 35552 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35622 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2079: -#line 13340 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2085: +#line 13356 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item_string_with_introducer *item_str; /* @@ -35567,11 +35637,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.item)= item_str; } -#line 35571 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35641 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2080: -#line 13358 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2086: +#line 13374 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.item_num)= new (thd->mem_root) @@ -35581,11 +35651,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item_num) == NULL) MYSQL_YYABORT; } -#line 35585 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35655 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2081: -#line 13368 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2087: +#line 13384 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { int error; (yyval.item_num)= new (thd->mem_root) @@ -35595,21 +35665,21 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item_num) == NULL) MYSQL_YYABORT; } -#line 35599 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35669 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2082: -#line 13378 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2088: +#line 13394 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item_num)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); if ((yyval.item_num) == NULL) MYSQL_YYABORT; } -#line 35609 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35679 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2083: -#line 13384 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2089: +#line 13400 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item_num)= new (thd->mem_root) Item_decimal(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length, thd->charset()); @@ -35618,11 +35688,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 35622 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35692 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2084: -#line 13393 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2090: +#line 13409 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item_num)= new (thd->mem_root) Item_float(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); if (((yyval.item_num) == NULL) || (thd->is_error())) @@ -35630,53 +35700,53 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 35634 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35704 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2085: -#line 13405 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2091: +#line 13421 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!((yyval.item)= create_temporal_literal(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length, YYCSCL, MYSQL_TYPE_DATE, true))) MYSQL_YYABORT; } -#line 35644 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35714 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2086: -#line 13411 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2092: +#line 13427 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!((yyval.item)= create_temporal_literal(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length, YYCSCL, MYSQL_TYPE_TIME, true))) MYSQL_YYABORT; } -#line 35654 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35724 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2087: -#line 13417 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2093: +#line 13433 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!((yyval.item)= create_temporal_literal(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length, YYCSCL, MYSQL_TYPE_DATETIME, true))) MYSQL_YYABORT; } -#line 35664 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35734 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2088: -#line 13432 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2094: +#line 13448 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)=(yyvsp[0].item); } -#line 35670 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35740 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2089: -#line 13433 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2095: +#line 13449 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)=(yyvsp[0].item); } -#line 35676 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35746 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2090: -#line 13438 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2096: +#line 13454 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { SELECT_LEX *sel= Select; (yyval.item)= new (thd->mem_root) Item_field(thd, Lex->current_context(), @@ -35685,11 +35755,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; sel->with_wild++; } -#line 35689 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35759 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2091: -#line 13447 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2097: +#line 13463 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { SELECT_LEX *sel= Select; const char* schema= thd->client_capabilities & CLIENT_NO_SCHEMA ? @@ -35701,17 +35771,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; sel->with_wild++; } -#line 35705 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35775 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2092: -#line 13461 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2098: +#line 13477 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)=(yyvsp[0].item); } -#line 35711 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35781 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2093: -#line 13466 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2099: +#line 13482 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; Lex_input_stream *lip= YYLIP; @@ -35754,17 +35824,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 35758 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35828 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2094: -#line 13508 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2100: +#line 13524 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= (yyvsp[0].item); } -#line 35764 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35834 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2095: -#line 13513 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2101: +#line 13529 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { SELECT_LEX *sel=Select; if ((sel->parsing_place != IN_HAVING) || @@ -35781,17 +35851,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 35785 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35855 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2096: -#line 13529 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2102: +#line 13545 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)= (yyvsp[0].item); } -#line 35791 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35861 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2097: -#line 13534 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2103: +#line 13550 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; @@ -35863,11 +35933,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 35867 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35937 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2098: -#line 13606 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2104: +#line 13622 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; SELECT_LEX *sel= lex->current_select; @@ -35891,11 +35961,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 35895 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35965 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2099: -#line 13630 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2105: +#line 13646 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; SELECT_LEX *sel= lex->current_select; @@ -35922,17 +35992,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if ((yyval.item) == NULL) MYSQL_YYABORT; } -#line 35926 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 35996 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2100: -#line 13659 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2106: +#line 13675 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)=(yyvsp[0].lex_str);} -#line 35932 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36002 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2101: -#line 13661 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2107: +#line 13677 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { TABLE_LIST *table= Select->table_list.first; if (my_strcasecmp(table_alias_charset, (yyvsp[-4].lex_str).str, table->db)) @@ -35942,96 +36012,96 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); my_yyabort_error((ER_WRONG_TABLE_NAME, MYF(0), (yyvsp[-2].lex_str).str)); (yyval.lex_str)=(yyvsp[0].lex_str); } -#line 35946 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36016 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2102: -#line 13671 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2108: +#line 13687 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { TABLE_LIST *table= Select->table_list.first; if (my_strcasecmp(table_alias_charset, (yyvsp[-2].lex_str).str, table->alias)) my_yyabort_error((ER_WRONG_TABLE_NAME, MYF(0), (yyvsp[-2].lex_str).str)); (yyval.lex_str)=(yyvsp[0].lex_str); } -#line 35957 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36027 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2103: -#line 13677 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2109: +#line 13693 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)=(yyvsp[0].lex_str);} -#line 35963 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36033 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2104: -#line 13682 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2110: +#line 13698 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.table)= new (thd->mem_root) Table_ident((yyvsp[0].lex_str)); if ((yyval.table) == NULL) MYSQL_YYABORT; } -#line 35973 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36043 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2105: -#line 13688 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2111: +#line 13704 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.table)= new (thd->mem_root) Table_ident(thd, (yyvsp[-2].lex_str), (yyvsp[0].lex_str), 0); if ((yyval.table) == NULL) MYSQL_YYABORT; } -#line 35983 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36053 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2106: -#line 13694 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2112: +#line 13710 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* For Delphi */ (yyval.table)= new (thd->mem_root) Table_ident((yyvsp[0].lex_str)); if ((yyval.table) == NULL) MYSQL_YYABORT; } -#line 35994 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36064 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2107: -#line 13704 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2113: +#line 13720 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.table)= new (thd->mem_root) Table_ident((yyvsp[-1].lex_str)); if ((yyval.table) == NULL) MYSQL_YYABORT; } -#line 36004 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36074 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2108: -#line 13710 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2114: +#line 13726 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.table)= new (thd->mem_root) Table_ident(thd, (yyvsp[-3].lex_str), (yyvsp[-1].lex_str), 0); if ((yyval.table) == NULL) MYSQL_YYABORT; } -#line 36014 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36084 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2109: -#line 13719 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2115: +#line 13735 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX_STRING db={(char*) any_db,3}; (yyval.table)= new (thd->mem_root) Table_ident(thd, db, (yyvsp[0].lex_str), 0); if ((yyval.table) == NULL) MYSQL_YYABORT; } -#line 36025 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36095 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2110: -#line 13728 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2116: +#line 13744 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)= (yyvsp[0].lex_str); } -#line 36031 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36101 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2111: -#line 13730 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2117: +#line 13746 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (thd->charset_is_system_charset) { @@ -36056,11 +36126,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 36060 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36130 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2112: -#line 13758 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2118: +#line 13774 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (thd->charset_is_system_charset) (yyval.lex_str)= (yyvsp[0].lex_str); @@ -36071,11 +36141,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 36075 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36145 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2113: -#line 13772 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2119: +#line 13788 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (thd->charset_is_collation_connection) (yyval.lex_str)= (yyvsp[0].lex_str); @@ -36086,11 +36156,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 36090 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36160 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2114: -#line 13786 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2120: +#line 13802 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (thd->charset_is_character_set_filesystem) (yyval.lex_str)= (yyvsp[0].lex_str); @@ -36102,63 +36172,63 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 36106 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36176 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2115: -#line 13800 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2121: +#line 13816 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)=(yyvsp[0].lex_str); } -#line 36112 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36182 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2116: -#line 13802 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2122: +#line 13818 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str).str= thd->strmake((yyvsp[0].symbol).str, (yyvsp[0].symbol).length); if ((yyval.lex_str).str == NULL) MYSQL_YYABORT; (yyval.lex_str).length= (yyvsp[0].symbol).length; } -#line 36123 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36193 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2117: -#line 13811 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2123: +#line 13827 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)=(yyvsp[0].lex_str); } -#line 36129 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36199 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2118: -#line 13813 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2124: +#line 13829 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str).str= thd->strmake((yyvsp[0].symbol).str, (yyvsp[0].symbol).length); if ((yyval.lex_str).str == NULL) MYSQL_YYABORT; (yyval.lex_str).length= (yyvsp[0].symbol).length; } -#line 36140 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36210 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2119: -#line 13822 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2125: +#line 13838 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)=(yyvsp[0].lex_str);} -#line 36146 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36216 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2120: -#line 13823 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2126: +#line 13839 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)=(yyvsp[0].lex_str);} -#line 36152 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36222 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2121: -#line 13824 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2127: +#line 13840 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_str)=(yyvsp[0].lex_str);} -#line 36158 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36228 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2122: -#line 13829 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2128: +#line 13845 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!((yyval.lex_user)=(LEX_USER*) thd->alloc(sizeof(st_lex_user)))) MYSQL_YYABORT; @@ -36171,11 +36241,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); system_charset_info, 0)) MYSQL_YYABORT; } -#line 36175 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36245 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2123: -#line 13842 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2129: +#line 13858 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!((yyval.lex_user)=(LEX_USER*) thd->alloc(sizeof(st_lex_user)))) MYSQL_YYABORT; @@ -36205,11 +36275,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.lex_user)->host= host_not_specified; } } -#line 36209 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36279 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2124: -#line 13872 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2130: +#line 13888 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (!((yyval.lex_user)=(LEX_USER*)thd->calloc(sizeof(LEX_USER)))) MYSQL_YYABORT; @@ -36217,2241 +36287,2241 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.lex_user)->plugin= empty_lex_str; (yyval.lex_user)->auth= empty_lex_str; } -#line 36221 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36291 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2127: -#line 13884 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2133: +#line 13900 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if ((yyvsp[0].lex_user)->user.str != current_user.str && (yyvsp[0].lex_user)->host.str == 0) (yyvsp[0].lex_user)->host= host_not_specified; (yyval.lex_user)= (yyvsp[0].lex_user); } -#line 36231 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ - break; - - case 2128: -#line 13893 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ - {} -#line 36237 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ - break; - - case 2129: -#line 13894 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ - {} -#line 36243 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ - break; - - case 2130: -#line 13895 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ - {} -#line 36249 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ - break; - - case 2131: -#line 13896 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ - {} -#line 36255 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ - break; - - case 2132: -#line 13897 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ - {} -#line 36261 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ - break; - - case 2133: -#line 13898 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ - {} -#line 36267 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36301 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2134: -#line 13899 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13909 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36273 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36307 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2135: -#line 13900 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13910 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36279 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36313 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2136: -#line 13901 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13911 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36285 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36319 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2137: -#line 13902 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13912 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36291 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36325 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2138: -#line 13903 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13913 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36297 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36331 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2139: -#line 13904 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13914 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36303 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36337 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2140: -#line 13905 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13915 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36309 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36343 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2141: -#line 13906 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13916 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36315 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36349 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2142: -#line 13907 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13917 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36321 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36355 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2143: -#line 13908 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13918 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36327 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36361 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2144: -#line 13909 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13919 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36333 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36367 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2145: -#line 13910 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13920 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36339 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36373 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2146: -#line 13911 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13921 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36345 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36379 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2147: -#line 13912 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13922 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36351 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36385 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2148: -#line 13913 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13923 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36357 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36391 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2149: -#line 13914 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13924 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36363 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36397 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2150: -#line 13915 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13925 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36369 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36403 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2151: -#line 13916 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13926 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36375 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36409 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2152: -#line 13917 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13927 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36381 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36415 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2153: -#line 13918 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13928 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36387 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36421 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2154: -#line 13919 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13929 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36393 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36427 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2155: -#line 13920 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13930 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36399 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36433 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2156: -#line 13921 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13931 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36405 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36439 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2157: -#line 13922 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13932 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36411 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36445 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2158: -#line 13923 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13933 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36417 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36451 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2159: -#line 13924 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13934 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36423 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36457 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2160: -#line 13925 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13935 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36429 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36463 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2161: -#line 13926 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13936 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36435 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36469 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2162: -#line 13927 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13937 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36441 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36475 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2163: -#line 13928 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13938 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36447 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36481 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2164: -#line 13929 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13939 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36453 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36487 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2165: -#line 13930 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13940 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36459 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36493 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2166: -#line 13931 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13941 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36465 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36499 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2167: -#line 13932 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13942 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36471 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36505 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2168: -#line 13933 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13943 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36477 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36511 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2169: -#line 13934 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13944 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36483 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36517 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2170: -#line 13935 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13945 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36489 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36523 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2171: -#line 13936 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13946 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36495 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36529 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2172: -#line 13937 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13947 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36501 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36535 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2173: -#line 13938 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13948 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36507 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36541 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2174: -#line 13939 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13949 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36513 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36547 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2175: -#line 13940 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13950 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36519 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36553 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2176: -#line 13941 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13951 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36525 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36559 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2177: -#line 13942 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13952 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36531 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36565 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2178: -#line 13943 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13953 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36537 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36571 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2179: -#line 13944 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13954 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36543 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36577 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2180: -#line 13945 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13955 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36549 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36583 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2181: -#line 13946 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13956 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36555 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36589 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2182: -#line 13947 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13957 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36561 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36595 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2183: -#line 13948 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13958 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36567 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36601 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2184: -#line 13949 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13959 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36573 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36607 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2185: -#line 13950 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13960 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36579 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36613 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2186: -#line 13951 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13961 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36585 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36619 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2187: -#line 13952 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13962 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36591 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36625 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2188: -#line 13953 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13963 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36597 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36631 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2189: -#line 13963 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13964 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36603 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36637 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2190: -#line 13964 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13965 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36609 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36643 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2191: -#line 13965 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13966 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36615 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36649 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2192: -#line 13966 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13967 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36621 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36655 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2193: -#line 13967 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13968 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36627 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36661 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2194: -#line 13968 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13969 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36633 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36667 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2195: -#line 13969 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13979 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36639 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36673 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2196: -#line 13970 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13980 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36645 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36679 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2197: -#line 13971 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13981 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36651 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36685 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2198: -#line 13972 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13982 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36657 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36691 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2199: -#line 13973 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13983 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36663 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36697 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2200: -#line 13974 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13984 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36669 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36703 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2201: -#line 13975 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13985 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36675 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36709 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2202: -#line 13976 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13986 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36681 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36715 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2203: -#line 13977 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13987 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36687 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36721 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2204: -#line 13978 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13988 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36693 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36727 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2205: -#line 13979 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13989 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36699 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36733 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2206: -#line 13980 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13990 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36705 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36739 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2207: -#line 13981 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13991 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36711 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36745 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2208: -#line 13982 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13992 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36717 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36751 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2209: -#line 13983 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13993 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36723 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36757 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2210: -#line 13984 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13994 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36729 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36763 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2211: -#line 13985 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13995 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36735 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36769 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2212: -#line 13986 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13996 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36741 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36775 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2213: -#line 13987 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13997 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36747 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36781 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2214: -#line 13988 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13998 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36753 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36787 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2215: -#line 13989 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 13999 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36759 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36793 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2216: -#line 13990 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14000 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36765 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36799 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2217: -#line 13991 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14001 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36771 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36805 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2218: -#line 13992 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14002 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36777 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36811 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2219: -#line 13993 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14003 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36783 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36817 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2220: -#line 13994 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14004 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36789 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36823 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2221: -#line 13995 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14005 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36795 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36829 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2222: -#line 13996 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14006 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36801 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36835 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2223: -#line 13997 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14007 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36807 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36841 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2224: -#line 13998 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14008 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36813 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36847 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2225: -#line 13999 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14009 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36819 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36853 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2226: -#line 14000 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14010 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36825 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36859 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2227: -#line 14001 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14011 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36831 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36865 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2228: -#line 14002 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14012 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36837 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36871 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2229: -#line 14003 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14013 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36843 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36877 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2230: -#line 14004 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14014 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36849 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36883 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2231: -#line 14005 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14015 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36855 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36889 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2232: -#line 14006 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14016 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36861 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36895 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2233: -#line 14007 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14017 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36867 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36901 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2234: -#line 14008 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14018 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36873 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36907 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2235: -#line 14009 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14019 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36879 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36913 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2236: -#line 14010 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14020 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36885 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36919 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2237: -#line 14011 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14021 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36891 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36925 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2238: -#line 14012 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14022 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36897 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36931 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2239: -#line 14017 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14023 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36903 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36937 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2240: -#line 14018 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14024 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36909 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36943 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2241: -#line 14019 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14025 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36915 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36949 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2242: -#line 14020 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14026 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36921 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36955 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2243: -#line 14021 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14027 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36927 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36961 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2244: -#line 14022 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14028 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36933 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36967 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2245: -#line 14023 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14033 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36939 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36973 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2246: -#line 14024 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14034 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36945 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36979 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2247: -#line 14025 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14035 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36951 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36985 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2248: -#line 14026 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14036 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36957 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36991 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2249: -#line 14027 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14037 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36963 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 36997 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2250: -#line 14028 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14038 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36969 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37003 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2251: -#line 14029 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14039 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36975 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37009 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2252: -#line 14030 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14040 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36981 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37015 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2253: -#line 14031 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14041 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36987 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37021 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2254: -#line 14032 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14042 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36993 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37027 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2255: -#line 14033 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14043 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 36999 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37033 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2256: -#line 14034 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14044 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37005 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37039 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2257: -#line 14035 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14045 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37011 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37045 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2258: -#line 14036 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14046 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37017 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37051 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2259: -#line 14037 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14047 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37023 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37057 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2260: -#line 14038 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14048 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37029 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37063 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2261: -#line 14039 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14049 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37035 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37069 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2262: -#line 14040 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14050 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37041 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37075 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2263: -#line 14041 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14051 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37047 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37081 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2264: -#line 14042 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14052 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37053 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37087 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2265: -#line 14043 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14053 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37059 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37093 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2266: -#line 14044 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14054 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37065 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37099 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2267: -#line 14045 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14055 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37071 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37105 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2268: -#line 14046 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14056 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37077 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37111 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2269: -#line 14047 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14057 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37083 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37117 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2270: -#line 14048 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14058 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37089 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37123 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2271: -#line 14049 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14059 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37095 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37129 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2272: -#line 14050 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14060 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37101 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37135 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2273: -#line 14051 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14061 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37107 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37141 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2274: -#line 14052 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14062 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37113 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37147 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2275: -#line 14053 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14063 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37119 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37153 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2276: -#line 14054 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14064 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37125 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37159 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2277: -#line 14055 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14065 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37131 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37165 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2278: -#line 14056 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14066 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37137 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37171 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2279: -#line 14057 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14067 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37143 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37177 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2280: -#line 14058 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14068 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37149 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37183 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2281: -#line 14059 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14069 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37155 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37189 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2282: -#line 14060 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14070 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37161 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37195 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2283: -#line 14061 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14071 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37167 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37201 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2284: -#line 14062 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14072 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37173 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37207 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2285: -#line 14063 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14073 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37179 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37213 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2286: -#line 14064 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14074 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37185 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37219 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2287: -#line 14065 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14075 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37191 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37225 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2288: -#line 14066 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14076 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37197 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37231 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2289: -#line 14067 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14077 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37203 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37237 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2290: -#line 14068 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14078 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37209 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37243 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2291: -#line 14069 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14079 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37215 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37249 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2292: -#line 14070 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14080 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37221 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37255 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2293: -#line 14071 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14081 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37227 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37261 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2294: -#line 14072 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14082 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37233 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37267 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2295: -#line 14073 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14083 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37239 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37273 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2296: -#line 14074 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14084 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37245 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37279 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2297: -#line 14075 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14085 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37251 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37285 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2298: -#line 14076 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14086 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37257 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37291 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2299: -#line 14077 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14087 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37263 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37297 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2300: -#line 14078 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14088 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37269 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37303 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2301: -#line 14079 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14089 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37275 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37309 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2302: -#line 14080 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14090 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37281 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37315 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2303: -#line 14081 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14091 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37287 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37321 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2304: -#line 14082 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14092 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37293 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37327 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2305: -#line 14083 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14093 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37299 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37333 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2306: -#line 14084 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14094 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37305 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37339 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2307: -#line 14085 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14095 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37311 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37345 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2308: -#line 14086 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14096 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37317 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37351 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2309: -#line 14087 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14097 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37323 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37357 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2310: -#line 14088 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14098 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37329 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37363 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2311: -#line 14089 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14099 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37335 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37369 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2312: -#line 14090 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14100 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37341 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37375 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2313: -#line 14091 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14101 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37347 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37381 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2314: -#line 14092 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14102 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37353 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37387 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2315: -#line 14093 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14103 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37359 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37393 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2316: -#line 14094 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14104 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37365 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37399 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2317: -#line 14095 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14105 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37371 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37405 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2318: -#line 14096 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14106 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37377 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37411 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2319: -#line 14097 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14107 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37383 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37417 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2320: -#line 14098 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14108 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37389 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37423 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2321: -#line 14099 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14109 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37395 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37429 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2322: -#line 14100 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14110 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37401 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37435 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2323: -#line 14101 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14111 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37407 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37441 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2324: -#line 14102 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14112 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37413 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37447 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2325: -#line 14103 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14113 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37419 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37453 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2326: -#line 14104 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14114 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37425 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37459 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2327: -#line 14105 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14115 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37431 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37465 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2328: -#line 14106 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14116 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37437 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37471 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2329: -#line 14107 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14117 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37443 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37477 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2330: -#line 14108 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14118 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37449 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37483 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2331: -#line 14109 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14119 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37455 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37489 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2332: -#line 14110 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14120 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37461 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37495 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2333: -#line 14111 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14121 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37467 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37501 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2334: -#line 14112 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14122 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37473 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37507 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2335: -#line 14113 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14123 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37479 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37513 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2336: -#line 14114 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14124 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37485 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37519 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2337: -#line 14115 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14125 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37491 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37525 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2338: -#line 14116 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14126 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37497 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37531 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2339: -#line 14117 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14127 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37503 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37537 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2340: -#line 14118 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14128 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37509 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37543 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2341: -#line 14119 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14129 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37515 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37549 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2342: -#line 14120 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14130 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37521 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37555 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2343: -#line 14121 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14131 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37527 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37561 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2344: -#line 14122 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14132 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37533 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37567 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2345: -#line 14123 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14133 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37539 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37573 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2346: -#line 14124 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14134 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37545 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37579 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2347: -#line 14125 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14135 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37551 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37585 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2348: -#line 14126 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14136 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37557 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37591 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2349: -#line 14127 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14137 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37563 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37597 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2350: -#line 14128 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14138 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37569 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37603 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2351: -#line 14129 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14139 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37575 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37609 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2352: -#line 14130 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14140 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37581 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37615 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2353: -#line 14131 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14141 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37587 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37621 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2354: -#line 14132 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14142 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37593 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37627 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2355: -#line 14133 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14143 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37599 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37633 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2356: -#line 14134 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14144 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37605 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37639 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2357: -#line 14135 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14145 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37611 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37645 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2358: -#line 14136 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14146 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37617 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37651 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2359: -#line 14137 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14147 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37623 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37657 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2360: -#line 14138 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14148 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37629 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37663 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2361: -#line 14139 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14149 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37635 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37669 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2362: -#line 14140 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14150 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37641 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37675 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2363: -#line 14141 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14151 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37647 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37681 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2364: -#line 14142 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14152 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37653 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37687 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2365: -#line 14143 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14153 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37659 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37693 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2366: -#line 14144 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14154 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37665 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37699 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2367: -#line 14145 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14155 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37671 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37705 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2368: -#line 14146 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14156 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37677 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37711 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2369: -#line 14147 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14157 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37683 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37717 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2370: -#line 14148 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14158 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37689 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37723 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2371: -#line 14149 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14159 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37695 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37729 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2372: -#line 14150 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14160 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37701 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37735 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2373: -#line 14151 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14161 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37707 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37741 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2374: -#line 14152 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14162 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37713 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37747 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2375: -#line 14153 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14163 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37719 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37753 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2376: -#line 14154 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14164 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37725 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37759 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2377: -#line 14155 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14165 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37731 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37765 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2378: -#line 14156 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14166 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37737 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37771 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2379: -#line 14157 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14167 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37743 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37777 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2380: -#line 14158 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14168 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37749 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37783 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2381: -#line 14159 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14169 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37755 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37789 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2382: -#line 14160 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14170 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37761 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37795 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2383: -#line 14161 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14171 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37767 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37801 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2384: -#line 14162 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14172 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37773 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37807 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2385: -#line 14163 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14173 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37779 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37813 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2386: -#line 14164 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14174 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37785 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37819 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2387: -#line 14165 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14175 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37791 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37825 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2388: -#line 14166 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14176 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37797 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37831 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2389: -#line 14167 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14177 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37803 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37837 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2390: -#line 14168 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14178 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37809 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37843 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2391: -#line 14169 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14179 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37815 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37849 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2392: -#line 14170 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14180 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37821 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37855 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2393: -#line 14171 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14181 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37827 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37861 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2394: -#line 14172 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14182 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37833 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37867 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2395: -#line 14173 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14183 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37839 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37873 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2396: -#line 14174 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14184 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37845 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37879 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2397: -#line 14175 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14185 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37851 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37885 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2398: -#line 14176 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14186 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37857 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37891 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2399: -#line 14177 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14187 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37863 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37897 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2400: -#line 14178 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14188 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37869 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37903 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2401: -#line 14179 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14189 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37875 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37909 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2402: -#line 14180 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14190 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37881 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37915 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2403: -#line 14181 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14191 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37887 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37921 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2404: -#line 14182 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14192 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37893 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37927 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2405: -#line 14183 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14193 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37899 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37933 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2406: -#line 14184 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14194 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37905 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37939 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2407: -#line 14185 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14195 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37911 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37945 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2408: -#line 14186 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14196 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37917 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37951 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2409: -#line 14187 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14197 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37923 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37957 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2410: -#line 14188 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14198 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37929 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37963 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2411: -#line 14189 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14199 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37935 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37969 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2412: -#line 14190 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14200 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37941 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37975 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2413: -#line 14191 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14201 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37947 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37981 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2414: -#line 14192 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14202 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37953 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37987 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2415: -#line 14193 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14203 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37959 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37993 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2416: -#line 14194 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14204 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37965 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 37999 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2417: -#line 14195 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14205 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37971 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38005 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2418: -#line 14196 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14206 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37977 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38011 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2419: -#line 14197 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14207 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37983 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38017 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2420: -#line 14198 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14208 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37989 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38023 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2421: -#line 14199 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14209 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 37995 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38029 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2422: -#line 14200 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14210 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38001 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38035 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2423: -#line 14201 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14211 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38007 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38041 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2424: -#line 14202 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14212 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38013 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38047 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2425: -#line 14203 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14213 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38019 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38053 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2426: -#line 14204 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14214 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38025 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38059 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2427: -#line 14205 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14215 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38031 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38065 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2428: -#line 14206 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14216 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38037 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38071 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2429: -#line 14207 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14217 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38043 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38077 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2430: -#line 14208 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14218 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38049 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38083 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2431: -#line 14209 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14219 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38055 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38089 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2432: -#line 14210 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14220 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38061 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38095 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2433: -#line 14211 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14221 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38067 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38101 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2434: -#line 14212 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14222 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38073 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38107 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2435: -#line 14213 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14223 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38079 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38113 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2436: -#line 14214 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14224 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38085 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38119 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2437: -#line 14215 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14225 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38091 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38125 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2438: -#line 14216 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14226 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38097 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38131 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2439: -#line 14217 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14227 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38103 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38137 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2440: -#line 14218 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14228 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38109 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38143 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2441: -#line 14219 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14229 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38115 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38149 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2442: -#line 14220 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14230 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38121 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38155 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2443: -#line 14221 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14231 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38127 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38161 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2444: -#line 14222 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14232 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38133 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38167 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2445: -#line 14223 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14233 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38139 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38173 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2446: -#line 14224 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14234 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38145 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38179 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2447: -#line 14225 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14235 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38151 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38185 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2448: -#line 14226 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14236 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38157 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38191 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2449: -#line 14227 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14237 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38163 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38197 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2450: -#line 14228 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14238 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38169 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38203 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2451: -#line 14229 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14239 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38175 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38209 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2452: -#line 14230 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14240 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38181 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38215 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2453: -#line 14231 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14241 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38187 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38221 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2454: -#line 14232 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14242 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38193 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38227 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2455: -#line 14233 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14243 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38199 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38233 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2456: -#line 14234 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14244 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38205 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38239 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2457: -#line 14235 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14245 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38211 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38245 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2458: -#line 14236 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14246 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38217 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38251 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2459: -#line 14237 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14247 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38223 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38257 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2460: -#line 14238 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14248 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38229 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38263 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2461: -#line 14239 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14249 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38235 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38269 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2462: -#line 14240 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14250 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38241 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38275 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2463: -#line 14241 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14251 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38247 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38281 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2464: -#line 14242 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14252 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38253 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38287 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2465: -#line 14243 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14253 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38259 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38293 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2466: -#line 14244 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14254 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38265 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38299 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2467: -#line 14245 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14255 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38271 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38305 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2468: -#line 14246 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14256 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38277 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38311 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2469: -#line 14247 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14257 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38283 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38317 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2470: -#line 14248 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14258 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38289 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38323 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2471: -#line 14249 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14259 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38295 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38329 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2472: -#line 14250 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14260 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38301 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38335 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2473: -#line 14251 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14261 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38307 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38341 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2474: -#line 14252 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14262 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38313 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38347 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2475: -#line 14253 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14263 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38319 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38353 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2476: -#line 14254 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14264 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38325 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38359 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2477: -#line 14255 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14265 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38331 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38365 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2478: -#line 14256 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14266 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38337 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38371 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2479: -#line 14257 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14267 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38343 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38377 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2480: -#line 14258 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14268 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38349 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38383 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2481: -#line 14259 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14269 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38355 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38389 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2482: -#line 14260 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14270 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38361 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38395 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2483: -#line 14261 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14271 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38367 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38401 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2484: -#line 14262 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14272 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38373 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38407 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2485: -#line 14263 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14273 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38379 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38413 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2486: -#line 14264 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14274 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38385 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38419 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2487: -#line 14265 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14275 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38391 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38425 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2488: -#line 14266 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14276 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38397 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38431 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2489: -#line 14267 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14277 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38403 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38437 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2490: -#line 14268 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14278 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38409 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38443 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2491: -#line 14269 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14279 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38415 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38449 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2492: -#line 14270 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14280 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38421 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38455 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2493: -#line 14271 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14281 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38427 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38461 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2494: -#line 14272 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14282 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38433 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38467 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2495: -#line 14273 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14283 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38439 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38473 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2496: -#line 14274 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14284 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38445 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38479 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2497: -#line 14275 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ +#line 14285 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38451 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38485 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; case 2498: +#line 14286 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + {} +#line 38491 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ + break; + + case 2499: #line 14287 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + {} +#line 38497 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ + break; + + case 2500: +#line 14288 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + {} +#line 38503 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ + break; + + case 2501: +#line 14289 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + {} +#line 38509 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ + break; + + case 2502: +#line 14290 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + {} +#line 38515 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ + break; + + case 2503: +#line 14291 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + {} +#line 38521 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ + break; + + case 2504: +#line 14303 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_SET_OPTION; @@ -38461,17 +38531,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->autocommit= 0; sp_create_assignment_lex(thd, yychar == YYEMPTY); } -#line 38465 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38535 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2499: -#line 14297 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2505: +#line 14313 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38471 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38541 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2500: -#line 14299 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2506: +#line 14315 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; mysql_init_select(lex); @@ -38479,11 +38549,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sql_command= SQLCOM_SET_OPTION; lex->autocommit= 0; } -#line 38483 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38553 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2501: -#line 14307 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2507: +#line 14323 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->table_or_sp_used()) @@ -38491,177 +38561,177 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->stmt_var_list= lex->var_list; lex->var_list.empty(); } -#line 38495 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38565 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2502: -#line 14315 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2508: +#line 14331 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 38501 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38571 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2505: -#line 14330 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2511: +#line 14346 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (sp_create_assignment_instr(thd, yychar == YYEMPTY)) MYSQL_YYABORT; } -#line 38510 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38580 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2507: -#line 14336 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2513: +#line 14352 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->option_type= OPT_DEFAULT; } -#line 38518 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38588 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2508: -#line 14340 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2514: +#line 14356 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (sp_create_assignment_instr(thd, yychar == YYEMPTY)) MYSQL_YYABORT; } -#line 38527 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38597 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2509: -#line 14345 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2515: +#line 14361 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->option_type= (yyvsp[0].var_type); } -#line 38535 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38605 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2511: -#line 14355 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2517: +#line 14371 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (sp_create_assignment_instr(thd, yychar == YYEMPTY)) MYSQL_YYABORT; } -#line 38544 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38614 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2513: -#line 14361 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2519: +#line 14377 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (sp_create_assignment_instr(thd, yychar == YYEMPTY)) MYSQL_YYABORT; } -#line 38553 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38623 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2516: -#line 14375 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2522: +#line 14391 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { sp_create_assignment_lex(thd, yychar == YYEMPTY); } -#line 38561 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38631 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2517: -#line 14379 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2523: +#line 14395 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (sp_create_assignment_instr(thd, yychar == YYEMPTY)) MYSQL_YYABORT; } -#line 38570 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38640 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2518: -#line 14384 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2524: +#line 14400 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { sp_create_assignment_lex(thd, yychar == YYEMPTY); } -#line 38578 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38648 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2519: -#line 14388 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2525: +#line 14404 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (sp_create_assignment_instr(thd, yychar == YYEMPTY)) MYSQL_YYABORT; } -#line 38587 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38657 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2520: -#line 14397 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2526: +#line 14413 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->option_type= (yyvsp[0].var_type); } -#line 38595 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38665 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2523: -#line 14405 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2529: +#line 14421 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.var_type)=OPT_GLOBAL; } -#line 38601 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38671 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2524: -#line 14406 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2530: +#line 14422 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.var_type)=OPT_SESSION; } -#line 38607 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38677 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2525: -#line 14407 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2531: +#line 14423 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.var_type)=OPT_SESSION; } -#line 38613 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38683 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2526: -#line 14411 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2532: +#line 14427 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.var_type)=OPT_SESSION; } -#line 38619 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38689 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2527: -#line 14412 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2533: +#line 14428 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.var_type)=OPT_GLOBAL; } -#line 38625 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38695 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2528: -#line 14413 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2534: +#line 14429 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.var_type)=OPT_SESSION; } -#line 38631 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38701 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2529: -#line 14414 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2535: +#line 14430 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.var_type)=OPT_SESSION; } -#line 38637 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38707 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2530: -#line 14418 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2536: +#line 14434 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.var_type)=OPT_DEFAULT; } -#line 38643 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38713 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2531: -#line 14419 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2537: +#line 14435 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.var_type)=OPT_GLOBAL; } -#line 38649 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38719 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2532: -#line 14420 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2538: +#line 14436 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.var_type)=OPT_SESSION; } -#line 38655 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38725 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2533: -#line 14421 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2539: +#line 14437 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.var_type)=OPT_SESSION; } -#line 38661 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38731 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2534: -#line 14427 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2540: +#line 14443 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; @@ -38681,11 +38751,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 38685 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38755 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2535: -#line 14451 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2541: +#line 14467 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; @@ -38711,11 +38781,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 38715 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38785 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2536: -#line 14477 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2542: +#line 14493 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Item_func_set_user_var *item; item= new (thd->mem_root) Item_func_set_user_var(thd, (yyvsp[-2].lex_str), (yyvsp[0].item)); @@ -38726,11 +38796,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; Lex->var_list.push_back(var, thd->mem_root); } -#line 38730 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38800 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2537: -#line 14488 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2543: +#line 14504 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { struct sys_var_with_base tmp= (yyvsp[-2].variable); /* Lookup if necessary: must be a system variable. */ @@ -38742,11 +38812,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (set_system_variable(thd, &tmp, (yyvsp[-3].var_type), (yyvsp[0].item))) MYSQL_YYABORT; } -#line 38746 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38816 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2538: -#line 14500 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2544: +#line 14516 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; CHARSET_INFO *cs2; @@ -38760,11 +38830,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; lex->var_list.push_back(var, thd->mem_root); } -#line 38764 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38834 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2539: -#line 14514 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2545: +#line 14530 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_pcontext *spc= lex->spcont; @@ -38779,11 +38849,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } -#line 38783 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38853 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2540: -#line 14529 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2546: +#line 14545 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; CHARSET_INFO *cs2; @@ -38802,11 +38872,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; lex->var_list.push_back(var, thd->mem_root); } -#line 38806 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38876 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2541: -#line 14548 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2547: +#line 14564 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex = Lex; LEX_USER *user; @@ -38823,11 +38893,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->sphead) lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; } -#line 38827 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38897 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2542: -#line 14565 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2548: +#line 14581 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex = Lex; set_var_default_role *var= (new (thd->mem_root) @@ -38839,11 +38909,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->sphead) lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; } -#line 38843 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38913 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2543: -#line 14577 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2549: +#line 14593 "/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)); @@ -38851,11 +38921,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; lex->var_list.push_back(var, thd->mem_root); } -#line 38855 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38925 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2544: -#line 14585 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2550: +#line 14601 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex = Lex; set_var_password *var= (new (thd->mem_root) @@ -38867,11 +38937,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->sphead) lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; } -#line 38871 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38941 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2545: -#line 14601 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2551: +#line 14617 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { sp_pcontext *spc= thd->lex->spcont; sp_variable *spv; @@ -38897,11 +38967,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.variable).base_name= (yyvsp[0].lex_str); } } -#line 38901 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 38971 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2546: -#line 14627 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2552: +#line 14643 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (check_reserved_words(&(yyvsp[-2].lex_str))) @@ -38938,11 +39008,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.variable).base_name= (yyvsp[-2].lex_str); } } -#line 38942 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39012 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2547: -#line 14664 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2553: +#line 14680 "/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) @@ -38953,11 +39023,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); (yyval.variable).base_name.str= (char*) "default"; (yyval.variable).base_name.length= 7; } -#line 38957 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39027 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2552: -#line 14685 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2558: +#line 14701 "/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)); @@ -38972,11 +39042,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; lex->var_list.push_back(var, thd->mem_root); } -#line 38976 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39046 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2553: -#line 14703 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2559: +#line 14719 "/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)); @@ -38991,47 +39061,47 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; lex->var_list.push_back(var, thd->mem_root); } -#line 38995 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39065 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2554: -#line 14720 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2560: +#line 14736 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= true; } -#line 39001 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39071 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2555: -#line 14721 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2561: +#line 14737 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= false; } -#line 39007 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39077 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2556: -#line 14725 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2562: +#line 14741 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.tx_isolation)= ISO_READ_UNCOMMITTED; } -#line 39013 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39083 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2557: -#line 14726 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2563: +#line 14742 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.tx_isolation)= ISO_READ_COMMITTED; } -#line 39019 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39089 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2558: -#line 14727 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2564: +#line 14743 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.tx_isolation)= ISO_REPEATABLE_READ; } -#line 39025 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39095 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2559: -#line 14728 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2565: +#line 14744 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.tx_isolation)= ISO_SERIALIZABLE; } -#line 39031 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39101 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2560: -#line 14733 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2566: +#line 14749 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; sp_pcontext *spc= lex->spcont; @@ -39045,82 +39115,82 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->definer->plugin= empty_lex_str; lex->definer->auth= empty_lex_str; } -#line 39049 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39119 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2561: -#line 14746 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2567: +#line 14762 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->definer= (yyvsp[-1].lex_user); } -#line 39055 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39125 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2562: -#line 14750 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2568: +#line 14766 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->definer->pwhash= (yyvsp[0].lex_str);} -#line 39061 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39131 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2563: -#line 14751 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2569: +#line 14767 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->definer->pwtext= (yyvsp[-1].lex_str); } -#line 39067 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39137 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2564: -#line 14753 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2570: +#line 14769 "/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 39078 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39148 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2565: -#line 14762 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2571: +#line 14778 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)=(yyvsp[0].item); } -#line 39084 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39154 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2566: -#line 14763 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2572: +#line 14779 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.item)=0; } -#line 39090 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39160 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2567: -#line 14765 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2573: +#line 14781 "/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 39100 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39170 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2568: -#line 14771 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2574: +#line 14787 "/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 39110 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39180 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2569: -#line 14777 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2575: +#line 14793 "/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 39120 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39190 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2570: -#line 14788 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2576: +#line 14804 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; @@ -39128,29 +39198,29 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "LOCK")); lex->sql_command= SQLCOM_LOCK_TABLES; } -#line 39132 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39202 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2571: -#line 14796 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2577: +#line 14812 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39138 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39208 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2572: -#line 14800 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2578: +#line 14816 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 39144 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39214 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2573: -#line 14801 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2579: +#line 14817 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 39150 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39220 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2576: -#line 14811 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2582: +#line 14827 "/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); @@ -39162,43 +39232,43 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MDL_SHARED_READ))) MYSQL_YYABORT; } -#line 39166 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39236 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2577: -#line 14825 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2583: +#line 14841 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= TL_READ_NO_INSERT; } -#line 39172 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39242 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2578: -#line 14826 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2584: +#line 14842 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= TL_WRITE_DEFAULT; } -#line 39178 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39248 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2579: -#line 14828 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2585: +#line 14844 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); } -#line 39186 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39256 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2580: -#line 14832 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2586: +#line 14848 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= TL_WRITE_LOW_PRIORITY; } -#line 39192 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39262 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2581: -#line 14833 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2587: +#line 14849 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= TL_READ; } -#line 39198 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39268 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2582: -#line 14838 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2588: +#line 14854 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; @@ -39206,17 +39276,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "UNLOCK")); lex->sql_command= SQLCOM_UNLOCK_TABLES; } -#line 39210 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39280 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2583: -#line 14846 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2589: +#line 14862 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39216 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39286 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2584: -#line 14855 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2590: +#line 14871 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->sphead) @@ -39225,11 +39295,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 39229 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39299 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2585: -#line 14864 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2591: +#line 14880 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->sphead) @@ -39238,11 +39308,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 39242 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39312 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2586: -#line 14873 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2592: +#line 14889 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (lex->sphead) @@ -39259,11 +39329,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 39263 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39333 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2587: -#line 14890 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2593: +#line 14906 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->expr_allows_subselect= TRUE; /* Stored functions are not supported for HANDLER READ. */ @@ -39274,59 +39344,59 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 39278 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39348 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2588: -#line 14903 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2594: +#line 14919 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ident= null_lex_str; } -#line 39284 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39354 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2589: -#line 14904 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2595: +#line 14920 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ident= (yyvsp[-1].lex_str); } -#line 39290 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39360 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2590: -#line 14908 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2596: +#line 14924 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ha_read_mode = RFIRST; } -#line 39296 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39366 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2591: -#line 14909 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2597: +#line 14925 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ha_read_mode = RNEXT; } -#line 39302 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39372 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2592: -#line 14913 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2598: +#line 14929 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ha_read_mode = RFIRST; } -#line 39308 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39378 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2593: -#line 14914 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2599: +#line 14930 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ha_read_mode = RNEXT; } -#line 39314 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39384 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2594: -#line 14915 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2600: +#line 14931 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ha_read_mode = RPREV; } -#line 39320 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39390 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2595: -#line 14916 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2601: +#line 14932 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ha_read_mode = RLAST; } -#line 39326 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39396 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2596: -#line 14918 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2602: +#line 14934 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->ha_read_mode = RKEY; @@ -39334,63 +39404,63 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (!(lex->insert_list= new (thd->mem_root) List_item)) MYSQL_YYABORT; } -#line 39338 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39408 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2597: -#line 14926 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2603: +#line 14942 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39344 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39414 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2598: -#line 14930 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2604: +#line 14946 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ha_rkey_mode)=HA_READ_KEY_EXACT; } -#line 39350 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39420 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2599: -#line 14931 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2605: +#line 14947 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ha_rkey_mode)=HA_READ_KEY_OR_NEXT; } -#line 39356 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39426 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2600: -#line 14932 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2606: +#line 14948 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ha_rkey_mode)=HA_READ_KEY_OR_PREV; } -#line 39362 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39432 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2601: -#line 14933 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2607: +#line 14949 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ha_rkey_mode)=HA_READ_AFTER_KEY; } -#line 39368 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39438 "/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 */ + case 2608: +#line 14950 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.ha_rkey_mode)=HA_READ_BEFORE_KEY; } -#line 39374 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39444 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2603: -#line 14941 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2609: +#line 14957 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39380 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39450 "/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 */ + case 2610: +#line 14962 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_REVOKE; lex->type= 0; } -#line 39390 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39460 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2605: -#line 14952 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2611: +#line 14968 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->columns.elements) @@ -39401,11 +39471,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sql_command= SQLCOM_REVOKE; lex->type= TYPE_ENUM_FUNCTION; } -#line 39405 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39475 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2606: -#line 14963 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2612: +#line 14979 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->columns.elements) @@ -39416,68 +39486,68 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sql_command= SQLCOM_REVOKE; lex->type= TYPE_ENUM_PROCEDURE; } -#line 39420 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39490 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2607: -#line 14974 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2613: +#line 14990 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_REVOKE_ALL; } -#line 39428 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39498 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2608: -#line 14978 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2614: +#line 14994 "/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 39439 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39509 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2609: -#line 14985 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2615: +#line 15001 "/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 39449 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39519 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2610: -#line 14994 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2616: +#line 15010 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->with_admin_option= true; (yyval.lex_user)= (yyvsp[0].lex_user); } -#line 39455 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39525 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2611: -#line 14996 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2617: +#line 15012 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->with_admin_option= false; (yyval.lex_user)= (yyvsp[0].lex_user); } -#line 39461 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39531 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2612: -#line 15001 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2618: +#line 15017 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39467 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39537 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2613: -#line 15007 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2619: +#line 15023 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_GRANT; lex->type= 0; } -#line 39477 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39547 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2614: -#line 15014 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2620: +#line 15030 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->columns.elements) @@ -39488,11 +39558,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sql_command= SQLCOM_GRANT; lex->type= TYPE_ENUM_FUNCTION; } -#line 39492 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39562 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2615: -#line 15026 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2621: +#line 15042 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->columns.elements) @@ -39503,22 +39573,22 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sql_command= SQLCOM_GRANT; lex->type= TYPE_ENUM_PROCEDURE; } -#line 39507 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39577 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2616: -#line 15037 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2622: +#line 15053 "/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 39518 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39588 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2617: -#line 15044 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2623: +#line 15060 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_GRANT_ROLE; @@ -39526,64 +39596,64 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (Lex->users_list.push_front((yyvsp[-3].lex_user), thd->mem_root)) MYSQL_YYABORT; } -#line 39530 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39600 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2618: -#line 15055 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2624: +#line 15071 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->definer = 0; } -#line 39536 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39606 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2619: -#line 15056 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2625: +#line 15072 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->definer = (yyvsp[0].lex_user); } -#line 39542 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39612 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2620: -#line 15059 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2626: +#line 15075 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->with_admin_option= false; } -#line 39548 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39618 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2621: -#line 15060 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2627: +#line 15076 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->with_admin_option= true; } -#line 39554 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39624 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2622: -#line 15064 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2628: +#line 15080 "/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 39563 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39633 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2623: -#line 15069 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2629: +#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 39572 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39642 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2624: -#line 15077 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2630: +#line 15093 "/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 39583 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39653 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2625: -#line 15087 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2631: +#line 15103 "/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) */ @@ -39602,275 +39672,275 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); cs, 0)) MYSQL_YYABORT; } -#line 39606 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39676 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2629: -#line 15114 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2635: +#line 15130 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39612 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39682 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2630: -#line 15116 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2636: +#line 15132 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->all_privileges= 1; Lex->grant= GLOBAL_ACLS; } -#line 39621 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39691 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2635: -#line 15134 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2641: +#line 15150 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->which_columns = SELECT_ACL;} -#line 39627 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39697 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2636: -#line 15135 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2642: +#line 15151 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39633 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39703 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2637: -#line 15137 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2643: +#line 15153 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->which_columns = INSERT_ACL;} -#line 39639 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39709 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2638: -#line 15138 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2644: +#line 15154 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39645 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39715 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2639: -#line 15140 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2645: +#line 15156 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->which_columns = UPDATE_ACL; } -#line 39651 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39721 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2640: -#line 15141 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2646: +#line 15157 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39657 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39727 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2641: -#line 15143 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2647: +#line 15159 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->which_columns = REFERENCES_ACL;} -#line 39663 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39733 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2642: -#line 15144 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2648: +#line 15160 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39669 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39739 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2643: -#line 15145 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2649: +#line 15161 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= DELETE_ACL;} -#line 39675 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39745 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2644: -#line 15146 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2650: +#line 15162 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39681 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39751 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2645: -#line 15147 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2651: +#line 15163 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= INDEX_ACL;} -#line 39687 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39757 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2646: -#line 15148 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2652: +#line 15164 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= ALTER_ACL;} -#line 39693 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39763 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2647: -#line 15149 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2653: +#line 15165 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= CREATE_ACL;} -#line 39699 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39769 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2648: -#line 15150 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2654: +#line 15166 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= DROP_ACL;} -#line 39705 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39775 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2649: -#line 15151 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2655: +#line 15167 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= EXECUTE_ACL;} -#line 39711 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39781 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2650: -#line 15152 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2656: +#line 15168 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= RELOAD_ACL;} -#line 39717 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39787 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2651: -#line 15153 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2657: +#line 15169 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= SHUTDOWN_ACL;} -#line 39723 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39793 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2652: -#line 15154 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2658: +#line 15170 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= PROCESS_ACL;} -#line 39729 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39799 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2653: -#line 15155 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2659: +#line 15171 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= FILE_ACL;} -#line 39735 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39805 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2654: -#line 15156 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2660: +#line 15172 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= GRANT_ACL;} -#line 39741 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39811 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2655: -#line 15157 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2661: +#line 15173 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= SHOW_DB_ACL;} -#line 39747 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39817 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2656: -#line 15158 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2662: +#line 15174 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= SUPER_ACL;} -#line 39753 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39823 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2657: -#line 15159 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2663: +#line 15175 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= CREATE_TMP_ACL;} -#line 39759 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39829 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2658: -#line 15160 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2664: +#line 15176 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= LOCK_TABLES_ACL; } -#line 39765 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39835 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2659: -#line 15161 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2665: +#line 15177 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= REPL_SLAVE_ACL; } -#line 39771 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39841 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2660: -#line 15162 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2666: +#line 15178 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= REPL_CLIENT_ACL; } -#line 39777 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39847 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2661: -#line 15163 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2667: +#line 15179 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= CREATE_VIEW_ACL; } -#line 39783 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39853 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2662: -#line 15164 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2668: +#line 15180 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= SHOW_VIEW_ACL; } -#line 39789 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39859 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2663: -#line 15165 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2669: +#line 15181 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= CREATE_PROC_ACL; } -#line 39795 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39865 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2664: -#line 15166 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2670: +#line 15182 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= ALTER_PROC_ACL; } -#line 39801 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39871 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2665: -#line 15167 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2671: +#line 15183 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= CREATE_USER_ACL; } -#line 39807 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39877 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2666: -#line 15168 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2672: +#line 15184 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= EVENT_ACL;} -#line 39813 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39883 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2667: -#line 15169 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2673: +#line 15185 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= TRIGGER_ACL; } -#line 39819 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39889 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2668: -#line 15170 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2674: +#line 15186 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= CREATE_TABLESPACE_ACL; } -#line 39825 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39895 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2669: -#line 15174 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2675: +#line 15190 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39831 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39901 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2670: -#line 15175 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2676: +#line 15191 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39837 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39907 "/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 */ + case 2679: +#line 15201 "/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 39848 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39918 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2674: -#line 15192 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2680: +#line 15208 "/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 39859 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39929 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2675: -#line 15199 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2681: +#line 15215 "/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 39870 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39940 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2676: -#line 15209 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2682: +#line 15225 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; size_t dummy; @@ -39881,11 +39951,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); else if (lex->columns.elements) my_yyabort_error((ER_ILLEGAL_GRANT_FOR_TABLE, MYF(0))); } -#line 39885 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39955 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2677: -#line 15220 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2683: +#line 15236 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->current_select->db = (yyvsp[-2].lex_str).str; @@ -39894,11 +39964,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); else if (lex->columns.elements) my_yyabort_error((ER_ILLEGAL_GRANT_FOR_TABLE, MYF(0))); } -#line 39898 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39968 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2678: -#line 15229 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2684: +#line 15245 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->current_select->db = NULL; @@ -39907,11 +39977,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); else if (lex->columns.elements) my_yyabort_error((ER_ILLEGAL_GRANT_FOR_TABLE, MYF(0))); } -#line 39911 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39981 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2679: -#line 15238 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2685: +#line 15254 "/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, @@ -39920,120 +39990,120 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (lex->grant == GLOBAL_ACLS) lex->grant = TABLE_ACLS & ~GRANT_ACL; } -#line 39924 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 39994 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2680: -#line 15250 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2686: +#line 15266 "/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 39933 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40003 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2681: -#line 15255 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2687: +#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 39942 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40012 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2682: -#line 15263 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2688: +#line 15279 "/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 39951 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40021 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2683: -#line 15268 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2689: +#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 39960 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40030 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2684: -#line 15276 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2690: +#line 15292 "/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 39969 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40039 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2685: -#line 15281 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2691: +#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 39978 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40048 "/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 */ + case 2696: +#line 15308 "/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 39989 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40059 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2691: -#line 15299 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2697: +#line 15315 "/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 39998 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40068 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2692: -#line 15304 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2698: +#line 15320 "/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 40008 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40078 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2693: -#line 15310 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2699: +#line 15326 "/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 40018 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40088 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2694: -#line 15316 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2700: +#line 15332 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.lex_user)= (yyvsp[0].lex_user); } -#line 40024 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40094 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2695: -#line 15321 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2701: +#line 15337 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->grant |= lex->which_columns; } -#line 40033 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40103 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2699: -#line 15335 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2705: +#line 15351 "/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) @@ -40059,227 +40129,227 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->columns.push_back(col, thd->mem_root); } } -#line 40063 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40133 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2701: -#line 15365 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2707: +#line 15381 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ssl_type=SSL_TYPE_SPECIFIED; } -#line 40071 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40141 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2702: -#line 15369 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2708: +#line 15385 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ssl_type=SSL_TYPE_ANY; } -#line 40079 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40149 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2703: -#line 15373 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2709: +#line 15389 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ssl_type=SSL_TYPE_X509; } -#line 40087 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40157 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2704: -#line 15377 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2710: +#line 15393 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->ssl_type=SSL_TYPE_NONE; } -#line 40095 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40165 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2705: -#line 15383 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2711: +#line 15399 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40101 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40171 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2707: -#line 15388 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2713: +#line 15404 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40107 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40177 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2708: -#line 15389 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2714: +#line 15405 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= GRANT_ACL;} -#line 40113 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40183 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2709: -#line 15393 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2715: +#line 15409 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40119 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40189 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2710: -#line 15394 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2716: +#line 15410 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40125 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40195 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2711: -#line 15398 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2717: +#line 15414 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->grant |= GRANT_ACL;} -#line 40131 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40201 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2712: -#line 15400 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2718: +#line 15416 "/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 40141 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40211 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2713: -#line 15406 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2719: +#line 15422 "/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 40151 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40221 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2714: -#line 15412 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2720: +#line 15428 "/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 40161 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40231 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2715: -#line 15418 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2721: +#line 15434 "/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 40171 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40241 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2716: -#line 15424 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2722: +#line 15440 "/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 40181 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40251 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2717: -#line 15433 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2723: +#line 15449 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command = SQLCOM_BEGIN; lex->start_transaction_opt= 0; } -#line 40191 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40261 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2718: -#line 15438 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2724: +#line 15454 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40197 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40267 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2719: -#line 15443 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2725: +#line 15459 "/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 40207 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40277 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2720: -#line 15451 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2726: +#line 15467 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0; } -#line 40213 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40283 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2721: -#line 15452 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2727: +#line 15468 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 1; } -#line 40219 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40289 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2722: -#line 15456 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2728: +#line 15472 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40225 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40295 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2723: -#line 15457 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2729: +#line 15473 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40231 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40301 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2724: -#line 15462 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2730: +#line 15478 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.m_yes_no_unk)= TVL_UNKNOWN; } -#line 40237 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40307 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2725: -#line 15463 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2731: +#line 15479 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.m_yes_no_unk)= TVL_NO; } -#line 40243 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40313 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2726: -#line 15464 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2732: +#line 15480 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.m_yes_no_unk)= TVL_YES; } -#line 40249 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40319 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2727: -#line 15469 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2733: +#line 15485 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.m_yes_no_unk)= TVL_UNKNOWN; } -#line 40255 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40325 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2728: -#line 15470 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2734: +#line 15486 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.m_yes_no_unk)= TVL_YES; } -#line 40261 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40331 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2729: -#line 15471 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2735: +#line 15487 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.m_yes_no_unk)= TVL_NO; } -#line 40267 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40337 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2730: -#line 15475 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2736: +#line 15491 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40273 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40343 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2731: -#line 15476 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2737: +#line 15492 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40279 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40349 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2732: -#line 15481 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2738: +#line 15497 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_COMMIT; @@ -40288,11 +40358,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 40292 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40362 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2733: -#line 15493 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2739: +#line 15509 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_ROLLBACK; @@ -40301,56 +40371,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 40305 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40375 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2734: -#line 15503 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2740: +#line 15519 "/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 40315 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40385 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2735: -#line 15512 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2741: +#line 15528 "/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 40325 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40395 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2736: -#line 15521 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2742: +#line 15537 "/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 40335 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40405 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2737: -#line 15534 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2743: +#line 15550 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40341 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40411 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2739: -#line 15540 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2745: +#line 15556 "/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 40350 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40420 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2740: -#line 15545 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2746: +#line 15561 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* Remove from the name resolution context stack the context of the @@ -40358,29 +40428,29 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); */ Lex->pop_context(); } -#line 40362 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40432 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2742: -#line 15556 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2748: +#line 15572 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 1; } -#line 40368 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40438 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2743: -#line 15560 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2749: +#line 15576 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 0; } -#line 40374 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40444 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2744: -#line 15561 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2750: +#line 15577 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)= 1; } -#line 40380 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40450 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2745: -#line 15565 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2751: +#line 15581 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; DBUG_ASSERT(lex->current_select->linkage != GLOBAL_OPTIONS_TYPE); @@ -40394,80 +40464,80 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } thd->where= "global ORDER clause"; } -#line 40398 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40468 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2746: -#line 15579 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2752: +#line 15595 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { thd->lex->current_select->no_table_names_allowed= 0; thd->where= ""; } -#line 40407 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40477 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2749: -#line 15591 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2755: +#line 15607 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)=1; } -#line 40413 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40483 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2750: -#line 15592 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2756: +#line 15608 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)=1; } -#line 40419 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40489 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2751: -#line 15593 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2757: +#line 15609 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.num)=0; } -#line 40425 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40495 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2752: -#line 15599 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2758: +#line 15615 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.select_lex)= Lex->current_select->master_unit()->first_select(); } -#line 40433 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40503 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2753: -#line 15604 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2759: +#line 15620 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.select_lex)= Lex->current_select->master_unit()->first_select(); } -#line 40441 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40511 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2755: -#line 15613 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2761: +#line 15629 "/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 40450 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40520 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2756: -#line 15618 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2762: +#line 15634 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->pop_context(); (yyval.select_lex)= (yyvsp[-4].select_lex); } -#line 40459 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40529 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2757: -#line 15627 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2763: +#line 15643 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { (yyval.select_lex)= (yyvsp[-1].select_lex); } -#line 40467 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40537 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2758: -#line 15633 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2764: +#line 15649 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (!lex->expr_allows_subselect || @@ -40486,11 +40556,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); if (mysql_new_select(Lex, 1)) MYSQL_YYABORT; } -#line 40490 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40560 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2759: -#line 15654 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2765: +#line 15670 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; @@ -40513,17 +40583,17 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->current_select->select_n_having_items+= child->select_n_having_items; } -#line 40517 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40587 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2764: -#line 15689 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2770: +#line 15705 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->options|= SELECT_STRAIGHT_JOIN; } -#line 40523 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40593 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2765: -#line 15691 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2771: +#line 15707 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (check_simple_select()) MYSQL_YYABORT; @@ -40531,73 +40601,73 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); YYPS->m_mdl_type= MDL_SHARED_READ; Select->options|= SELECT_HIGH_PRIORITY; } -#line 40535 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40605 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2766: -#line 15698 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2772: +#line 15714 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->options|= SELECT_DISTINCT; } -#line 40541 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40611 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2767: -#line 15699 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2773: +#line 15715 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->options|= SELECT_SMALL_RESULT; } -#line 40547 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40617 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2768: -#line 15700 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2774: +#line 15716 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->options|= SELECT_BIG_RESULT; } -#line 40553 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40623 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2769: -#line 15702 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2775: +#line 15718 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (check_simple_select()) MYSQL_YYABORT; Select->options|= OPTION_BUFFER_RESULT; } -#line 40563 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40633 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2770: -#line 15708 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2776: +#line 15724 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (check_simple_select()) MYSQL_YYABORT; Select->options|= OPTION_FOUND_ROWS; } -#line 40573 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40643 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2771: -#line 15713 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2777: +#line 15729 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Select->options|= SELECT_ALL; } -#line 40579 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40649 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2772: -#line 15724 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2778: +#line 15740 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40585 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40655 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2773: -#line 15726 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2779: +#line 15742 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40591 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40661 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2774: -#line 15728 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2780: +#line 15744 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40597 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40667 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2788: -#line 15761 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2794: +#line 15777 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* We have to distinguish missing DEFINER-clause from case when @@ -40608,58 +40678,58 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); */ thd->lex->definer= 0; } -#line 40612 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40682 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2789: -#line 15775 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2795: +#line 15791 "/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 40623 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40693 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2790: -#line 15791 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2796: +#line 15807 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_algorithm= DTYPE_ALGORITHM_UNDEFINED; } -#line 40629 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40699 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2791: -#line 15793 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2797: +#line 15809 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_algorithm= VIEW_ALGORITHM_MERGE; } -#line 40635 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40705 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2792: -#line 15795 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2798: +#line 15811 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_algorithm= VIEW_ALGORITHM_TMPTABLE; } -#line 40641 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40711 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2793: -#line 15800 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2799: +#line 15816 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_suid= VIEW_SUID_DEFAULT; } -#line 40647 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40717 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2794: -#line 15802 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2800: +#line 15818 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_suid= VIEW_SUID_DEFINER; } -#line 40653 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40723 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2795: -#line 15804 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2801: +#line 15820 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_suid= VIEW_SUID_INVOKER; } -#line 40659 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40729 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2796: -#line 15809 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2802: +#line 15825 "/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))) @@ -40673,37 +40743,37 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; lex->query_tables->open_strategy= TABLE_LIST::OPEN_STUB; } -#line 40677 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40747 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2798: -#line 15827 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2804: +#line 15843 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40683 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40753 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2800: -#line 15833 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2806: +#line 15849 "/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 40693 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40763 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2801: -#line 15839 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2807: +#line 15855 "/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 40703 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40773 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2802: -#line 15847 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2808: +#line 15863 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->parsing_options.allows_variable= FALSE; @@ -40712,11 +40782,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 40716 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40786 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2803: -#line 15856 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2809: +#line 15872 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; uint len= YYLIP->get_cpp_ptr() - lex->create_view_select.str; @@ -40729,60 +40799,60 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->parsing_options.allows_select_procedure= TRUE; lex->parsing_options.allows_derived= TRUE; } -#line 40733 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40803 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2806: -#line 15877 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2812: +#line 15893 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_check= VIEW_CHECK_NONE; } -#line 40739 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40809 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2807: -#line 15879 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2813: +#line 15895 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_check= VIEW_CHECK_CASCADED; } -#line 40745 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40815 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2808: -#line 15881 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2814: +#line 15897 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_check= VIEW_CHECK_CASCADED; } -#line 40751 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40821 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2809: -#line 15883 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2815: +#line 15899 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->create_view_check= VIEW_CHECK_LOCAL; } -#line 40757 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40827 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2810: -#line 15896 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2816: +#line 15912 "/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 40766 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40836 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2811: -#line 15905 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2817: +#line 15921 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* $10 */ Lex->raw_trg_on_table_name_begin= YYLIP->get_tok_start(); } -#line 40774 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40844 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2812: -#line 15911 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2818: +#line 15927 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* $14 */ Lex->raw_trg_on_table_name_end= YYLIP->get_tok_start(); } -#line 40782 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40852 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2813: -#line 15916 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2819: +#line 15932 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* $17 */ LEX *lex= thd->lex; Lex_input_stream *lip= YYLIP; @@ -40800,11 +40870,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sphead->set_body_start(thd, lip->get_cpp_ptr()); } -#line 40804 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40874 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2814: -#line 15934 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2820: +#line 15950 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* $19 */ LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -40828,23 +40898,23 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MDL_SHARED_NO_WRITE)) MYSQL_YYABORT; } -#line 40832 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40902 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2815: -#line 15966 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2821: +#line 15982 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { thd->lex->udf.type= UDFTYPE_AGGREGATE; } -#line 40838 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40908 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2816: -#line 15967 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2822: +#line 15983 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { thd->lex->udf.type= UDFTYPE_FUNCTION; } -#line 40844 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40914 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2817: -#line 15973 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2823: +#line 15989 "/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))) @@ -40856,11 +40926,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 40860 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40930 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2818: -#line 15991 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2824: +#line 16007 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* $5 */ LEX *lex= Lex; Lex_input_stream *lip= YYLIP; @@ -40880,50 +40950,50 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); tmp_param_begin++; lex->sphead->m_param_begin= tmp_param_begin; } -#line 40884 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40954 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2819: -#line 16012 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2825: +#line 16028 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* $8 */ Lex->sphead->m_param_end= YYLIP->get_cpp_tok_start(); } -#line 40892 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40962 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2820: -#line 16016 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2826: +#line 16032 "/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 40902 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40972 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2821: -#line 16022 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2827: +#line 16038 "/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 40912 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40982 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2822: -#line 16028 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2828: +#line 16044 "/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 40923 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 40993 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2823: -#line 16035 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2829: +#line 16051 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; sp_head *sp= lex->sphead; @@ -40972,11 +41042,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); } sp->restore_thd_mem_root(thd); } -#line 40976 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41046 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2824: -#line 16087 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2830: +#line 16103 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (Lex->add_create_options_with_check((yyvsp[-1].object_ddl_options))) MYSQL_YYABORT; @@ -40988,11 +41058,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; Lex->spname= (yyvsp[0].spname); } -#line 40992 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41062 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2825: -#line 16099 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2831: +#line 16115 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { const char* tmp_param_begin; @@ -41000,27 +41070,27 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); tmp_param_begin++; Lex->sphead->m_param_begin= tmp_param_begin; } -#line 41004 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41074 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2826: -#line 16108 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2832: +#line 16124 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sphead->m_param_end= YYLIP->get_cpp_tok_start(); } -#line 41012 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41082 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2827: -#line 16112 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2833: +#line 16128 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); } -#line 41020 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41090 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2828: -#line 16116 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2834: +#line 16132 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -41029,209 +41099,209 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); lex->sql_command= SQLCOM_CREATE_PROCEDURE; sp->restore_thd_mem_root(thd); } -#line 41033 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41103 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2829: -#line 16130 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2835: +#line 16146 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_XA_START; } -#line 41041 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41111 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2830: -#line 16134 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2836: +#line 16150 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_XA_END; } -#line 41049 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41119 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2831: -#line 16138 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2837: +#line 16154 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_XA_PREPARE; } -#line 41057 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41127 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2832: -#line 16142 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2838: +#line 16158 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_XA_COMMIT; } -#line 41065 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41135 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2833: -#line 16146 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2839: +#line 16162 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_XA_ROLLBACK; } -#line 41073 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41143 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2834: -#line 16150 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2840: +#line 16166 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->sql_command = SQLCOM_XA_RECOVER; } -#line 41081 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41151 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2835: -#line 16157 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2841: +#line 16173 "/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 41092 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41162 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2836: -#line 16164 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2842: +#line 16180 "/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 41103 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41173 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2837: -#line 16171 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2843: +#line 16187 "/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 41114 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41184 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2838: -#line 16180 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2844: +#line 16196 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 41120 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41190 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2839: -#line 16181 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2845: +#line 16197 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 41126 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41196 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2840: -#line 16185 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2846: +#line 16201 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->xa_opt=XA_NONE; } -#line 41132 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41202 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2841: -#line 16186 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2847: +#line 16202 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->xa_opt=XA_JOIN; } -#line 41138 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41208 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2842: -#line 16187 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2848: +#line 16203 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->xa_opt=XA_RESUME; } -#line 41144 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41214 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2843: -#line 16191 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2849: +#line 16207 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->xa_opt=XA_NONE; } -#line 41150 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41220 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2844: -#line 16192 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2850: +#line 16208 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->xa_opt=XA_ONE_PHASE; } -#line 41156 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41226 "/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 */ + case 2851: +#line 16213 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->xa_opt=XA_NONE; } -#line 41162 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41232 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2846: -#line 16199 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2852: +#line 16215 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->xa_opt=XA_SUSPEND; } -#line 41168 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41238 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2848: -#line 16204 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2854: +#line 16220 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 41174 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41244 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2849: -#line 16205 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2855: +#line 16221 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { Lex->xa_opt=XA_FOR_MIGRATE; } -#line 41180 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41250 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2850: -#line 16210 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2856: +#line 16226 "/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 41191 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41261 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2851: -#line 16217 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2857: +#line 16233 "/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 41202 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41272 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2852: -#line 16227 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2858: +#line 16243 "/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 41212 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41282 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2853: -#line 16233 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2859: +#line 16249 "/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 41223 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41293 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; - case 2854: -#line 16244 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2860: +#line 16260 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { YYERROR; } -#line 41231 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41301 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ break; -#line 41235 "/home/buildbot/git/mkdist/sql/sql_yacc.cc" /* yacc.c:1646 */ +#line 41305 "/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.h b/sql/sql_yacc.h index d9b7b905..c178abe6 100644 --- a/sql/sql_yacc.h +++ b/sql/sql_yacc.h @@ -179,513 +179,514 @@ extern int MYSQLdebug; DELAYED_SYM = 389, DELAY_KEY_WRITE_SYM = 390, DELETE_SYM = 391, - DESC = 392, - DESCRIBE = 393, - DES_KEY_FILE = 394, - DETERMINISTIC_SYM = 395, - DIAGNOSTICS_SYM = 396, - DIRECTORY_SYM = 397, - DISABLE_SYM = 398, - DISCARD = 399, - DISK_SYM = 400, - DISTINCT = 401, - DIV_SYM = 402, - DOUBLE_SYM = 403, - DO_DOMAIN_IDS_SYM = 404, - DO_SYM = 405, - DROP = 406, - DUAL_SYM = 407, - DUMPFILE = 408, - DUPLICATE_SYM = 409, - DYNAMIC_SYM = 410, - EACH_SYM = 411, - ELSE = 412, - ELSEIF_SYM = 413, - ENABLE_SYM = 414, - ENCLOSED = 415, - END = 416, - ENDS_SYM = 417, - END_OF_INPUT = 418, - ENGINES_SYM = 419, - ENGINE_SYM = 420, - ENUM = 421, - EQUAL_SYM = 422, - ERROR_SYM = 423, - ERRORS = 424, - ESCAPED = 425, - ESCAPE_SYM = 426, - EVENTS_SYM = 427, - EVENT_SYM = 428, - EVERY_SYM = 429, - EXCHANGE_SYM = 430, - EXAMINED_SYM = 431, - EXECUTE_SYM = 432, - EXISTS = 433, - EXIT_SYM = 434, - EXPANSION_SYM = 435, - EXPORT_SYM = 436, - EXTENDED_SYM = 437, - EXTENT_SIZE_SYM = 438, - EXTRACT_SYM = 439, - FALSE_SYM = 440, - FAST_SYM = 441, - FAULTS_SYM = 442, - FETCH_SYM = 443, - FILE_SYM = 444, - FIRST_SYM = 445, - FIXED_SYM = 446, - FLOAT_NUM = 447, - FLOAT_SYM = 448, - FLUSH_SYM = 449, - FORCE_SYM = 450, - FOREIGN = 451, - FOR_SYM = 452, - FORMAT_SYM = 453, - FOUND_SYM = 454, - FROM = 455, - FULL = 456, - FULLTEXT_SYM = 457, - FUNCTION_SYM = 458, - GE = 459, - GENERAL = 460, - GENERATED_SYM = 461, - GEOMETRYCOLLECTION = 462, - GEOMETRY_SYM = 463, - GET_FORMAT = 464, - GET_SYM = 465, - GLOBAL_SYM = 466, - GRANT = 467, - GRANTS = 468, - GROUP_SYM = 469, - GROUP_CONCAT_SYM = 470, - HANDLER_SYM = 471, - HARD_SYM = 472, - HASH_SYM = 473, - HAVING = 474, - HELP_SYM = 475, - HEX_NUM = 476, - HEX_STRING = 477, - HIGH_PRIORITY = 478, - HOST_SYM = 479, - HOSTS_SYM = 480, - HOUR_MICROSECOND_SYM = 481, - HOUR_MINUTE_SYM = 482, - HOUR_SECOND_SYM = 483, - HOUR_SYM = 484, - ID_SYM = 485, - IDENT = 486, - IDENTIFIED_SYM = 487, - IDENT_QUOTED = 488, - IF_SYM = 489, - IGNORE_DOMAIN_IDS_SYM = 490, - IGNORE_SYM = 491, - IGNORE_SERVER_IDS_SYM = 492, - IMPORT = 493, - INDEXES = 494, - INDEX_SYM = 495, - INFILE = 496, - INITIAL_SIZE_SYM = 497, - INNER_SYM = 498, - INOUT_SYM = 499, - INSENSITIVE_SYM = 500, - INSERT = 501, - INSERT_METHOD = 502, - INSTALL_SYM = 503, - INTERVAL_SYM = 504, - INTO = 505, - INT_SYM = 506, - INVOKER_SYM = 507, - IN_SYM = 508, - IO_SYM = 509, - IPC_SYM = 510, - IS = 511, - ISOLATION = 512, - ISSUER_SYM = 513, - ITERATE_SYM = 514, - JOIN_SYM = 515, - KEYS = 516, - KEY_BLOCK_SIZE = 517, - KEY_SYM = 518, - KILL_SYM = 519, - LANGUAGE_SYM = 520, - LAST_SYM = 521, - LAST_VALUE = 522, - LE = 523, - LEADING = 524, - LEAVES = 525, - LEAVE_SYM = 526, - LEFT = 527, - LESS_SYM = 528, - LEVEL_SYM = 529, - LEX_HOSTNAME = 530, - LIKE = 531, - LIMIT = 532, - LINEAR_SYM = 533, - LINES = 534, - LINESTRING = 535, - LIST_SYM = 536, - LOAD = 537, - LOCAL_SYM = 538, - LOCATOR_SYM = 539, - LOCKS_SYM = 540, - LOCK_SYM = 541, - LOGFILE_SYM = 542, - LOGS_SYM = 543, - LONGBLOB = 544, - LONGTEXT = 545, - LONG_NUM = 546, - LONG_SYM = 547, - LOOP_SYM = 548, - LOW_PRIORITY = 549, - MASTER_CONNECT_RETRY_SYM = 550, - MASTER_GTID_POS_SYM = 551, - MASTER_HOST_SYM = 552, - MASTER_LOG_FILE_SYM = 553, - MASTER_LOG_POS_SYM = 554, - MASTER_PASSWORD_SYM = 555, - MASTER_PORT_SYM = 556, - MASTER_SERVER_ID_SYM = 557, - MASTER_SSL_CAPATH_SYM = 558, - MASTER_SSL_CA_SYM = 559, - MASTER_SSL_CERT_SYM = 560, - MASTER_SSL_CIPHER_SYM = 561, - MASTER_SSL_CRL_SYM = 562, - MASTER_SSL_CRLPATH_SYM = 563, - MASTER_SSL_KEY_SYM = 564, - MASTER_SSL_SYM = 565, - MASTER_SSL_VERIFY_SERVER_CERT_SYM = 566, - MASTER_SYM = 567, - MASTER_USER_SYM = 568, - MASTER_USE_GTID_SYM = 569, - MASTER_HEARTBEAT_PERIOD_SYM = 570, - MATCH = 571, - MAX_CONNECTIONS_PER_HOUR = 572, - MAX_QUERIES_PER_HOUR = 573, - MAX_ROWS = 574, - MAX_SIZE_SYM = 575, - MAX_SYM = 576, - MAX_UPDATES_PER_HOUR = 577, - MAX_STATEMENT_TIME_SYM = 578, - MAX_USER_CONNECTIONS_SYM = 579, - MAX_VALUE_SYM = 580, - MEDIUMBLOB = 581, - MEDIUMINT = 582, - MEDIUMTEXT = 583, - MEDIUM_SYM = 584, - MEMORY_SYM = 585, - MERGE_SYM = 586, - MESSAGE_TEXT_SYM = 587, - MICROSECOND_SYM = 588, - MIGRATE_SYM = 589, - MINUTE_MICROSECOND_SYM = 590, - MINUTE_SECOND_SYM = 591, - MINUTE_SYM = 592, - MIN_ROWS = 593, - MIN_SYM = 594, - MODE_SYM = 595, - MODIFIES_SYM = 596, - MODIFY_SYM = 597, - MOD_SYM = 598, - MONTH_SYM = 599, - MULTILINESTRING = 600, - MULTIPOINT = 601, - MULTIPOLYGON = 602, - MUTEX_SYM = 603, - MYSQL_SYM = 604, - MYSQL_ERRNO_SYM = 605, - NAMES_SYM = 606, - NAME_SYM = 607, - NATIONAL_SYM = 608, - NATURAL = 609, - NCHAR_STRING = 610, - NCHAR_SYM = 611, - NE = 612, - NEG = 613, - NEW_SYM = 614, - NEXT_SYM = 615, - NODEGROUP_SYM = 616, - NONE_SYM = 617, - NOT2_SYM = 618, - NOT_SYM = 619, - NOW_SYM = 620, - NO_SYM = 621, - NO_WAIT_SYM = 622, - NO_WRITE_TO_BINLOG = 623, - NULL_SYM = 624, - NUM = 625, - NUMBER_SYM = 626, - NUMERIC_SYM = 627, - NVARCHAR_SYM = 628, - OFFSET_SYM = 629, - OLD_PASSWORD_SYM = 630, - ON = 631, - ONE_SYM = 632, - ONLY_SYM = 633, - ONLINE_SYM = 634, - OPEN_SYM = 635, - OPTIMIZE = 636, - OPTIONS_SYM = 637, - OPTION = 638, - OPTIONALLY = 639, - OR2_SYM = 640, - ORDER_SYM = 641, - OR_OR_SYM = 642, - OR_SYM = 643, - OUTER = 644, - OUTFILE = 645, - OUT_SYM = 646, - OWNER_SYM = 647, - PACK_KEYS_SYM = 648, - PAGE_SYM = 649, - PAGE_CHECKSUM_SYM = 650, - PARAM_MARKER = 651, - PARSER_SYM = 652, - PARSE_VCOL_EXPR_SYM = 653, - PARTIAL = 654, - PARTITION_SYM = 655, - PARTITIONS_SYM = 656, - PARTITIONING_SYM = 657, - PASSWORD_SYM = 658, - PERSISTENT_SYM = 659, - PHASE_SYM = 660, - PLUGINS_SYM = 661, - PLUGIN_SYM = 662, - POINT_SYM = 663, - POLYGON = 664, - PORT_SYM = 665, - POSITION_SYM = 666, - PRECISION = 667, - PREPARE_SYM = 668, - PRESERVE_SYM = 669, - PREV_SYM = 670, - PRIMARY_SYM = 671, - PRIVILEGES = 672, - PROCEDURE_SYM = 673, - PROCESS = 674, - PROCESSLIST_SYM = 675, - PROFILE_SYM = 676, - PROFILES_SYM = 677, - PROXY_SYM = 678, - PURGE = 679, - QUARTER_SYM = 680, - QUERY_SYM = 681, - QUICK = 682, - RANGE_SYM = 683, - READS_SYM = 684, - READ_ONLY_SYM = 685, - READ_SYM = 686, - READ_WRITE_SYM = 687, - REAL = 688, - REBUILD_SYM = 689, - RECOVER_SYM = 690, - REDOFILE_SYM = 691, - REDO_BUFFER_SIZE_SYM = 692, - REDUNDANT_SYM = 693, - REFERENCES = 694, - REGEXP = 695, - RELAY = 696, - RELAYLOG_SYM = 697, - RELAY_LOG_FILE_SYM = 698, - RELAY_LOG_POS_SYM = 699, - RELAY_THREAD = 700, - RELEASE_SYM = 701, - RELOAD = 702, - REMOVE_SYM = 703, - RENAME = 704, - REORGANIZE_SYM = 705, - REPAIR = 706, - REPEATABLE_SYM = 707, - REPEAT_SYM = 708, - REPLACE = 709, - REPLICATION = 710, - REQUIRE_SYM = 711, - RESET_SYM = 712, - RESIGNAL_SYM = 713, - RESOURCES = 714, - RESTORE_SYM = 715, - RESTRICT = 716, - RESUME_SYM = 717, - RETURNED_SQLSTATE_SYM = 718, - RETURNING_SYM = 719, - RETURNS_SYM = 720, - RETURN_SYM = 721, - REVERSE_SYM = 722, - REVOKE = 723, - RIGHT = 724, - ROLE_SYM = 725, - ROLLBACK_SYM = 726, - ROLLUP_SYM = 727, - ROUTINE_SYM = 728, - ROWS_SYM = 729, - ROW_FORMAT_SYM = 730, - ROW_SYM = 731, - ROW_COUNT_SYM = 732, - RTREE_SYM = 733, - SAVEPOINT_SYM = 734, - SCHEDULE_SYM = 735, - SCHEMA_NAME_SYM = 736, - SECOND_MICROSECOND_SYM = 737, - SECOND_SYM = 738, - SECURITY_SYM = 739, - SELECT_SYM = 740, - SENSITIVE_SYM = 741, - SEPARATOR_SYM = 742, - SERIALIZABLE_SYM = 743, - SERIAL_SYM = 744, - SESSION_SYM = 745, - SERVER_SYM = 746, - SERVER_OPTIONS = 747, - SET = 748, - SET_VAR = 749, - SHARE_SYM = 750, - SHIFT_LEFT = 751, - SHIFT_RIGHT = 752, - SHOW = 753, - SHUTDOWN = 754, - SIGNAL_SYM = 755, - SIGNED_SYM = 756, - SIMPLE_SYM = 757, - SLAVE = 758, - SLAVES = 759, - SLAVE_POS_SYM = 760, - SLOW = 761, - SMALLINT = 762, - SNAPSHOT_SYM = 763, - SOCKET_SYM = 764, - SOFT_SYM = 765, - SONAME_SYM = 766, - SOUNDS_SYM = 767, - SOURCE_SYM = 768, - SPATIAL_SYM = 769, - SPECIFIC_SYM = 770, - SQLEXCEPTION_SYM = 771, - SQLSTATE_SYM = 772, - SQLWARNING_SYM = 773, - SQL_BIG_RESULT = 774, - SQL_BUFFER_RESULT = 775, - SQL_CACHE_SYM = 776, - SQL_CALC_FOUND_ROWS = 777, - SQL_NO_CACHE_SYM = 778, - SQL_SMALL_RESULT = 779, - SQL_SYM = 780, - SQL_THREAD = 781, - REF_SYSTEM_ID_SYM = 782, - SSL_SYM = 783, - STARTING = 784, - STARTS_SYM = 785, - START_SYM = 786, - STATEMENT_SYM = 787, - STATS_AUTO_RECALC_SYM = 788, - STATS_PERSISTENT_SYM = 789, - STATS_SAMPLE_PAGES_SYM = 790, - STATUS_SYM = 791, - STDDEV_SAMP_SYM = 792, - STD_SYM = 793, - STOP_SYM = 794, - STORAGE_SYM = 795, - STRAIGHT_JOIN = 796, - STRING_SYM = 797, - SUBCLASS_ORIGIN_SYM = 798, - SUBDATE_SYM = 799, - SUBJECT_SYM = 800, - SUBPARTITIONS_SYM = 801, - SUBPARTITION_SYM = 802, - SUBSTRING = 803, - SUM_SYM = 804, - SUPER_SYM = 805, - SUSPEND_SYM = 806, - SWAPS_SYM = 807, - SWITCHES_SYM = 808, - SYSDATE = 809, - TABLES = 810, - TABLESPACE = 811, - TABLE_REF_PRIORITY = 812, - TABLE_SYM = 813, - TABLE_CHECKSUM_SYM = 814, - TABLE_NAME_SYM = 815, - TEMPORARY = 816, - TEMPTABLE_SYM = 817, - TERMINATED = 818, - TEXT_STRING = 819, - TEXT_SYM = 820, - THAN_SYM = 821, - THEN_SYM = 822, - TIMESTAMP = 823, - TIMESTAMP_ADD = 824, - TIMESTAMP_DIFF = 825, - TIME_SYM = 826, - TINYBLOB = 827, - TINYINT = 828, - TINYTEXT = 829, - TO_SYM = 830, - TRAILING = 831, - TRANSACTION_SYM = 832, - TRANSACTIONAL_SYM = 833, - TRIGGERS_SYM = 834, - TRIGGER_SYM = 835, - TRIM = 836, - TRUE_SYM = 837, - TRUNCATE_SYM = 838, - TYPES_SYM = 839, - TYPE_SYM = 840, - UDF_RETURNS_SYM = 841, - ULONGLONG_NUM = 842, - UNCOMMITTED_SYM = 843, - UNDEFINED_SYM = 844, - UNDERSCORE_CHARSET = 845, - UNDOFILE_SYM = 846, - UNDO_BUFFER_SIZE_SYM = 847, - UNDO_SYM = 848, - UNICODE_SYM = 849, - UNINSTALL_SYM = 850, - UNION_SYM = 851, - UNIQUE_SYM = 852, - UNKNOWN_SYM = 853, - UNLOCK_SYM = 854, - UNSIGNED = 855, - UNTIL_SYM = 856, - UPDATE_SYM = 857, - UPGRADE_SYM = 858, - USAGE = 859, - USER = 860, - USE_FRM = 861, - USE_SYM = 862, - USING = 863, - UTC_DATE_SYM = 864, - UTC_TIMESTAMP_SYM = 865, - UTC_TIME_SYM = 866, - VALUES = 867, - VALUE_SYM = 868, - VARBINARY = 869, - VARCHAR = 870, - VARIABLES = 871, - VARIANCE_SYM = 872, - VARYING = 873, - VAR_SAMP_SYM = 874, - VIA_SYM = 875, - VIEW_SYM = 876, - VIRTUAL_SYM = 877, - WAIT_SYM = 878, - WARNINGS = 879, - WEEK_SYM = 880, - WEIGHT_STRING_SYM = 881, - WHEN_SYM = 882, - WHERE = 883, - WHILE_SYM = 884, - WITH = 885, - WITH_CUBE_SYM = 886, - WITH_ROLLUP_SYM = 887, - WORK_SYM = 888, - WRAPPER_SYM = 889, - WRITE_SYM = 890, - X509_SYM = 891, - XA_SYM = 892, - XML_SYM = 893, - XOR = 894, - YEAR_MONTH_SYM = 895, - YEAR_SYM = 896, - ZEROFILL = 897, - IMPOSSIBLE_ACTION = 898 + DELETE_DOMAIN_ID_SYM = 392, + DESC = 393, + DESCRIBE = 394, + DES_KEY_FILE = 395, + DETERMINISTIC_SYM = 396, + DIAGNOSTICS_SYM = 397, + DIRECTORY_SYM = 398, + DISABLE_SYM = 399, + DISCARD = 400, + DISK_SYM = 401, + DISTINCT = 402, + DIV_SYM = 403, + DOUBLE_SYM = 404, + DO_DOMAIN_IDS_SYM = 405, + DO_SYM = 406, + DROP = 407, + DUAL_SYM = 408, + DUMPFILE = 409, + DUPLICATE_SYM = 410, + DYNAMIC_SYM = 411, + EACH_SYM = 412, + ELSE = 413, + ELSEIF_SYM = 414, + ENABLE_SYM = 415, + ENCLOSED = 416, + END = 417, + ENDS_SYM = 418, + END_OF_INPUT = 419, + ENGINES_SYM = 420, + ENGINE_SYM = 421, + ENUM = 422, + EQUAL_SYM = 423, + ERROR_SYM = 424, + ERRORS = 425, + ESCAPED = 426, + ESCAPE_SYM = 427, + EVENTS_SYM = 428, + EVENT_SYM = 429, + EVERY_SYM = 430, + EXCHANGE_SYM = 431, + EXAMINED_SYM = 432, + EXECUTE_SYM = 433, + EXISTS = 434, + EXIT_SYM = 435, + EXPANSION_SYM = 436, + EXPORT_SYM = 437, + EXTENDED_SYM = 438, + EXTENT_SIZE_SYM = 439, + EXTRACT_SYM = 440, + FALSE_SYM = 441, + FAST_SYM = 442, + FAULTS_SYM = 443, + FETCH_SYM = 444, + FILE_SYM = 445, + FIRST_SYM = 446, + FIXED_SYM = 447, + FLOAT_NUM = 448, + FLOAT_SYM = 449, + FLUSH_SYM = 450, + FORCE_SYM = 451, + FOREIGN = 452, + FOR_SYM = 453, + FORMAT_SYM = 454, + FOUND_SYM = 455, + FROM = 456, + FULL = 457, + FULLTEXT_SYM = 458, + FUNCTION_SYM = 459, + GE = 460, + GENERAL = 461, + GENERATED_SYM = 462, + GEOMETRYCOLLECTION = 463, + GEOMETRY_SYM = 464, + GET_FORMAT = 465, + GET_SYM = 466, + GLOBAL_SYM = 467, + GRANT = 468, + GRANTS = 469, + GROUP_SYM = 470, + GROUP_CONCAT_SYM = 471, + HANDLER_SYM = 472, + HARD_SYM = 473, + HASH_SYM = 474, + HAVING = 475, + HELP_SYM = 476, + HEX_NUM = 477, + HEX_STRING = 478, + HIGH_PRIORITY = 479, + HOST_SYM = 480, + HOSTS_SYM = 481, + HOUR_MICROSECOND_SYM = 482, + HOUR_MINUTE_SYM = 483, + HOUR_SECOND_SYM = 484, + HOUR_SYM = 485, + ID_SYM = 486, + IDENT = 487, + IDENTIFIED_SYM = 488, + IDENT_QUOTED = 489, + IF_SYM = 490, + IGNORE_DOMAIN_IDS_SYM = 491, + IGNORE_SYM = 492, + IGNORE_SERVER_IDS_SYM = 493, + IMPORT = 494, + INDEXES = 495, + INDEX_SYM = 496, + INFILE = 497, + INITIAL_SIZE_SYM = 498, + INNER_SYM = 499, + INOUT_SYM = 500, + INSENSITIVE_SYM = 501, + INSERT = 502, + INSERT_METHOD = 503, + INSTALL_SYM = 504, + INTERVAL_SYM = 505, + INTO = 506, + INT_SYM = 507, + INVOKER_SYM = 508, + IN_SYM = 509, + IO_SYM = 510, + IPC_SYM = 511, + IS = 512, + ISOLATION = 513, + ISSUER_SYM = 514, + ITERATE_SYM = 515, + JOIN_SYM = 516, + KEYS = 517, + KEY_BLOCK_SIZE = 518, + KEY_SYM = 519, + KILL_SYM = 520, + LANGUAGE_SYM = 521, + LAST_SYM = 522, + LAST_VALUE = 523, + LE = 524, + LEADING = 525, + LEAVES = 526, + LEAVE_SYM = 527, + LEFT = 528, + LESS_SYM = 529, + LEVEL_SYM = 530, + LEX_HOSTNAME = 531, + LIKE = 532, + LIMIT = 533, + LINEAR_SYM = 534, + LINES = 535, + LINESTRING = 536, + LIST_SYM = 537, + LOAD = 538, + LOCAL_SYM = 539, + LOCATOR_SYM = 540, + LOCKS_SYM = 541, + LOCK_SYM = 542, + LOGFILE_SYM = 543, + LOGS_SYM = 544, + LONGBLOB = 545, + LONGTEXT = 546, + LONG_NUM = 547, + LONG_SYM = 548, + LOOP_SYM = 549, + LOW_PRIORITY = 550, + MASTER_CONNECT_RETRY_SYM = 551, + MASTER_GTID_POS_SYM = 552, + MASTER_HOST_SYM = 553, + MASTER_LOG_FILE_SYM = 554, + MASTER_LOG_POS_SYM = 555, + MASTER_PASSWORD_SYM = 556, + MASTER_PORT_SYM = 557, + MASTER_SERVER_ID_SYM = 558, + MASTER_SSL_CAPATH_SYM = 559, + MASTER_SSL_CA_SYM = 560, + MASTER_SSL_CERT_SYM = 561, + MASTER_SSL_CIPHER_SYM = 562, + MASTER_SSL_CRL_SYM = 563, + MASTER_SSL_CRLPATH_SYM = 564, + MASTER_SSL_KEY_SYM = 565, + MASTER_SSL_SYM = 566, + MASTER_SSL_VERIFY_SERVER_CERT_SYM = 567, + MASTER_SYM = 568, + MASTER_USER_SYM = 569, + MASTER_USE_GTID_SYM = 570, + MASTER_HEARTBEAT_PERIOD_SYM = 571, + MATCH = 572, + MAX_CONNECTIONS_PER_HOUR = 573, + MAX_QUERIES_PER_HOUR = 574, + MAX_ROWS = 575, + MAX_SIZE_SYM = 576, + MAX_SYM = 577, + MAX_UPDATES_PER_HOUR = 578, + MAX_STATEMENT_TIME_SYM = 579, + MAX_USER_CONNECTIONS_SYM = 580, + MAX_VALUE_SYM = 581, + MEDIUMBLOB = 582, + MEDIUMINT = 583, + MEDIUMTEXT = 584, + MEDIUM_SYM = 585, + MEMORY_SYM = 586, + MERGE_SYM = 587, + MESSAGE_TEXT_SYM = 588, + MICROSECOND_SYM = 589, + MIGRATE_SYM = 590, + MINUTE_MICROSECOND_SYM = 591, + MINUTE_SECOND_SYM = 592, + MINUTE_SYM = 593, + MIN_ROWS = 594, + MIN_SYM = 595, + MODE_SYM = 596, + MODIFIES_SYM = 597, + MODIFY_SYM = 598, + MOD_SYM = 599, + MONTH_SYM = 600, + MULTILINESTRING = 601, + MULTIPOINT = 602, + MULTIPOLYGON = 603, + MUTEX_SYM = 604, + MYSQL_SYM = 605, + MYSQL_ERRNO_SYM = 606, + NAMES_SYM = 607, + NAME_SYM = 608, + NATIONAL_SYM = 609, + NATURAL = 610, + NCHAR_STRING = 611, + NCHAR_SYM = 612, + NE = 613, + NEG = 614, + NEW_SYM = 615, + NEXT_SYM = 616, + NODEGROUP_SYM = 617, + NONE_SYM = 618, + NOT2_SYM = 619, + NOT_SYM = 620, + NOW_SYM = 621, + NO_SYM = 622, + NO_WAIT_SYM = 623, + NO_WRITE_TO_BINLOG = 624, + NULL_SYM = 625, + NUM = 626, + NUMBER_SYM = 627, + NUMERIC_SYM = 628, + NVARCHAR_SYM = 629, + OFFSET_SYM = 630, + OLD_PASSWORD_SYM = 631, + ON = 632, + ONE_SYM = 633, + ONLY_SYM = 634, + ONLINE_SYM = 635, + OPEN_SYM = 636, + OPTIMIZE = 637, + OPTIONS_SYM = 638, + OPTION = 639, + OPTIONALLY = 640, + OR2_SYM = 641, + ORDER_SYM = 642, + OR_OR_SYM = 643, + OR_SYM = 644, + OUTER = 645, + OUTFILE = 646, + OUT_SYM = 647, + OWNER_SYM = 648, + PACK_KEYS_SYM = 649, + PAGE_SYM = 650, + PAGE_CHECKSUM_SYM = 651, + PARAM_MARKER = 652, + PARSER_SYM = 653, + PARSE_VCOL_EXPR_SYM = 654, + PARTIAL = 655, + PARTITION_SYM = 656, + PARTITIONS_SYM = 657, + PARTITIONING_SYM = 658, + PASSWORD_SYM = 659, + PERSISTENT_SYM = 660, + PHASE_SYM = 661, + PLUGINS_SYM = 662, + PLUGIN_SYM = 663, + POINT_SYM = 664, + POLYGON = 665, + PORT_SYM = 666, + POSITION_SYM = 667, + PRECISION = 668, + PREPARE_SYM = 669, + PRESERVE_SYM = 670, + PREV_SYM = 671, + PRIMARY_SYM = 672, + PRIVILEGES = 673, + PROCEDURE_SYM = 674, + PROCESS = 675, + PROCESSLIST_SYM = 676, + PROFILE_SYM = 677, + PROFILES_SYM = 678, + PROXY_SYM = 679, + PURGE = 680, + QUARTER_SYM = 681, + QUERY_SYM = 682, + QUICK = 683, + RANGE_SYM = 684, + READS_SYM = 685, + READ_ONLY_SYM = 686, + READ_SYM = 687, + READ_WRITE_SYM = 688, + REAL = 689, + REBUILD_SYM = 690, + RECOVER_SYM = 691, + REDOFILE_SYM = 692, + REDO_BUFFER_SIZE_SYM = 693, + REDUNDANT_SYM = 694, + REFERENCES = 695, + REGEXP = 696, + RELAY = 697, + RELAYLOG_SYM = 698, + RELAY_LOG_FILE_SYM = 699, + RELAY_LOG_POS_SYM = 700, + RELAY_THREAD = 701, + RELEASE_SYM = 702, + RELOAD = 703, + REMOVE_SYM = 704, + RENAME = 705, + REORGANIZE_SYM = 706, + REPAIR = 707, + REPEATABLE_SYM = 708, + REPEAT_SYM = 709, + REPLACE = 710, + REPLICATION = 711, + REQUIRE_SYM = 712, + RESET_SYM = 713, + RESIGNAL_SYM = 714, + RESOURCES = 715, + RESTORE_SYM = 716, + RESTRICT = 717, + RESUME_SYM = 718, + RETURNED_SQLSTATE_SYM = 719, + RETURNING_SYM = 720, + RETURNS_SYM = 721, + RETURN_SYM = 722, + REVERSE_SYM = 723, + REVOKE = 724, + RIGHT = 725, + ROLE_SYM = 726, + ROLLBACK_SYM = 727, + ROLLUP_SYM = 728, + ROUTINE_SYM = 729, + ROWS_SYM = 730, + ROW_FORMAT_SYM = 731, + ROW_SYM = 732, + ROW_COUNT_SYM = 733, + RTREE_SYM = 734, + SAVEPOINT_SYM = 735, + SCHEDULE_SYM = 736, + SCHEMA_NAME_SYM = 737, + SECOND_MICROSECOND_SYM = 738, + SECOND_SYM = 739, + SECURITY_SYM = 740, + SELECT_SYM = 741, + SENSITIVE_SYM = 742, + SEPARATOR_SYM = 743, + SERIALIZABLE_SYM = 744, + SERIAL_SYM = 745, + SESSION_SYM = 746, + SERVER_SYM = 747, + SERVER_OPTIONS = 748, + SET = 749, + SET_VAR = 750, + SHARE_SYM = 751, + SHIFT_LEFT = 752, + SHIFT_RIGHT = 753, + SHOW = 754, + SHUTDOWN = 755, + SIGNAL_SYM = 756, + SIGNED_SYM = 757, + SIMPLE_SYM = 758, + SLAVE = 759, + SLAVES = 760, + SLAVE_POS_SYM = 761, + SLOW = 762, + SMALLINT = 763, + SNAPSHOT_SYM = 764, + SOCKET_SYM = 765, + SOFT_SYM = 766, + SONAME_SYM = 767, + SOUNDS_SYM = 768, + SOURCE_SYM = 769, + SPATIAL_SYM = 770, + SPECIFIC_SYM = 771, + SQLEXCEPTION_SYM = 772, + SQLSTATE_SYM = 773, + SQLWARNING_SYM = 774, + SQL_BIG_RESULT = 775, + SQL_BUFFER_RESULT = 776, + SQL_CACHE_SYM = 777, + SQL_CALC_FOUND_ROWS = 778, + SQL_NO_CACHE_SYM = 779, + SQL_SMALL_RESULT = 780, + SQL_SYM = 781, + SQL_THREAD = 782, + REF_SYSTEM_ID_SYM = 783, + SSL_SYM = 784, + STARTING = 785, + STARTS_SYM = 786, + START_SYM = 787, + STATEMENT_SYM = 788, + STATS_AUTO_RECALC_SYM = 789, + STATS_PERSISTENT_SYM = 790, + STATS_SAMPLE_PAGES_SYM = 791, + STATUS_SYM = 792, + STDDEV_SAMP_SYM = 793, + STD_SYM = 794, + STOP_SYM = 795, + STORAGE_SYM = 796, + STRAIGHT_JOIN = 797, + STRING_SYM = 798, + SUBCLASS_ORIGIN_SYM = 799, + SUBDATE_SYM = 800, + SUBJECT_SYM = 801, + SUBPARTITIONS_SYM = 802, + SUBPARTITION_SYM = 803, + SUBSTRING = 804, + SUM_SYM = 805, + SUPER_SYM = 806, + SUSPEND_SYM = 807, + SWAPS_SYM = 808, + SWITCHES_SYM = 809, + SYSDATE = 810, + TABLES = 811, + TABLESPACE = 812, + TABLE_REF_PRIORITY = 813, + TABLE_SYM = 814, + TABLE_CHECKSUM_SYM = 815, + TABLE_NAME_SYM = 816, + TEMPORARY = 817, + TEMPTABLE_SYM = 818, + TERMINATED = 819, + TEXT_STRING = 820, + TEXT_SYM = 821, + THAN_SYM = 822, + THEN_SYM = 823, + TIMESTAMP = 824, + TIMESTAMP_ADD = 825, + TIMESTAMP_DIFF = 826, + TIME_SYM = 827, + TINYBLOB = 828, + TINYINT = 829, + TINYTEXT = 830, + TO_SYM = 831, + TRAILING = 832, + TRANSACTION_SYM = 833, + TRANSACTIONAL_SYM = 834, + TRIGGERS_SYM = 835, + TRIGGER_SYM = 836, + TRIM = 837, + TRUE_SYM = 838, + TRUNCATE_SYM = 839, + TYPES_SYM = 840, + TYPE_SYM = 841, + UDF_RETURNS_SYM = 842, + ULONGLONG_NUM = 843, + UNCOMMITTED_SYM = 844, + UNDEFINED_SYM = 845, + UNDERSCORE_CHARSET = 846, + UNDOFILE_SYM = 847, + UNDO_BUFFER_SIZE_SYM = 848, + UNDO_SYM = 849, + UNICODE_SYM = 850, + UNINSTALL_SYM = 851, + UNION_SYM = 852, + UNIQUE_SYM = 853, + UNKNOWN_SYM = 854, + UNLOCK_SYM = 855, + UNSIGNED = 856, + UNTIL_SYM = 857, + UPDATE_SYM = 858, + UPGRADE_SYM = 859, + USAGE = 860, + USER = 861, + USE_FRM = 862, + USE_SYM = 863, + USING = 864, + UTC_DATE_SYM = 865, + UTC_TIMESTAMP_SYM = 866, + UTC_TIME_SYM = 867, + VALUES = 868, + VALUE_SYM = 869, + VARBINARY = 870, + VARCHAR = 871, + VARIABLES = 872, + VARIANCE_SYM = 873, + VARYING = 874, + VAR_SAMP_SYM = 875, + VIA_SYM = 876, + VIEW_SYM = 877, + VIRTUAL_SYM = 878, + WAIT_SYM = 879, + WARNINGS = 880, + WEEK_SYM = 881, + WEIGHT_STRING_SYM = 882, + WHEN_SYM = 883, + WHERE = 884, + WHILE_SYM = 885, + WITH = 886, + WITH_CUBE_SYM = 887, + WITH_ROLLUP_SYM = 888, + WORK_SYM = 889, + WRAPPER_SYM = 890, + WRITE_SYM = 891, + X509_SYM = 892, + XA_SYM = 893, + XML_SYM = 894, + XOR = 895, + YEAR_MONTH_SYM = 896, + YEAR_SYM = 897, + ZEROFILL = 898, + IMPOSSIBLE_ACTION = 899 }; #endif /* Tokens. */ @@ -823,513 +824,514 @@ extern int MYSQLdebug; #define DELAYED_SYM 389 #define DELAY_KEY_WRITE_SYM 390 #define DELETE_SYM 391 -#define DESC 392 -#define DESCRIBE 393 -#define DES_KEY_FILE 394 -#define DETERMINISTIC_SYM 395 -#define DIAGNOSTICS_SYM 396 -#define DIRECTORY_SYM 397 -#define DISABLE_SYM 398 -#define DISCARD 399 -#define DISK_SYM 400 -#define DISTINCT 401 -#define DIV_SYM 402 -#define DOUBLE_SYM 403 -#define DO_DOMAIN_IDS_SYM 404 -#define DO_SYM 405 -#define DROP 406 -#define DUAL_SYM 407 -#define DUMPFILE 408 -#define DUPLICATE_SYM 409 -#define DYNAMIC_SYM 410 -#define EACH_SYM 411 -#define ELSE 412 -#define ELSEIF_SYM 413 -#define ENABLE_SYM 414 -#define ENCLOSED 415 -#define END 416 -#define ENDS_SYM 417 -#define END_OF_INPUT 418 -#define ENGINES_SYM 419 -#define ENGINE_SYM 420 -#define ENUM 421 -#define EQUAL_SYM 422 -#define ERROR_SYM 423 -#define ERRORS 424 -#define ESCAPED 425 -#define ESCAPE_SYM 426 -#define EVENTS_SYM 427 -#define EVENT_SYM 428 -#define EVERY_SYM 429 -#define EXCHANGE_SYM 430 -#define EXAMINED_SYM 431 -#define EXECUTE_SYM 432 -#define EXISTS 433 -#define EXIT_SYM 434 -#define EXPANSION_SYM 435 -#define EXPORT_SYM 436 -#define EXTENDED_SYM 437 -#define EXTENT_SIZE_SYM 438 -#define EXTRACT_SYM 439 -#define FALSE_SYM 440 -#define FAST_SYM 441 -#define FAULTS_SYM 442 -#define FETCH_SYM 443 -#define FILE_SYM 444 -#define FIRST_SYM 445 -#define FIXED_SYM 446 -#define FLOAT_NUM 447 -#define FLOAT_SYM 448 -#define FLUSH_SYM 449 -#define FORCE_SYM 450 -#define FOREIGN 451 -#define FOR_SYM 452 -#define FORMAT_SYM 453 -#define FOUND_SYM 454 -#define FROM 455 -#define FULL 456 -#define FULLTEXT_SYM 457 -#define FUNCTION_SYM 458 -#define GE 459 -#define GENERAL 460 -#define GENERATED_SYM 461 -#define GEOMETRYCOLLECTION 462 -#define GEOMETRY_SYM 463 -#define GET_FORMAT 464 -#define GET_SYM 465 -#define GLOBAL_SYM 466 -#define GRANT 467 -#define GRANTS 468 -#define GROUP_SYM 469 -#define GROUP_CONCAT_SYM 470 -#define HANDLER_SYM 471 -#define HARD_SYM 472 -#define HASH_SYM 473 -#define HAVING 474 -#define HELP_SYM 475 -#define HEX_NUM 476 -#define HEX_STRING 477 -#define HIGH_PRIORITY 478 -#define HOST_SYM 479 -#define HOSTS_SYM 480 -#define HOUR_MICROSECOND_SYM 481 -#define HOUR_MINUTE_SYM 482 -#define HOUR_SECOND_SYM 483 -#define HOUR_SYM 484 -#define ID_SYM 485 -#define IDENT 486 -#define IDENTIFIED_SYM 487 -#define IDENT_QUOTED 488 -#define IF_SYM 489 -#define IGNORE_DOMAIN_IDS_SYM 490 -#define IGNORE_SYM 491 -#define IGNORE_SERVER_IDS_SYM 492 -#define IMPORT 493 -#define INDEXES 494 -#define INDEX_SYM 495 -#define INFILE 496 -#define INITIAL_SIZE_SYM 497 -#define INNER_SYM 498 -#define INOUT_SYM 499 -#define INSENSITIVE_SYM 500 -#define INSERT 501 -#define INSERT_METHOD 502 -#define INSTALL_SYM 503 -#define INTERVAL_SYM 504 -#define INTO 505 -#define INT_SYM 506 -#define INVOKER_SYM 507 -#define IN_SYM 508 -#define IO_SYM 509 -#define IPC_SYM 510 -#define IS 511 -#define ISOLATION 512 -#define ISSUER_SYM 513 -#define ITERATE_SYM 514 -#define JOIN_SYM 515 -#define KEYS 516 -#define KEY_BLOCK_SIZE 517 -#define KEY_SYM 518 -#define KILL_SYM 519 -#define LANGUAGE_SYM 520 -#define LAST_SYM 521 -#define LAST_VALUE 522 -#define LE 523 -#define LEADING 524 -#define LEAVES 525 -#define LEAVE_SYM 526 -#define LEFT 527 -#define LESS_SYM 528 -#define LEVEL_SYM 529 -#define LEX_HOSTNAME 530 -#define LIKE 531 -#define LIMIT 532 -#define LINEAR_SYM 533 -#define LINES 534 -#define LINESTRING 535 -#define LIST_SYM 536 -#define LOAD 537 -#define LOCAL_SYM 538 -#define LOCATOR_SYM 539 -#define LOCKS_SYM 540 -#define LOCK_SYM 541 -#define LOGFILE_SYM 542 -#define LOGS_SYM 543 -#define LONGBLOB 544 -#define LONGTEXT 545 -#define LONG_NUM 546 -#define LONG_SYM 547 -#define LOOP_SYM 548 -#define LOW_PRIORITY 549 -#define MASTER_CONNECT_RETRY_SYM 550 -#define MASTER_GTID_POS_SYM 551 -#define MASTER_HOST_SYM 552 -#define MASTER_LOG_FILE_SYM 553 -#define MASTER_LOG_POS_SYM 554 -#define MASTER_PASSWORD_SYM 555 -#define MASTER_PORT_SYM 556 -#define MASTER_SERVER_ID_SYM 557 -#define MASTER_SSL_CAPATH_SYM 558 -#define MASTER_SSL_CA_SYM 559 -#define MASTER_SSL_CERT_SYM 560 -#define MASTER_SSL_CIPHER_SYM 561 -#define MASTER_SSL_CRL_SYM 562 -#define MASTER_SSL_CRLPATH_SYM 563 -#define MASTER_SSL_KEY_SYM 564 -#define MASTER_SSL_SYM 565 -#define MASTER_SSL_VERIFY_SERVER_CERT_SYM 566 -#define MASTER_SYM 567 -#define MASTER_USER_SYM 568 -#define MASTER_USE_GTID_SYM 569 -#define MASTER_HEARTBEAT_PERIOD_SYM 570 -#define MATCH 571 -#define MAX_CONNECTIONS_PER_HOUR 572 -#define MAX_QUERIES_PER_HOUR 573 -#define MAX_ROWS 574 -#define MAX_SIZE_SYM 575 -#define MAX_SYM 576 -#define MAX_UPDATES_PER_HOUR 577 -#define MAX_STATEMENT_TIME_SYM 578 -#define MAX_USER_CONNECTIONS_SYM 579 -#define MAX_VALUE_SYM 580 -#define MEDIUMBLOB 581 -#define MEDIUMINT 582 -#define MEDIUMTEXT 583 -#define MEDIUM_SYM 584 -#define MEMORY_SYM 585 -#define MERGE_SYM 586 -#define MESSAGE_TEXT_SYM 587 -#define MICROSECOND_SYM 588 -#define MIGRATE_SYM 589 -#define MINUTE_MICROSECOND_SYM 590 -#define MINUTE_SECOND_SYM 591 -#define MINUTE_SYM 592 -#define MIN_ROWS 593 -#define MIN_SYM 594 -#define MODE_SYM 595 -#define MODIFIES_SYM 596 -#define MODIFY_SYM 597 -#define MOD_SYM 598 -#define MONTH_SYM 599 -#define MULTILINESTRING 600 -#define MULTIPOINT 601 -#define MULTIPOLYGON 602 -#define MUTEX_SYM 603 -#define MYSQL_SYM 604 -#define MYSQL_ERRNO_SYM 605 -#define NAMES_SYM 606 -#define NAME_SYM 607 -#define NATIONAL_SYM 608 -#define NATURAL 609 -#define NCHAR_STRING 610 -#define NCHAR_SYM 611 -#define NE 612 -#define NEG 613 -#define NEW_SYM 614 -#define NEXT_SYM 615 -#define NODEGROUP_SYM 616 -#define NONE_SYM 617 -#define NOT2_SYM 618 -#define NOT_SYM 619 -#define NOW_SYM 620 -#define NO_SYM 621 -#define NO_WAIT_SYM 622 -#define NO_WRITE_TO_BINLOG 623 -#define NULL_SYM 624 -#define NUM 625 -#define NUMBER_SYM 626 -#define NUMERIC_SYM 627 -#define NVARCHAR_SYM 628 -#define OFFSET_SYM 629 -#define OLD_PASSWORD_SYM 630 -#define ON 631 -#define ONE_SYM 632 -#define ONLY_SYM 633 -#define ONLINE_SYM 634 -#define OPEN_SYM 635 -#define OPTIMIZE 636 -#define OPTIONS_SYM 637 -#define OPTION 638 -#define OPTIONALLY 639 -#define OR2_SYM 640 -#define ORDER_SYM 641 -#define OR_OR_SYM 642 -#define OR_SYM 643 -#define OUTER 644 -#define OUTFILE 645 -#define OUT_SYM 646 -#define OWNER_SYM 647 -#define PACK_KEYS_SYM 648 -#define PAGE_SYM 649 -#define PAGE_CHECKSUM_SYM 650 -#define PARAM_MARKER 651 -#define PARSER_SYM 652 -#define PARSE_VCOL_EXPR_SYM 653 -#define PARTIAL 654 -#define PARTITION_SYM 655 -#define PARTITIONS_SYM 656 -#define PARTITIONING_SYM 657 -#define PASSWORD_SYM 658 -#define PERSISTENT_SYM 659 -#define PHASE_SYM 660 -#define PLUGINS_SYM 661 -#define PLUGIN_SYM 662 -#define POINT_SYM 663 -#define POLYGON 664 -#define PORT_SYM 665 -#define POSITION_SYM 666 -#define PRECISION 667 -#define PREPARE_SYM 668 -#define PRESERVE_SYM 669 -#define PREV_SYM 670 -#define PRIMARY_SYM 671 -#define PRIVILEGES 672 -#define PROCEDURE_SYM 673 -#define PROCESS 674 -#define PROCESSLIST_SYM 675 -#define PROFILE_SYM 676 -#define PROFILES_SYM 677 -#define PROXY_SYM 678 -#define PURGE 679 -#define QUARTER_SYM 680 -#define QUERY_SYM 681 -#define QUICK 682 -#define RANGE_SYM 683 -#define READS_SYM 684 -#define READ_ONLY_SYM 685 -#define READ_SYM 686 -#define READ_WRITE_SYM 687 -#define REAL 688 -#define REBUILD_SYM 689 -#define RECOVER_SYM 690 -#define REDOFILE_SYM 691 -#define REDO_BUFFER_SIZE_SYM 692 -#define REDUNDANT_SYM 693 -#define REFERENCES 694 -#define REGEXP 695 -#define RELAY 696 -#define RELAYLOG_SYM 697 -#define RELAY_LOG_FILE_SYM 698 -#define RELAY_LOG_POS_SYM 699 -#define RELAY_THREAD 700 -#define RELEASE_SYM 701 -#define RELOAD 702 -#define REMOVE_SYM 703 -#define RENAME 704 -#define REORGANIZE_SYM 705 -#define REPAIR 706 -#define REPEATABLE_SYM 707 -#define REPEAT_SYM 708 -#define REPLACE 709 -#define REPLICATION 710 -#define REQUIRE_SYM 711 -#define RESET_SYM 712 -#define RESIGNAL_SYM 713 -#define RESOURCES 714 -#define RESTORE_SYM 715 -#define RESTRICT 716 -#define RESUME_SYM 717 -#define RETURNED_SQLSTATE_SYM 718 -#define RETURNING_SYM 719 -#define RETURNS_SYM 720 -#define RETURN_SYM 721 -#define REVERSE_SYM 722 -#define REVOKE 723 -#define RIGHT 724 -#define ROLE_SYM 725 -#define ROLLBACK_SYM 726 -#define ROLLUP_SYM 727 -#define ROUTINE_SYM 728 -#define ROWS_SYM 729 -#define ROW_FORMAT_SYM 730 -#define ROW_SYM 731 -#define ROW_COUNT_SYM 732 -#define RTREE_SYM 733 -#define SAVEPOINT_SYM 734 -#define SCHEDULE_SYM 735 -#define SCHEMA_NAME_SYM 736 -#define SECOND_MICROSECOND_SYM 737 -#define SECOND_SYM 738 -#define SECURITY_SYM 739 -#define SELECT_SYM 740 -#define SENSITIVE_SYM 741 -#define SEPARATOR_SYM 742 -#define SERIALIZABLE_SYM 743 -#define SERIAL_SYM 744 -#define SESSION_SYM 745 -#define SERVER_SYM 746 -#define SERVER_OPTIONS 747 -#define SET 748 -#define SET_VAR 749 -#define SHARE_SYM 750 -#define SHIFT_LEFT 751 -#define SHIFT_RIGHT 752 -#define SHOW 753 -#define SHUTDOWN 754 -#define SIGNAL_SYM 755 -#define SIGNED_SYM 756 -#define SIMPLE_SYM 757 -#define SLAVE 758 -#define SLAVES 759 -#define SLAVE_POS_SYM 760 -#define SLOW 761 -#define SMALLINT 762 -#define SNAPSHOT_SYM 763 -#define SOCKET_SYM 764 -#define SOFT_SYM 765 -#define SONAME_SYM 766 -#define SOUNDS_SYM 767 -#define SOURCE_SYM 768 -#define SPATIAL_SYM 769 -#define SPECIFIC_SYM 770 -#define SQLEXCEPTION_SYM 771 -#define SQLSTATE_SYM 772 -#define SQLWARNING_SYM 773 -#define SQL_BIG_RESULT 774 -#define SQL_BUFFER_RESULT 775 -#define SQL_CACHE_SYM 776 -#define SQL_CALC_FOUND_ROWS 777 -#define SQL_NO_CACHE_SYM 778 -#define SQL_SMALL_RESULT 779 -#define SQL_SYM 780 -#define SQL_THREAD 781 -#define REF_SYSTEM_ID_SYM 782 -#define SSL_SYM 783 -#define STARTING 784 -#define STARTS_SYM 785 -#define START_SYM 786 -#define STATEMENT_SYM 787 -#define STATS_AUTO_RECALC_SYM 788 -#define STATS_PERSISTENT_SYM 789 -#define STATS_SAMPLE_PAGES_SYM 790 -#define STATUS_SYM 791 -#define STDDEV_SAMP_SYM 792 -#define STD_SYM 793 -#define STOP_SYM 794 -#define STORAGE_SYM 795 -#define STRAIGHT_JOIN 796 -#define STRING_SYM 797 -#define SUBCLASS_ORIGIN_SYM 798 -#define SUBDATE_SYM 799 -#define SUBJECT_SYM 800 -#define SUBPARTITIONS_SYM 801 -#define SUBPARTITION_SYM 802 -#define SUBSTRING 803 -#define SUM_SYM 804 -#define SUPER_SYM 805 -#define SUSPEND_SYM 806 -#define SWAPS_SYM 807 -#define SWITCHES_SYM 808 -#define SYSDATE 809 -#define TABLES 810 -#define TABLESPACE 811 -#define TABLE_REF_PRIORITY 812 -#define TABLE_SYM 813 -#define TABLE_CHECKSUM_SYM 814 -#define TABLE_NAME_SYM 815 -#define TEMPORARY 816 -#define TEMPTABLE_SYM 817 -#define TERMINATED 818 -#define TEXT_STRING 819 -#define TEXT_SYM 820 -#define THAN_SYM 821 -#define THEN_SYM 822 -#define TIMESTAMP 823 -#define TIMESTAMP_ADD 824 -#define TIMESTAMP_DIFF 825 -#define TIME_SYM 826 -#define TINYBLOB 827 -#define TINYINT 828 -#define TINYTEXT 829 -#define TO_SYM 830 -#define TRAILING 831 -#define TRANSACTION_SYM 832 -#define TRANSACTIONAL_SYM 833 -#define TRIGGERS_SYM 834 -#define TRIGGER_SYM 835 -#define TRIM 836 -#define TRUE_SYM 837 -#define TRUNCATE_SYM 838 -#define TYPES_SYM 839 -#define TYPE_SYM 840 -#define UDF_RETURNS_SYM 841 -#define ULONGLONG_NUM 842 -#define UNCOMMITTED_SYM 843 -#define UNDEFINED_SYM 844 -#define UNDERSCORE_CHARSET 845 -#define UNDOFILE_SYM 846 -#define UNDO_BUFFER_SIZE_SYM 847 -#define UNDO_SYM 848 -#define UNICODE_SYM 849 -#define UNINSTALL_SYM 850 -#define UNION_SYM 851 -#define UNIQUE_SYM 852 -#define UNKNOWN_SYM 853 -#define UNLOCK_SYM 854 -#define UNSIGNED 855 -#define UNTIL_SYM 856 -#define UPDATE_SYM 857 -#define UPGRADE_SYM 858 -#define USAGE 859 -#define USER 860 -#define USE_FRM 861 -#define USE_SYM 862 -#define USING 863 -#define UTC_DATE_SYM 864 -#define UTC_TIMESTAMP_SYM 865 -#define UTC_TIME_SYM 866 -#define VALUES 867 -#define VALUE_SYM 868 -#define VARBINARY 869 -#define VARCHAR 870 -#define VARIABLES 871 -#define VARIANCE_SYM 872 -#define VARYING 873 -#define VAR_SAMP_SYM 874 -#define VIA_SYM 875 -#define VIEW_SYM 876 -#define VIRTUAL_SYM 877 -#define WAIT_SYM 878 -#define WARNINGS 879 -#define WEEK_SYM 880 -#define WEIGHT_STRING_SYM 881 -#define WHEN_SYM 882 -#define WHERE 883 -#define WHILE_SYM 884 -#define WITH 885 -#define WITH_CUBE_SYM 886 -#define WITH_ROLLUP_SYM 887 -#define WORK_SYM 888 -#define WRAPPER_SYM 889 -#define WRITE_SYM 890 -#define X509_SYM 891 -#define XA_SYM 892 -#define XML_SYM 893 -#define XOR 894 -#define YEAR_MONTH_SYM 895 -#define YEAR_SYM 896 -#define ZEROFILL 897 -#define IMPOSSIBLE_ACTION 898 +#define DELETE_DOMAIN_ID_SYM 392 +#define DESC 393 +#define DESCRIBE 394 +#define DES_KEY_FILE 395 +#define DETERMINISTIC_SYM 396 +#define DIAGNOSTICS_SYM 397 +#define DIRECTORY_SYM 398 +#define DISABLE_SYM 399 +#define DISCARD 400 +#define DISK_SYM 401 +#define DISTINCT 402 +#define DIV_SYM 403 +#define DOUBLE_SYM 404 +#define DO_DOMAIN_IDS_SYM 405 +#define DO_SYM 406 +#define DROP 407 +#define DUAL_SYM 408 +#define DUMPFILE 409 +#define DUPLICATE_SYM 410 +#define DYNAMIC_SYM 411 +#define EACH_SYM 412 +#define ELSE 413 +#define ELSEIF_SYM 414 +#define ENABLE_SYM 415 +#define ENCLOSED 416 +#define END 417 +#define ENDS_SYM 418 +#define END_OF_INPUT 419 +#define ENGINES_SYM 420 +#define ENGINE_SYM 421 +#define ENUM 422 +#define EQUAL_SYM 423 +#define ERROR_SYM 424 +#define ERRORS 425 +#define ESCAPED 426 +#define ESCAPE_SYM 427 +#define EVENTS_SYM 428 +#define EVENT_SYM 429 +#define EVERY_SYM 430 +#define EXCHANGE_SYM 431 +#define EXAMINED_SYM 432 +#define EXECUTE_SYM 433 +#define EXISTS 434 +#define EXIT_SYM 435 +#define EXPANSION_SYM 436 +#define EXPORT_SYM 437 +#define EXTENDED_SYM 438 +#define EXTENT_SIZE_SYM 439 +#define EXTRACT_SYM 440 +#define FALSE_SYM 441 +#define FAST_SYM 442 +#define FAULTS_SYM 443 +#define FETCH_SYM 444 +#define FILE_SYM 445 +#define FIRST_SYM 446 +#define FIXED_SYM 447 +#define FLOAT_NUM 448 +#define FLOAT_SYM 449 +#define FLUSH_SYM 450 +#define FORCE_SYM 451 +#define FOREIGN 452 +#define FOR_SYM 453 +#define FORMAT_SYM 454 +#define FOUND_SYM 455 +#define FROM 456 +#define FULL 457 +#define FULLTEXT_SYM 458 +#define FUNCTION_SYM 459 +#define GE 460 +#define GENERAL 461 +#define GENERATED_SYM 462 +#define GEOMETRYCOLLECTION 463 +#define GEOMETRY_SYM 464 +#define GET_FORMAT 465 +#define GET_SYM 466 +#define GLOBAL_SYM 467 +#define GRANT 468 +#define GRANTS 469 +#define GROUP_SYM 470 +#define GROUP_CONCAT_SYM 471 +#define HANDLER_SYM 472 +#define HARD_SYM 473 +#define HASH_SYM 474 +#define HAVING 475 +#define HELP_SYM 476 +#define HEX_NUM 477 +#define HEX_STRING 478 +#define HIGH_PRIORITY 479 +#define HOST_SYM 480 +#define HOSTS_SYM 481 +#define HOUR_MICROSECOND_SYM 482 +#define HOUR_MINUTE_SYM 483 +#define HOUR_SECOND_SYM 484 +#define HOUR_SYM 485 +#define ID_SYM 486 +#define IDENT 487 +#define IDENTIFIED_SYM 488 +#define IDENT_QUOTED 489 +#define IF_SYM 490 +#define IGNORE_DOMAIN_IDS_SYM 491 +#define IGNORE_SYM 492 +#define IGNORE_SERVER_IDS_SYM 493 +#define IMPORT 494 +#define INDEXES 495 +#define INDEX_SYM 496 +#define INFILE 497 +#define INITIAL_SIZE_SYM 498 +#define INNER_SYM 499 +#define INOUT_SYM 500 +#define INSENSITIVE_SYM 501 +#define INSERT 502 +#define INSERT_METHOD 503 +#define INSTALL_SYM 504 +#define INTERVAL_SYM 505 +#define INTO 506 +#define INT_SYM 507 +#define INVOKER_SYM 508 +#define IN_SYM 509 +#define IO_SYM 510 +#define IPC_SYM 511 +#define IS 512 +#define ISOLATION 513 +#define ISSUER_SYM 514 +#define ITERATE_SYM 515 +#define JOIN_SYM 516 +#define KEYS 517 +#define KEY_BLOCK_SIZE 518 +#define KEY_SYM 519 +#define KILL_SYM 520 +#define LANGUAGE_SYM 521 +#define LAST_SYM 522 +#define LAST_VALUE 523 +#define LE 524 +#define LEADING 525 +#define LEAVES 526 +#define LEAVE_SYM 527 +#define LEFT 528 +#define LESS_SYM 529 +#define LEVEL_SYM 530 +#define LEX_HOSTNAME 531 +#define LIKE 532 +#define LIMIT 533 +#define LINEAR_SYM 534 +#define LINES 535 +#define LINESTRING 536 +#define LIST_SYM 537 +#define LOAD 538 +#define LOCAL_SYM 539 +#define LOCATOR_SYM 540 +#define LOCKS_SYM 541 +#define LOCK_SYM 542 +#define LOGFILE_SYM 543 +#define LOGS_SYM 544 +#define LONGBLOB 545 +#define LONGTEXT 546 +#define LONG_NUM 547 +#define LONG_SYM 548 +#define LOOP_SYM 549 +#define LOW_PRIORITY 550 +#define MASTER_CONNECT_RETRY_SYM 551 +#define MASTER_GTID_POS_SYM 552 +#define MASTER_HOST_SYM 553 +#define MASTER_LOG_FILE_SYM 554 +#define MASTER_LOG_POS_SYM 555 +#define MASTER_PASSWORD_SYM 556 +#define MASTER_PORT_SYM 557 +#define MASTER_SERVER_ID_SYM 558 +#define MASTER_SSL_CAPATH_SYM 559 +#define MASTER_SSL_CA_SYM 560 +#define MASTER_SSL_CERT_SYM 561 +#define MASTER_SSL_CIPHER_SYM 562 +#define MASTER_SSL_CRL_SYM 563 +#define MASTER_SSL_CRLPATH_SYM 564 +#define MASTER_SSL_KEY_SYM 565 +#define MASTER_SSL_SYM 566 +#define MASTER_SSL_VERIFY_SERVER_CERT_SYM 567 +#define MASTER_SYM 568 +#define MASTER_USER_SYM 569 +#define MASTER_USE_GTID_SYM 570 +#define MASTER_HEARTBEAT_PERIOD_SYM 571 +#define MATCH 572 +#define MAX_CONNECTIONS_PER_HOUR 573 +#define MAX_QUERIES_PER_HOUR 574 +#define MAX_ROWS 575 +#define MAX_SIZE_SYM 576 +#define MAX_SYM 577 +#define MAX_UPDATES_PER_HOUR 578 +#define MAX_STATEMENT_TIME_SYM 579 +#define MAX_USER_CONNECTIONS_SYM 580 +#define MAX_VALUE_SYM 581 +#define MEDIUMBLOB 582 +#define MEDIUMINT 583 +#define MEDIUMTEXT 584 +#define MEDIUM_SYM 585 +#define MEMORY_SYM 586 +#define MERGE_SYM 587 +#define MESSAGE_TEXT_SYM 588 +#define MICROSECOND_SYM 589 +#define MIGRATE_SYM 590 +#define MINUTE_MICROSECOND_SYM 591 +#define MINUTE_SECOND_SYM 592 +#define MINUTE_SYM 593 +#define MIN_ROWS 594 +#define MIN_SYM 595 +#define MODE_SYM 596 +#define MODIFIES_SYM 597 +#define MODIFY_SYM 598 +#define MOD_SYM 599 +#define MONTH_SYM 600 +#define MULTILINESTRING 601 +#define MULTIPOINT 602 +#define MULTIPOLYGON 603 +#define MUTEX_SYM 604 +#define MYSQL_SYM 605 +#define MYSQL_ERRNO_SYM 606 +#define NAMES_SYM 607 +#define NAME_SYM 608 +#define NATIONAL_SYM 609 +#define NATURAL 610 +#define NCHAR_STRING 611 +#define NCHAR_SYM 612 +#define NE 613 +#define NEG 614 +#define NEW_SYM 615 +#define NEXT_SYM 616 +#define NODEGROUP_SYM 617 +#define NONE_SYM 618 +#define NOT2_SYM 619 +#define NOT_SYM 620 +#define NOW_SYM 621 +#define NO_SYM 622 +#define NO_WAIT_SYM 623 +#define NO_WRITE_TO_BINLOG 624 +#define NULL_SYM 625 +#define NUM 626 +#define NUMBER_SYM 627 +#define NUMERIC_SYM 628 +#define NVARCHAR_SYM 629 +#define OFFSET_SYM 630 +#define OLD_PASSWORD_SYM 631 +#define ON 632 +#define ONE_SYM 633 +#define ONLY_SYM 634 +#define ONLINE_SYM 635 +#define OPEN_SYM 636 +#define OPTIMIZE 637 +#define OPTIONS_SYM 638 +#define OPTION 639 +#define OPTIONALLY 640 +#define OR2_SYM 641 +#define ORDER_SYM 642 +#define OR_OR_SYM 643 +#define OR_SYM 644 +#define OUTER 645 +#define OUTFILE 646 +#define OUT_SYM 647 +#define OWNER_SYM 648 +#define PACK_KEYS_SYM 649 +#define PAGE_SYM 650 +#define PAGE_CHECKSUM_SYM 651 +#define PARAM_MARKER 652 +#define PARSER_SYM 653 +#define PARSE_VCOL_EXPR_SYM 654 +#define PARTIAL 655 +#define PARTITION_SYM 656 +#define PARTITIONS_SYM 657 +#define PARTITIONING_SYM 658 +#define PASSWORD_SYM 659 +#define PERSISTENT_SYM 660 +#define PHASE_SYM 661 +#define PLUGINS_SYM 662 +#define PLUGIN_SYM 663 +#define POINT_SYM 664 +#define POLYGON 665 +#define PORT_SYM 666 +#define POSITION_SYM 667 +#define PRECISION 668 +#define PREPARE_SYM 669 +#define PRESERVE_SYM 670 +#define PREV_SYM 671 +#define PRIMARY_SYM 672 +#define PRIVILEGES 673 +#define PROCEDURE_SYM 674 +#define PROCESS 675 +#define PROCESSLIST_SYM 676 +#define PROFILE_SYM 677 +#define PROFILES_SYM 678 +#define PROXY_SYM 679 +#define PURGE 680 +#define QUARTER_SYM 681 +#define QUERY_SYM 682 +#define QUICK 683 +#define RANGE_SYM 684 +#define READS_SYM 685 +#define READ_ONLY_SYM 686 +#define READ_SYM 687 +#define READ_WRITE_SYM 688 +#define REAL 689 +#define REBUILD_SYM 690 +#define RECOVER_SYM 691 +#define REDOFILE_SYM 692 +#define REDO_BUFFER_SIZE_SYM 693 +#define REDUNDANT_SYM 694 +#define REFERENCES 695 +#define REGEXP 696 +#define RELAY 697 +#define RELAYLOG_SYM 698 +#define RELAY_LOG_FILE_SYM 699 +#define RELAY_LOG_POS_SYM 700 +#define RELAY_THREAD 701 +#define RELEASE_SYM 702 +#define RELOAD 703 +#define REMOVE_SYM 704 +#define RENAME 705 +#define REORGANIZE_SYM 706 +#define REPAIR 707 +#define REPEATABLE_SYM 708 +#define REPEAT_SYM 709 +#define REPLACE 710 +#define REPLICATION 711 +#define REQUIRE_SYM 712 +#define RESET_SYM 713 +#define RESIGNAL_SYM 714 +#define RESOURCES 715 +#define RESTORE_SYM 716 +#define RESTRICT 717 +#define RESUME_SYM 718 +#define RETURNED_SQLSTATE_SYM 719 +#define RETURNING_SYM 720 +#define RETURNS_SYM 721 +#define RETURN_SYM 722 +#define REVERSE_SYM 723 +#define REVOKE 724 +#define RIGHT 725 +#define ROLE_SYM 726 +#define ROLLBACK_SYM 727 +#define ROLLUP_SYM 728 +#define ROUTINE_SYM 729 +#define ROWS_SYM 730 +#define ROW_FORMAT_SYM 731 +#define ROW_SYM 732 +#define ROW_COUNT_SYM 733 +#define RTREE_SYM 734 +#define SAVEPOINT_SYM 735 +#define SCHEDULE_SYM 736 +#define SCHEMA_NAME_SYM 737 +#define SECOND_MICROSECOND_SYM 738 +#define SECOND_SYM 739 +#define SECURITY_SYM 740 +#define SELECT_SYM 741 +#define SENSITIVE_SYM 742 +#define SEPARATOR_SYM 743 +#define SERIALIZABLE_SYM 744 +#define SERIAL_SYM 745 +#define SESSION_SYM 746 +#define SERVER_SYM 747 +#define SERVER_OPTIONS 748 +#define SET 749 +#define SET_VAR 750 +#define SHARE_SYM 751 +#define SHIFT_LEFT 752 +#define SHIFT_RIGHT 753 +#define SHOW 754 +#define SHUTDOWN 755 +#define SIGNAL_SYM 756 +#define SIGNED_SYM 757 +#define SIMPLE_SYM 758 +#define SLAVE 759 +#define SLAVES 760 +#define SLAVE_POS_SYM 761 +#define SLOW 762 +#define SMALLINT 763 +#define SNAPSHOT_SYM 764 +#define SOCKET_SYM 765 +#define SOFT_SYM 766 +#define SONAME_SYM 767 +#define SOUNDS_SYM 768 +#define SOURCE_SYM 769 +#define SPATIAL_SYM 770 +#define SPECIFIC_SYM 771 +#define SQLEXCEPTION_SYM 772 +#define SQLSTATE_SYM 773 +#define SQLWARNING_SYM 774 +#define SQL_BIG_RESULT 775 +#define SQL_BUFFER_RESULT 776 +#define SQL_CACHE_SYM 777 +#define SQL_CALC_FOUND_ROWS 778 +#define SQL_NO_CACHE_SYM 779 +#define SQL_SMALL_RESULT 780 +#define SQL_SYM 781 +#define SQL_THREAD 782 +#define REF_SYSTEM_ID_SYM 783 +#define SSL_SYM 784 +#define STARTING 785 +#define STARTS_SYM 786 +#define START_SYM 787 +#define STATEMENT_SYM 788 +#define STATS_AUTO_RECALC_SYM 789 +#define STATS_PERSISTENT_SYM 790 +#define STATS_SAMPLE_PAGES_SYM 791 +#define STATUS_SYM 792 +#define STDDEV_SAMP_SYM 793 +#define STD_SYM 794 +#define STOP_SYM 795 +#define STORAGE_SYM 796 +#define STRAIGHT_JOIN 797 +#define STRING_SYM 798 +#define SUBCLASS_ORIGIN_SYM 799 +#define SUBDATE_SYM 800 +#define SUBJECT_SYM 801 +#define SUBPARTITIONS_SYM 802 +#define SUBPARTITION_SYM 803 +#define SUBSTRING 804 +#define SUM_SYM 805 +#define SUPER_SYM 806 +#define SUSPEND_SYM 807 +#define SWAPS_SYM 808 +#define SWITCHES_SYM 809 +#define SYSDATE 810 +#define TABLES 811 +#define TABLESPACE 812 +#define TABLE_REF_PRIORITY 813 +#define TABLE_SYM 814 +#define TABLE_CHECKSUM_SYM 815 +#define TABLE_NAME_SYM 816 +#define TEMPORARY 817 +#define TEMPTABLE_SYM 818 +#define TERMINATED 819 +#define TEXT_STRING 820 +#define TEXT_SYM 821 +#define THAN_SYM 822 +#define THEN_SYM 823 +#define TIMESTAMP 824 +#define TIMESTAMP_ADD 825 +#define TIMESTAMP_DIFF 826 +#define TIME_SYM 827 +#define TINYBLOB 828 +#define TINYINT 829 +#define TINYTEXT 830 +#define TO_SYM 831 +#define TRAILING 832 +#define TRANSACTION_SYM 833 +#define TRANSACTIONAL_SYM 834 +#define TRIGGERS_SYM 835 +#define TRIGGER_SYM 836 +#define TRIM 837 +#define TRUE_SYM 838 +#define TRUNCATE_SYM 839 +#define TYPES_SYM 840 +#define TYPE_SYM 841 +#define UDF_RETURNS_SYM 842 +#define ULONGLONG_NUM 843 +#define UNCOMMITTED_SYM 844 +#define UNDEFINED_SYM 845 +#define UNDERSCORE_CHARSET 846 +#define UNDOFILE_SYM 847 +#define UNDO_BUFFER_SIZE_SYM 848 +#define UNDO_SYM 849 +#define UNICODE_SYM 850 +#define UNINSTALL_SYM 851 +#define UNION_SYM 852 +#define UNIQUE_SYM 853 +#define UNKNOWN_SYM 854 +#define UNLOCK_SYM 855 +#define UNSIGNED 856 +#define UNTIL_SYM 857 +#define UPDATE_SYM 858 +#define UPGRADE_SYM 859 +#define USAGE 860 +#define USER 861 +#define USE_FRM 862 +#define USE_SYM 863 +#define USING 864 +#define UTC_DATE_SYM 865 +#define UTC_TIMESTAMP_SYM 866 +#define UTC_TIME_SYM 867 +#define VALUES 868 +#define VALUE_SYM 869 +#define VARBINARY 870 +#define VARCHAR 871 +#define VARIABLES 872 +#define VARIANCE_SYM 873 +#define VARYING 874 +#define VAR_SAMP_SYM 875 +#define VIA_SYM 876 +#define VIEW_SYM 877 +#define VIRTUAL_SYM 878 +#define WAIT_SYM 879 +#define WARNINGS 880 +#define WEEK_SYM 881 +#define WEIGHT_STRING_SYM 882 +#define WHEN_SYM 883 +#define WHERE 884 +#define WHILE_SYM 885 +#define WITH 886 +#define WITH_CUBE_SYM 887 +#define WITH_ROLLUP_SYM 888 +#define WORK_SYM 889 +#define WRAPPER_SYM 890 +#define WRITE_SYM 891 +#define X509_SYM 892 +#define XA_SYM 893 +#define XML_SYM 894 +#define XOR 895 +#define YEAR_MONTH_SYM 896 +#define YEAR_SYM 897 +#define ZEROFILL 898 +#define IMPOSSIBLE_ACTION 899 /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED @@ -1409,7 +1411,7 @@ union YYSTYPE enum enum_mysql_timestamp_type date_time_type; DDL_options_st object_ddl_options; -#line 1413 "/home/buildbot/git/mkdist/sql/sql_yacc.h" /* yacc.c:1909 */ +#line 1415 "/home/buildbot/git/mkdist/sql/sql_yacc.h" /* yacc.c:1909 */ }; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 3fda8832..1d380ce0 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1182,6 +1182,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); %token DELAYED_SYM %token DELAY_KEY_WRITE_SYM %token DELETE_SYM /* SQL-2003-R */ +%token DELETE_DOMAIN_ID_SYM %token DESC /* SQL-2003-N */ %token DESCRIBE /* SQL-2003-R */ %token DES_KEY_FILE @@ -1951,6 +1952,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); parse_vcol_expr vcol_opt_specifier vcol_opt_attribute vcol_opt_attribute_list vcol_attribute explainable_command + opt_delete_gtid_domain END_OF_INPUT %type call sp_proc_stmts sp_proc_stmts1 sp_proc_stmt @@ -5095,12 +5097,8 @@ opt_part_values: partition_info *part_info= lex->part_info; if (! lex->is_partition_management()) { - if (part_info->part_type == RANGE_PARTITION) - my_yyabort_error((ER_PARTITION_REQUIRES_VALUES_ERROR, MYF(0), - "RANGE", "LESS THAN")); - if (part_info->part_type == LIST_PARTITION) - my_yyabort_error((ER_PARTITION_REQUIRES_VALUES_ERROR, MYF(0), - "LIST", "IN")); + if (part_info->error_if_requires_values()) + MYSQL_YYABORT; } else part_info->part_type= HASH_PARTITION; @@ -12762,7 +12760,7 @@ flush_option: { Lex->type|= REFRESH_GENERAL_LOG; } | SLOW LOGS_SYM { Lex->type|= REFRESH_SLOW_LOG; } - | BINARY LOGS_SYM + | BINARY LOGS_SYM opt_delete_gtid_domain { Lex->type|= REFRESH_BINARY_LOG; } | RELAY LOGS_SYM optional_connection_name { @@ -12819,6 +12817,24 @@ opt_table_list: | table_list {} ; +opt_delete_gtid_domain: + /* empty */ {} + | DELETE_DOMAIN_ID_SYM '=' '(' delete_domain_id_list ')' + {} + ; +delete_domain_id_list: + /* Empty */ + | delete_domain_id + | delete_domain_id_list ',' delete_domain_id + ; + +delete_domain_id: + ulong_num + { + insert_dynamic(&Lex->delete_gtid_domain, (uchar*) &($1)); + } + ; + optional_flush_tables_arguments: /* empty */ {$$= 0;} | AND_SYM DISABLE_SYM CHECKPOINT_SYM {$$= REFRESH_CHECKPOINT; } diff --git a/sql/structs.h b/sql/structs.h index c1c832d0..2ab102d8 100644 --- a/sql/structs.h +++ b/sql/structs.h @@ -204,7 +204,7 @@ typedef int *(*update_var)(THD *, struct st_mysql_show_var *); typedef struct st_lex_user { LEX_STRING user, host, plugin, auth; LEX_STRING pwtext, pwhash; - bool is_role() { return user.str[0] && !host.str[0]; } + bool is_role() const { return user.str[0] && !host.str[0]; } void set_lex_string(LEX_STRING *l, char *buf) { if (is_role()) diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 8eb3d35a..30363393 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -4895,7 +4895,8 @@ static Sys_var_mybool Sys_wsrep_on ( "wsrep_on", "To enable wsrep replication ", SESSION_VAR(wsrep_on), CMD_LINE(OPT_ARG), DEFAULT(FALSE), - NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), + NO_MUTEX_GUARD, NOT_IN_BINLOG, + ON_CHECK(wsrep_on_check), ON_UPDATE(wsrep_on_update)); static Sys_var_charptr Sys_wsrep_start_position ( diff --git a/sql/table.cc b/sql/table.cc index 53d88bc0..6b1ae3d0 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -6337,6 +6337,14 @@ void TABLE::create_key_part_by_field(KEY_PART_INFO *key_part_info, might be reused. */ key_part_info->store_length= key_part_info->length; + /* + For BIT fields null_bit is not set to 0 even if the field is defined + as NOT NULL, look at Field_bit::Field_bit + */ + if (!field->real_maybe_null()) + { + key_part_info->null_bit= 0; + } /* The total store length of the key part is the raw length of the field + diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index 33689a91..bdc84910 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -1976,7 +1976,7 @@ static bool abort_replicated(THD *thd) bool ret_code= false; if (thd->wsrep_query_state== QUERY_COMMITTING) { - WSREP_DEBUG("aborting replicated trx: %lu", thd->real_id); + WSREP_DEBUG("aborting replicated trx: %llu", (ulonglong)(thd->real_id)); (void)wsrep_abort_thd(thd, thd, TRUE); ret_code= true; diff --git a/sql/wsrep_utils.cc b/sql/wsrep_utils.cc index 580c8bbd..8a72d754 100644 --- a/sql/wsrep_utils.cc +++ b/sql/wsrep_utils.cc @@ -264,7 +264,6 @@ process::process (const char* cmd, const char* type, char** env) err_ = posix_spawnattr_setflags (&attr, POSIX_SPAWN_SETSIGDEF | POSIX_SPAWN_SETSIGMASK | - /* start a new process group */ POSIX_SPAWN_SETPGROUP | POSIX_SPAWN_USEVFORK); if (err_) { diff --git a/sql/wsrep_var.cc b/sql/wsrep_var.cc index b21041eb..ad1f4ec0 100644 --- a/sql/wsrep_var.cc +++ b/sql/wsrep_var.cc @@ -52,12 +52,28 @@ int wsrep_init_vars() return 0; } +extern ulong innodb_lock_schedule_algorithm; + bool wsrep_on_update (sys_var *self, THD* thd, enum_var_type var_type) { if (var_type == OPT_GLOBAL) { // FIXME: this variable probably should be changed only per session thd->variables.wsrep_on = global_system_variables.wsrep_on; } + + return false; +} + +bool wsrep_on_check(sys_var *self, THD* thd, set_var* var) +{ + bool new_wsrep_on= (bool)var->save_result.ulonglong_value; + + 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" + " innodb_lock_schedule_algorithm=FCFS and restart.", MYF(0)); + return true; + } return false; } diff --git a/sql/wsrep_var.h b/sql/wsrep_var.h index 7530fd98..55eb2fbc 100644 --- a/sql/wsrep_var.h +++ b/sql/wsrep_var.h @@ -41,7 +41,8 @@ int wsrep_init_vars(); #define DEFAULT_ARGS (THD* thd, enum_var_type var_type) #define INIT_ARGS (const char* opt) -extern bool wsrep_causal_reads_update UPDATE_ARGS; +extern bool wsrep_causal_reads_update UPDATE_ARGS; +extern bool wsrep_on_check CHECK_ARGS; extern bool wsrep_on_update UPDATE_ARGS; extern bool wsrep_sync_wait_update UPDATE_ARGS; extern bool wsrep_start_position_check CHECK_ARGS; diff --git a/storage/connect/reldef.cpp b/storage/connect/reldef.cpp index 031fdebe..0fb24baa 100644 --- a/storage/connect/reldef.cpp +++ b/storage/connect/reldef.cpp @@ -547,14 +547,12 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g) } // endif dladdr #endif // 0 - // Is the library already loaded? - if (!Hdll && !(Hdll = dlopen(soname, RTLD_NOLOAD))) - // Load the desired shared library - if (!(Hdll = dlopen(soname, RTLD_LAZY))) { - error = dlerror(); - sprintf(g->Message, MSG(SHARED_LIB_ERR), soname, SVP(error)); - return NULL; - } // endif Hdll + // Load the desired shared library + if (!Hdll && !(Hdll = dlopen(soname, RTLD_LAZY))) { + error = dlerror(); + sprintf(g->Message, MSG(SHARED_LIB_ERR), soname, SVP(error)); + return NULL; + } // endif Hdll // The exported name is always in uppercase for (int i = 0; ; i++) { diff --git a/storage/innobase/CMakeLists.txt b/storage/innobase/CMakeLists.txt index 86032ff2..ad231236 100644 --- a/storage/innobase/CMakeLists.txt +++ b/storage/innobase/CMakeLists.txt @@ -85,6 +85,12 @@ SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DUNIV_DEBUG -DUNIV_SYNC_DEB CHECK_FUNCTION_EXISTS(sched_getcpu HAVE_SCHED_GETCPU) IF(NOT MSVC) + + CHECK_FUNCTION_EXISTS(posix_memalign HAVE_POSIX_MEMALIGN) + IF(HAVE_POSIX_MEMALIGN) + ADD_DEFINITIONS(-DHAVE_POSIX_MEMALIGN) + ENDIF() + # either define HAVE_IB_GCC_ATOMIC_BUILTINS or not # workaround for old gcc on x86, gcc atomic ops only work under -march=i686 IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "i686" AND CMAKE_COMPILER_IS_GNUCC AND diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index 72670283..369f62d6 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -86,10 +86,13 @@ inline void* aligned_malloc(size_t size, size_t align) { void *result; #ifdef _MSC_VER result = _aligned_malloc(size, align); -#else +#elif defined (HAVE_POSIX_MEMALIGN) if(posix_memalign(&result, align, size)) { result = 0; } +#else + /* Use unaligned malloc as fallback */ + result = malloc(size); #endif return result; } diff --git a/storage/innobase/dict/dict0stats_bg.cc b/storage/innobase/dict/dict0stats_bg.cc index 43ee1a23..6f2f96c4 100644 --- a/storage/innobase/dict/dict0stats_bg.cc +++ b/storage/innobase/dict/dict0stats_bg.cc @@ -478,7 +478,6 @@ stats and eventually save its stats. */ static void dict_stats_process_entry_from_defrag_pool() -/*=======================================*/ { table_id_t table_id; index_id_t index_id; @@ -500,31 +499,19 @@ dict_stats_process_entry_from_defrag_pool() table = dict_table_open_on_id(table_id, TRUE, DICT_TABLE_OP_OPEN_ONLY_IF_CACHED); - if (table == NULL) { - mutex_exit(&dict_sys->mutex); - return; - } + dict_index_t* index = table && !table->corrupted + ? dict_table_find_index_on_id(table, index_id) + : NULL; - /* Check whether table is corrupted */ - if (table->corrupted) { - dict_table_close(table, TRUE, FALSE); + if (!index || dict_index_is_corrupted(index)) { + if (table) { + dict_table_close(table, TRUE, FALSE); + } mutex_exit(&dict_sys->mutex); return; } - mutex_exit(&dict_sys->mutex); - - dict_index_t* index = dict_table_find_index_on_id(table, index_id); - - if (index == NULL) { - return; - } - - /* Check whether index is corrupted */ - if (dict_index_is_corrupted(index)) { - dict_table_close(table, FALSE, FALSE); - return; - } + mutex_exit(&dict_sys->mutex); dict_stats_save_defrag_stats(index); dict_table_close(table, FALSE, FALSE); } diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index ac30f3c7..c9ecf3da 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -2085,7 +2085,9 @@ fil_write_flushed_lsn( /* If tablespace is not encrypted, stamp flush_lsn to first page of all system tablespace datafiles to avoid unnecessary error messages on possible downgrade. */ - if (!space->crypt_data || space->crypt_data->min_key_version == 0) { + if (!space->crypt_data + || !space->crypt_data->should_encrypt()) { + fil_node_t* node; ulint sum_of_sizes = 0; diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 9a7258bc..a45b63d0 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -3478,6 +3478,17 @@ innobase_init( goto error; } +#ifdef WITH_WSREP + /* Currently, Galera does not support VATS lock schedule algorithm. */ + if (innodb_lock_schedule_algorithm == INNODB_LOCK_SCHEDULE_ALGORITHM_VATS + && global_system_variables.wsrep_on) { + /* Do not allow InnoDB startup with VATS and Galera */ + sql_print_error("In Galera, innodb_lock_schedule_algorithm=vats" + " is not supported."); + goto error; + } +#endif /* WITH_WSREP */ + #ifndef HAVE_LZ4 if (innodb_compression_algorithm == PAGE_LZ4_ALGORITHM) { sql_print_error("InnoDB: innodb_compression_algorithm = %lu unsupported.\n" @@ -4882,8 +4893,8 @@ innobase_kill_query( 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) { + if (!wsrep_thd_is_BF(trx->mysql_thd, FALSE) + && trx->abort_type == TRX_SERVER_ABORT) { ut_ad(!lock_mutex_own()); lock_mutex_enter(); } @@ -8286,7 +8297,7 @@ ha_innobase::write_row( table->next_number_field); /* Get the value that MySQL attempted to store in the table.*/ - auto_inc = table->next_number_field->val_int(); + auto_inc = table->next_number_field->val_uint(); switch (error) { case DB_DUPLICATE_KEY: @@ -8880,7 +8891,7 @@ ha_innobase::update_row( ulonglong auto_inc; ulonglong col_max_value; - auto_inc = table->next_number_field->val_int(); + auto_inc = table->next_number_field->val_uint(); /* We need the upper limit of the col type to check for whether we update the table autoinc counter or not. */ @@ -19234,7 +19245,7 @@ static MYSQL_SYSVAR_ULONG(doublewrite_batch_size, srv_doublewrite_batch_size, #endif /* defined UNIV_DEBUG || defined UNIV_PERF_DEBUG */ static MYSQL_SYSVAR_ENUM(lock_schedule_algorithm, innodb_lock_schedule_algorithm, - PLUGIN_VAR_RQCMDARG, + PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, "The algorithm Innodb uses for deciding which locks to grant next when" " a lock is released. Possible values are" " FCFS" diff --git a/storage/innobase/include/os0file.h b/storage/innobase/include/os0file.h index e2e88eee..55e41f6e 100644 --- a/storage/innobase/include/os0file.h +++ b/storage/innobase/include/os0file.h @@ -405,10 +405,10 @@ to original un-instrumented file I/O APIs */ os_file_read_no_error_handling_func(file, buf, offset, n) # define os_file_read_no_error_handling_int_fd( \ file, buf, offset, n) \ - os_file_read_no_error_handling_func(file, buf, offset, n) + os_file_read_no_error_handling_func(OS_FILE_FROM_FD(file), buf, offset, n) # define os_file_write_int_fd(name, file, buf, offset, n) \ - os_file_write_func(name, file, buf, offset, n) + os_file_write_func(name, OS_FILE_FROM_FD(file), buf, offset, n) # define os_file_write(name, file, buf, offset, n) \ os_file_write_func(name, file, buf, offset, n) diff --git a/storage/innobase/include/que0que.h b/storage/innobase/include/que0que.h index ba882862..f37581cb 100644 --- a/storage/innobase/include/que0que.h +++ b/storage/innobase/include/que0que.h @@ -383,9 +383,6 @@ struct que_thr_t{ UT_LIST_NODE_T(que_thr_t) thrs; /*!< list of thread nodes of the fork node */ - UT_LIST_NODE_T(que_thr_t) - trx_thrs; /*!< lists of threads in wait list of - the trx */ UT_LIST_NODE_T(que_thr_t) queue; /*!< list of runnable thread nodes in the server task queue */ diff --git a/storage/innobase/include/trx0rec.h b/storage/innobase/include/trx0rec.h index a6e202d0..630818a8 100644 --- a/storage/innobase/include/trx0rec.h +++ b/storage/innobase/include/trx0rec.h @@ -226,10 +226,8 @@ trx_undo_report_row_operation( marking, the record in the clustered index, otherwise NULL */ const ulint* offsets, /*!< in: rec_get_offsets(rec) */ - roll_ptr_t* roll_ptr) /*!< out: rollback pointer to the - inserted undo log record, - 0 if BTR_NO_UNDO_LOG - flag was specified */ + roll_ptr_t* roll_ptr) /*!< out: DB_ROLL_PTR to the + undo log record */ MY_ATTRIBUTE((nonnull(1,2,8), warn_unused_result)); /******************************************************************//** Copies an undo record to heap. This function can be called if we know that diff --git a/storage/innobase/include/trx0roll.h b/storage/innobase/include/trx0roll.h index 98a667b2..274a3b03 100644 --- a/storage/innobase/include/trx0roll.h +++ b/storage/innobase/include/trx0roll.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, 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 @@ -32,7 +33,8 @@ Created 3/26/1996 Heikki Tuuri #include "mtr0mtr.h" #include "trx0sys.h" -extern bool trx_rollback_or_clean_is_active; +extern bool trx_rollback_or_clean_is_active; +extern const trx_t* trx_roll_crash_recv_trx; /*******************************************************************//** Determines if this transaction is rolling back an incomplete transaction @@ -103,6 +105,11 @@ trx_undo_rec_release( /*=================*/ trx_t* trx, /*!< in/out: transaction */ undo_no_t undo_no);/*!< in: undo number */ +/** Report progress when rolling back a row of a recovered transaction. +@return whether the rollback should be aborted due to pending shutdown */ +UNIV_INTERN +bool +trx_roll_must_shutdown(); /*******************************************************************//** Rollback or clean up any incomplete transactions which were encountered in crash recovery. If the transaction already was diff --git a/storage/innobase/include/trx0sys.ic b/storage/innobase/include/trx0sys.ic index 7265a97a..e097e29b 100644 --- a/storage/innobase/include/trx0sys.ic +++ b/storage/innobase/include/trx0sys.ic @@ -445,10 +445,7 @@ trx_id_t trx_sys_get_new_trx_id(void) /*========================*/ { -#ifndef WITH_WSREP - /* wsrep_fake_trx_id violates this assert */ ut_ad(mutex_own(&trx_sys->mutex)); -#endif /* WITH_WSREP */ /* VERY important: after the database is started, max_trx_id value is divisible by TRX_SYS_TRX_ID_WRITE_MARGIN, and the following if diff --git a/storage/innobase/lock/lock0lock.cc b/storage/innobase/lock/lock0lock.cc index 6b2c309e..61385891 100644 --- a/storage/innobase/lock/lock0lock.cc +++ b/storage/innobase/lock/lock0lock.cc @@ -925,15 +925,21 @@ lock_reset_lock_and_trx_wait( ib_logf(IB_LOG_LEVEL_INFO, "Trx id " TRX_ID_FMT - " is waiting a lock in statement %s" + " is waiting a lock " " for this trx id " TRX_ID_FMT - " and statement %s wait_lock %p", + " wait_lock %p", lock->trx->id, - stmt ? stmt : "NULL", trx_id, - stmt2 ? stmt2 : "NULL", lock->trx->lock.wait_lock); + if (stmt) { + ib_logf(IB_LOG_LEVEL_INFO, " SQL1: %s\n", stmt); + } + + if (stmt2) { + ib_logf(IB_LOG_LEVEL_INFO, " SQL2: %s\n", stmt2); + } + ut_ad(lock->trx->lock.wait_lock == lock); } @@ -1151,7 +1157,7 @@ lock_rec_has_to_wait( type_mode, lock_is_on_supremum); fprintf(stderr, "conflicts states: my %d locked %d\n", - wsrep_thd_conflict_state(trx->mysql_thd, FALSE), + wsrep_thd_conflict_state(trx->mysql_thd, FALSE), wsrep_thd_conflict_state(lock2->trx->mysql_thd, FALSE) ); lock_rec_print(stderr, lock2); if (for_locking) return FALSE; @@ -1687,7 +1693,7 @@ lock_rec_discard(lock_t* in_lock); Checks if some other transaction has a lock request in the queue. @return lock or NULL */ static -const lock_t* +lock_t* lock_rec_other_has_expl_req( /*========================*/ enum lock_mode mode, /*!< in: LOCK_S or LOCK_X */ @@ -1704,7 +1710,7 @@ lock_rec_other_has_expl_req( requests by all transactions are taken into account */ { - const lock_t* lock; + lock_t* lock; ut_ad(lock_mutex_own()); ut_ad(mode == LOCK_X || mode == LOCK_S); @@ -1713,7 +1719,7 @@ lock_rec_other_has_expl_req( for (lock = lock_rec_get_first(block, heap_no); lock != NULL; - lock = lock_rec_get_next_const(heap_no, lock)) { + lock = lock_rec_get_next(heap_no, lock)) { if (lock->trx != trx && (gap @@ -1800,7 +1806,7 @@ Checks if some other transaction has a conflicting explicit lock request in the queue, so that we have to wait. @return lock or NULL */ static -const lock_t* +lock_t* lock_rec_other_has_conflicting( /*===========================*/ enum lock_mode mode, /*!< in: LOCK_S or LOCK_X, @@ -1812,7 +1818,7 @@ lock_rec_other_has_conflicting( ulint heap_no,/*!< in: heap number of the record */ const trx_t* trx) /*!< in: our transaction */ { - const lock_t* lock; + lock_t* lock; ibool is_supremum; ut_ad(lock_mutex_own()); @@ -1821,13 +1827,16 @@ lock_rec_other_has_conflicting( for (lock = lock_rec_get_first(block, heap_no); lock != NULL; - lock = lock_rec_get_next_const(heap_no, lock)) { + lock = lock_rec_get_next(heap_no, lock)) { #ifdef WITH_WSREP if (lock_rec_has_to_wait(TRUE, trx, mode, lock, is_supremum)) { if (wsrep_on_trx(trx)) { trx_mutex_enter(lock->trx); - wsrep_kill_victim(trx, lock); + /* Below function will roll back either trx + or lock->trx depending on priority of the + transaction. */ + wsrep_kill_victim(const_cast(trx), lock); trx_mutex_exit(lock->trx); } #else @@ -2023,15 +2032,17 @@ wsrep_print_wait_locks( { if (wsrep_debug && c_lock->trx->lock.wait_lock != c_lock) { fprintf(stderr, "WSREP: c_lock != wait lock\n"); - if (lock_get_type_low(c_lock) & LOCK_TABLE) + if (lock_get_type_low(c_lock) & LOCK_TABLE) { lock_table_print(stderr, c_lock); - else + } else { lock_rec_print(stderr, c_lock); + } - if (lock_get_type_low(c_lock->trx->lock.wait_lock) & LOCK_TABLE) + if (lock_get_type_low(c_lock->trx->lock.wait_lock) & LOCK_TABLE) { lock_table_print(stderr, c_lock->trx->lock.wait_lock); - else + } else { lock_rec_print(stderr, c_lock->trx->lock.wait_lock); + } } } #endif /* WITH_WSREP */ @@ -2217,8 +2228,8 @@ lock_rec_create( if (wsrep_debug) { fprintf( stderr, - "WSREP: c_lock canceled %llu\n", - (ulonglong) c_lock->trx->id); + "WSREP: c_lock canceled " TRX_ID_FMT "\n", + c_lock->trx->id); } /* have to bail out here to avoid lock_set_lock... */ @@ -2519,6 +2530,16 @@ lock_rec_enqueue_waiting( err = DB_LOCK_WAIT; } +#ifdef WITH_WSREP + if (!lock_get_wait(lock) && wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { + if (wsrep_debug) { + fprintf(stderr, "WSREP: BF thread got lock granted early, ID " TRX_ID_FMT + "\n", + lock->trx->id); + } + return(DB_SUCCESS); + } +#endif /* WITH_WSREP */ // Move it only when it does not cause a deadlock. if (err != DB_DEADLOCK && innodb_lock_schedule_algorithm @@ -2814,7 +2835,7 @@ lock_rec_lock_slow( /* The trx already has a strong enough lock on rec: do nothing */ #ifdef WITH_WSREP - } else if ((c_lock = (ib_lock_t*)lock_rec_other_has_conflicting( + } else if ((c_lock = lock_rec_other_has_conflicting( static_cast(mode), block, heap_no, trx))) { #else @@ -2946,6 +2967,15 @@ lock_rec_has_to_wait_in_queue( #ifdef WITH_WSREP if (wsrep_thd_is_BF(wait_lock->trx->mysql_thd, FALSE) && wsrep_thd_is_BF(lock->trx->mysql_thd, TRUE)) { + if (wsrep_debug) { + fprintf(stderr, + "BF-BF lock conflict " TRX_ID_FMT + " : " TRX_ID_FMT "\n", + wait_lock->trx->id, + lock->trx->id); + lock_rec_print(stderr, wait_lock); + lock_rec_print(stderr, lock); + } /* don't wait for another BF lock */ continue; } @@ -3104,7 +3134,7 @@ lock_grant_and_move_on_page( && !lock_rec_has_to_wait_in_queue(lock)) { lock_grant(lock, false); - + if (previous != NULL) { /* Move the lock to the head of the list. */ HASH_GET_NEXT(hash, previous) = HASH_GET_NEXT(hash, lock); @@ -4978,8 +5008,8 @@ lock_table_create( } if (wsrep_debug) { - fprintf(stderr, "WSREP: c_lock canceled %llu\n", - (ulonglong) c_lock->trx->id); + fprintf(stderr, "WSREP: c_lock canceled " TRX_ID_FMT "\n", + c_lock->trx->id); } } if (c_lock) { @@ -5251,7 +5281,7 @@ Checks if other transactions have an incompatible mode lock request in the lock queue. @return lock or NULL */ UNIV_INLINE -const lock_t* +lock_t* lock_table_other_has_incompatible( /*==============================*/ const trx_t* trx, /*!< in: transaction, or NULL if all @@ -5262,7 +5292,7 @@ lock_table_other_has_incompatible( const dict_table_t* table, /*!< in: table */ enum lock_mode mode) /*!< in: lock mode */ { - const lock_t* lock; + lock_t* lock; ut_ad(lock_mutex_own()); @@ -5315,7 +5345,7 @@ lock_table( #endif trx_t* trx; dberr_t err; - const lock_t* wait_for; + lock_t* wait_for; ut_ad(table != NULL); ut_ad(thr != NULL); @@ -5362,13 +5392,13 @@ lock_table( if (wait_for != NULL) { #ifdef WITH_WSREP - err = lock_table_enqueue_waiting((ib_lock_t*)wait_for, mode | flags, table, thr); + err = lock_table_enqueue_waiting(wait_for, mode | flags, table, thr); #else err = lock_table_enqueue_waiting(mode | flags, table, thr); #endif } else { #ifdef WITH_WSREP - lock_table_create(c_lock, table, mode | flags, trx); + lock_table_create(c_lock, table, mode | flags, trx); #else lock_table_create(table, mode | flags, trx); #endif @@ -7036,10 +7066,10 @@ lock_rec_insert_check_and_lock( on the successor, which produced an unnecessary deadlock. */ #ifdef WITH_WSREP - if ((c_lock = (ib_lock_t*)lock_rec_other_has_conflicting( - static_cast( - LOCK_X | LOCK_GAP | LOCK_INSERT_INTENTION), - block, next_rec_heap_no, trx))) { + if ((c_lock = lock_rec_other_has_conflicting( + static_cast( + LOCK_X | LOCK_GAP | LOCK_INSERT_INTENTION), + block, next_rec_heap_no, trx))) { #else if (lock_rec_other_has_conflicting( static_cast( @@ -7052,7 +7082,7 @@ lock_rec_insert_check_and_lock( #ifdef WITH_WSREP err = lock_rec_enqueue_waiting(c_lock, - LOCK_X | LOCK_GAP | LOCK_INSERT_INTENTION, + LOCK_X | LOCK_GAP | LOCK_INSERT_INTENTION, block, next_rec_heap_no, index, thr); #else err = lock_rec_enqueue_waiting( diff --git a/storage/innobase/lock/lock0wait.cc b/storage/innobase/lock/lock0wait.cc index ca9d05a4..a0f557e1 100644 --- a/storage/innobase/lock/lock0wait.cc +++ b/storage/innobase/lock/lock0wait.cc @@ -191,22 +191,25 @@ lock_wait_table_reserve_slot( /*********************************************************************//** check if lock timeout was for priority thread, as a side effect trigger lock monitor +@param[in] trx transaction owning the lock +@param[in] locked true if trx and lock_sys_mutex is ownd @return false for regular lock timeout */ -static ibool +static +bool wsrep_is_BF_lock_timeout( -/*====================*/ - trx_t* trx) /* in: trx to check for lock priority */ + const trx_t* trx, + bool locked = true) { - if (wsrep_on_trx(trx) && - wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { - fprintf(stderr, "WSREP: BF lock wait long\n"); - srv_print_innodb_monitor = TRUE; - srv_print_innodb_lock_monitor = TRUE; - os_event_set(srv_monitor_event); - return TRUE; - } - return FALSE; - } + if (wsrep_on_trx(trx) + && wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { + fprintf(stderr, "WSREP: BF lock wait long for trx " TRX_ID_FMT "\n", trx->id); + srv_print_innodb_monitor = TRUE; + srv_print_innodb_lock_monitor = TRUE; + os_event_set(srv_monitor_event); + return true; + } + return false; +} #endif /* WITH_WSREP */ /***************************************************************//** @@ -402,15 +405,15 @@ lock_wait_suspend_thread( if (lock_wait_timeout < 100000000 && wait_time > (double) lock_wait_timeout) { #ifdef WITH_WSREP - if (!wsrep_on_trx(trx) || - (!wsrep_is_BF_lock_timeout(trx) && - trx->error_state != DB_DEADLOCK)) { + if (!wsrep_on_trx(trx) || + (!wsrep_is_BF_lock_timeout(trx) && + trx->error_state != DB_DEADLOCK)) { #endif /* WITH_WSREP */ - trx->error_state = DB_LOCK_WAIT_TIMEOUT; + trx->error_state = DB_LOCK_WAIT_TIMEOUT; #ifdef WITH_WSREP - } + } #endif /* WITH_WSREP */ MONITOR_INC(MONITOR_TIMEOUT); } diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc index acbffb3a..bc369ad4 100644 --- a/storage/innobase/row/row0ins.cc +++ b/storage/innobase/row/row0ins.cc @@ -2968,6 +2968,10 @@ row_ins_sec_index_entry( mem_heap_t* offsets_heap; mem_heap_t* heap; + DBUG_EXECUTE_IF("row_ins_sec_index_entry_timeout", { + DBUG_SET("-d,row_ins_sec_index_entry_timeout"); + return(DB_LOCK_WAIT);}); + if (!index->table->foreign_set.empty()) { err = row_ins_check_foreign_constraints(index->table, index, entry, thr); diff --git a/storage/innobase/row/row0log.cc b/storage/innobase/row/row0log.cc index 9107ad62..49627a65 100644 --- a/storage/innobase/row/row0log.cc +++ b/storage/innobase/row/row0log.cc @@ -1573,13 +1573,10 @@ row_log_table_apply_insert_low( return(error); } - do { - n_index++; - - if (!(index = dict_table_get_next_index(index))) { - break; - } + ut_ad(dict_index_is_clust(index)); + for (n_index += index->type != DICT_CLUSTERED; + (index = dict_table_get_next_index(index)); n_index++) { if (index->type & DICT_FTS) { continue; } @@ -1589,12 +1586,13 @@ row_log_table_apply_insert_low( flags, BTR_MODIFY_TREE, index, offsets_heap, heap, entry, trx_id, thr); - /* Report correct index name for duplicate key error. */ - if (error == DB_DUPLICATE_KEY) { - thr_get_trx(thr)->error_key_num = n_index; + if (error != DB_SUCCESS) { + if (error == DB_DUPLICATE_KEY) { + thr_get_trx(thr)->error_key_num = n_index; + } + break; } - - } while (error == DB_SUCCESS); + } return(error); } @@ -2173,17 +2171,16 @@ row_log_table_apply_update( dtuple_big_rec_free(big_rec); } - while ((index = dict_table_get_next_index(index)) != NULL) { - if (error != DB_SUCCESS) { - break; - } - - n_index++; - + for (n_index += index->type != DICT_CLUSTERED; + (index = dict_table_get_next_index(index)); n_index++) { if (index->type & DICT_FTS) { continue; } + if (error != DB_SUCCESS) { + break; + } + if (!row_upd_changes_ord_field_binary( index, update, thr, old_row, NULL)) { continue; diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index dcf4413a..b78a8b58 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -75,7 +75,7 @@ UNIV_INTERN ibool row_rollback_on_timeout = FALSE; /** Chain node of the list of tables to drop in the background. */ struct row_mysql_drop_t{ - char* table_name; /*!< table name */ + table_id_t table_id; /*!< table id */ UT_LIST_NODE_T(row_mysql_drop_t)row_mysql_drop_list; /*!< list chain node */ }; @@ -138,19 +138,6 @@ row_mysql_is_system_table( || 0 == strcmp(name + 6, "db")); } -/*********************************************************************//** -If a table is not yet in the drop list, adds the table to the list of tables -which the master thread drops in background. We need this on Unix because in -ALTER TABLE MySQL may call drop table even if the table has running queries on -it. Also, if there are running foreign key checks on the table, we drop the -table lazily. -@return TRUE if the table was not yet in the drop list, and was added there */ -static -ibool -row_add_table_to_background_drop_list( -/*==================================*/ - const char* name); /*!< in: table name */ - /*******************************************************************//** Delays an INSERT, DELETE or UPDATE operation if the purge is lagging. */ static @@ -2770,7 +2757,7 @@ row_drop_tables_for_mysql_in_background(void) mutex_enter(&row_drop_list_mutex); ut_a(row_mysql_drop_list_inited); - +next: drop = UT_LIST_GET_FIRST(row_mysql_drop_list); n_tables = UT_LIST_GET_LEN(row_mysql_drop_list); @@ -2783,62 +2770,39 @@ row_drop_tables_for_mysql_in_background(void) return(n_tables + n_tables_dropped); } - DBUG_EXECUTE_IF("row_drop_tables_in_background_sleep", - os_thread_sleep(5000000); - ); - - table = dict_table_open_on_name(drop->table_name, FALSE, FALSE, - DICT_ERR_IGNORE_NONE); - - if (table == NULL) { - /* If for some reason the table has already been dropped - through some other mechanism, do not try to drop it */ + table = dict_table_open_on_id(drop->table_id, FALSE, + DICT_TABLE_OP_NORMAL); - goto already_dropped; + if (!table) { + n_tables_dropped++; + mutex_enter(&row_drop_list_mutex); + UT_LIST_REMOVE(row_mysql_drop_list, row_mysql_drop_list, drop); + MONITOR_DEC(MONITOR_BACKGROUND_DROP_TABLE); + ut_free(drop); + goto next; } + ut_a(!table->can_be_evicted); + if (!table->to_be_dropped) { - /* There is a scenario: the old table is dropped - just after it's added into drop list, and new - table with the same name is created, then we try - to drop the new table in background. */ dict_table_close(table, FALSE, FALSE); - goto already_dropped; + mutex_enter(&row_drop_list_mutex); + UT_LIST_REMOVE(row_mysql_drop_list, row_mysql_drop_list, drop); + UT_LIST_ADD_LAST(row_mysql_drop_list, row_mysql_drop_list, + drop); + goto next; } - ut_a(!table->can_be_evicted); - dict_table_close(table, FALSE, FALSE); if (DB_SUCCESS != row_drop_table_for_mysql_in_background( - drop->table_name)) { + table->name)) { /* If the DROP fails for some table, we return, and let the main thread retry later */ - return(n_tables + n_tables_dropped); } - n_tables_dropped++; - -already_dropped: - mutex_enter(&row_drop_list_mutex); - - UT_LIST_REMOVE(row_mysql_drop_list, row_mysql_drop_list, drop); - - MONITOR_DEC(MONITOR_BACKGROUND_DROP_TABLE); - - ut_print_timestamp(stderr); - fputs(" InnoDB: Dropped table ", stderr); - ut_print_name(stderr, NULL, TRUE, drop->table_name); - fputs(" in background drop queue.\n", stderr); - - mem_free(drop->table_name); - - mem_free(drop); - - mutex_exit(&row_drop_list_mutex); - goto loop; } @@ -2870,14 +2834,13 @@ which the master thread drops in background. We need this on Unix because in ALTER TABLE MySQL may call drop table even if the table has running queries on it. Also, if there are running foreign key checks on the table, we drop the table lazily. -@return TRUE if the table was not yet in the drop list, and was added there */ +@return whether background DROP TABLE was scheduled for the first time */ static -ibool -row_add_table_to_background_drop_list( -/*==================================*/ - const char* name) /*!< in: table name */ +bool +row_add_table_to_background_drop_list(table_id_t table_id) { row_mysql_drop_t* drop; + bool added = true; mutex_enter(&row_drop_list_mutex); @@ -2888,31 +2851,21 @@ row_add_table_to_background_drop_list( drop != NULL; drop = UT_LIST_GET_NEXT(row_mysql_drop_list, drop)) { - if (strcmp(drop->table_name, name) == 0) { - /* Already in the list */ - - mutex_exit(&row_drop_list_mutex); - - return(FALSE); + if (drop->table_id == table_id) { + added = false; + goto func_exit; } } - drop = static_cast( - mem_alloc(sizeof(row_mysql_drop_t))); - - drop->table_name = mem_strdup(name); + drop = static_cast(ut_malloc(sizeof *drop)); + drop->table_id = table_id; UT_LIST_ADD_LAST(row_mysql_drop_list, row_mysql_drop_list, drop); MONITOR_INC(MONITOR_BACKGROUND_DROP_TABLE); - - /* fputs("InnoDB: Adding table ", stderr); - ut_print_name(stderr, trx, TRUE, drop->table_name); - fputs(" to background drop list\n", stderr); */ - +func_exit: mutex_exit(&row_drop_list_mutex); - - return(TRUE); + return added; } /*********************************************************************//** @@ -4131,7 +4084,7 @@ row_drop_table_for_mysql( DBUG_EXECUTE_IF("row_drop_table_add_to_background", - row_add_table_to_background_drop_list(table->name); + row_add_table_to_background_drop_list(table->id); err = DB_SUCCESS; goto funct_exit; ); @@ -4143,33 +4096,22 @@ row_drop_table_for_mysql( checks take an IS or IX lock on the table. */ if (table->n_foreign_key_checks_running > 0) { - - const char* save_tablename = table->name; - ibool added; - - added = row_add_table_to_background_drop_list(save_tablename); - - if (added) { + if (row_add_table_to_background_drop_list(table->id)) { ut_print_timestamp(stderr); fputs(" InnoDB: You are trying to drop table ", stderr); - ut_print_name(stderr, trx, TRUE, save_tablename); + ut_print_name(stderr, trx, TRUE, table->name); fputs("\n" "InnoDB: though there is a" " foreign key check running on it.\n" "InnoDB: Adding the table to" " the background drop queue.\n", stderr); - - /* We return DB_SUCCESS to MySQL though the drop will - happen lazily later */ - - err = DB_SUCCESS; - } else { - /* The table is already in the background drop list */ - err = DB_ERROR; } + /* We return DB_SUCCESS to MySQL though the drop will + happen lazily later */ + err = DB_SUCCESS; goto funct_exit; } @@ -4194,11 +4136,7 @@ row_drop_table_for_mysql( lock_remove_all_on_table(table, TRUE); ut_a(table->n_rec_locks == 0); } else if (table->n_ref_count > 0 || table->n_rec_locks > 0) { - ibool added; - - added = row_add_table_to_background_drop_list(table->name); - - if (added) { + if (row_add_table_to_background_drop_list(table->id)) { ut_print_timestamp(stderr); fputs(" InnoDB: Warning: MySQL is" " trying to drop table ", stderr); diff --git a/storage/innobase/row/row0undo.cc b/storage/innobase/row/row0undo.cc index 82b1ab04..552b99ab 100644 --- a/storage/innobase/row/row0undo.cc +++ b/storage/innobase/row/row0undo.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, 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 @@ -348,6 +349,13 @@ row_undo_step( ut_ad(que_node_get_type(node) == QUE_NODE_UNDO); + if (UNIV_UNLIKELY(trx == trx_roll_crash_recv_trx) + && trx_roll_must_shutdown()) { + /* Shutdown has been initiated. */ + trx->error_state = DB_INTERRUPTED; + return(NULL); + } + err = row_undo(node, thr); trx->error_state = err; diff --git a/storage/innobase/trx/trx0rec.cc b/storage/innobase/trx/trx0rec.cc index 1010f609..10eadcb6 100644 --- a/storage/innobase/trx/trx0rec.cc +++ b/storage/innobase/trx/trx0rec.cc @@ -1221,10 +1221,8 @@ trx_undo_report_row_operation( marking, the record in the clustered index, otherwise NULL */ const ulint* offsets, /*!< in: rec_get_offsets(rec) */ - roll_ptr_t* roll_ptr) /*!< out: rollback pointer to the - inserted undo log record, - 0 if BTR_NO_UNDO_LOG - flag was specified */ + roll_ptr_t* roll_ptr) /*!< out: DB_ROLL_PTR to the + undo log record */ { trx_t* trx; trx_undo_t* undo; diff --git a/storage/innobase/trx/trx0roll.cc b/storage/innobase/trx/trx0roll.cc index e22700c8..2c7287d4 100644 --- a/storage/innobase/trx/trx0roll.cc +++ b/storage/innobase/trx/trx0roll.cc @@ -24,6 +24,9 @@ Transaction rollback Created 3/26/1996 Heikki Tuuri *******************************************************/ +#include "my_config.h" +#include + #include "trx0roll.h" #ifdef UNIV_NONINL @@ -55,14 +58,7 @@ rollback */ bool trx_rollback_or_clean_is_active; /** In crash recovery, the current trx to be rolled back; NULL otherwise */ -static const trx_t* trx_roll_crash_recv_trx = NULL; - -/** In crash recovery we set this to the undo n:o of the current trx to be -rolled back. Then we can print how many % the rollback has progressed. */ -static undo_no_t trx_roll_max_undo_no; - -/** Auxiliary variable which tells the previous progress % we printed */ -static ulint trx_roll_progress_printed_pct; +const trx_t* trx_roll_crash_recv_trx; /****************************************************************//** Finishes a transaction rollback. */ @@ -552,8 +548,6 @@ trx_rollback_active( que_thr_t* thr; roll_node_t* roll_node; dict_table_t* table; - ib_int64_t rows_to_undo; - const char* unit = ""; ibool dictionary_locked = FALSE; heap = mem_heap_create(512); @@ -572,30 +566,8 @@ trx_rollback_active( ut_a(thr == que_fork_start_command(fork)); - mutex_enter(&trx_sys->mutex); - trx_roll_crash_recv_trx = trx; - trx_roll_max_undo_no = trx->undo_no; - - trx_roll_progress_printed_pct = 0; - - rows_to_undo = trx_roll_max_undo_no; - - mutex_exit(&trx_sys->mutex); - - if (rows_to_undo > 1000000000) { - rows_to_undo = rows_to_undo / 1000000; - unit = "M"; - } - - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Rolling back trx with id " TRX_ID_FMT ", %lu%s" - " rows to undo\n", - trx->id, - (ulong) rows_to_undo, unit); - if (trx_get_dict_operation(trx) != TRX_DICT_OP_NONE) { row_mysql_lock_data_dictionary(trx); dictionary_locked = TRUE; @@ -606,6 +578,16 @@ trx_rollback_active( que_run_threads(roll_node->undo_thr); + if (trx->error_state != DB_SUCCESS) { + ut_ad(trx->error_state == DB_INTERRUPTED); + ut_ad(!srv_undo_sources); + ut_ad(srv_fast_shutdown); + ut_ad(!dictionary_locked); + que_graph_free(static_cast( + roll_node->undo_thr->common.parent)); + goto func_exit; + } + trx_rollback_finish(thr_get_trx(roll_node->undo_thr)); /* Free the memory reserved by the undo graph */ @@ -650,13 +632,14 @@ trx_rollback_active( } } + ib_logf(IB_LOG_LEVEL_INFO, + "Rollback of trx with id " TRX_ID_FMT " completed", trx->id); + +func_exit: if (dictionary_locked) { row_mysql_unlock_data_dictionary(trx); } - ib_logf(IB_LOG_LEVEL_INFO, - "Rollback of trx with id " TRX_ID_FMT " completed", trx->id); - mem_heap_free(heap); trx_roll_crash_recv_trx = NULL; @@ -673,7 +656,7 @@ ibool trx_rollback_resurrected( /*=====================*/ trx_t* trx, /*!< in: transaction to rollback or clean */ - ibool all) /*!< in: FALSE=roll back dictionary transactions; + ibool* all) /*!< in/out: FALSE=roll back dictionary transactions; TRUE=roll back all non-PREPARED transactions */ { ut_ad(mutex_own(&trx_sys->mutex)); @@ -684,16 +667,15 @@ trx_rollback_resurrected( to accidentally clean up a non-recovered transaction here. */ trx_mutex_enter(trx); - bool is_recovered = trx->is_recovered; - trx_state_t state = trx->state; - trx_mutex_exit(trx); - - if (!is_recovered) { + if (!trx->is_recovered) { +func_exit: + trx_mutex_exit(trx); return(FALSE); } - switch (state) { + switch (trx->state) { case TRX_STATE_COMMITTED_IN_MEMORY: + trx_mutex_exit(trx); mutex_exit(&trx_sys->mutex); fprintf(stderr, "InnoDB: Cleaning up trx with id " TRX_ID_FMT "\n", @@ -702,21 +684,83 @@ trx_rollback_resurrected( trx_free_for_background(trx); return(TRUE); case TRX_STATE_ACTIVE: - if (all || trx_get_dict_operation(trx) != TRX_DICT_OP_NONE) { + if (!srv_undo_sources && srv_fast_shutdown) { +fake_prepared: + trx->state = TRX_STATE_PREPARED; + trx_sys->n_prepared_trx++; + trx_sys->n_prepared_recovered_trx++; + *all = FALSE; + goto func_exit; + } + trx_mutex_exit(trx); + + if (*all || trx_get_dict_operation(trx) != TRX_DICT_OP_NONE) { mutex_exit(&trx_sys->mutex); trx_rollback_active(trx); + if (trx->error_state != DB_SUCCESS) { + ut_ad(trx->error_state == DB_INTERRUPTED); + ut_ad(!srv_undo_sources); + ut_ad(srv_fast_shutdown); + mutex_enter(&trx_sys->mutex); + trx_mutex_enter(trx); + goto fake_prepared; + } trx_free_for_background(trx); return(TRUE); } return(FALSE); case TRX_STATE_PREPARED: - return(FALSE); + goto func_exit; case TRX_STATE_NOT_STARTED: break; } ut_error; - return(FALSE); + goto func_exit; +} + +/** Report progress when rolling back a row of a recovered transaction. +@return whether the rollback should be aborted due to pending shutdown */ +UNIV_INTERN +bool +trx_roll_must_shutdown() +{ + const trx_t* trx = trx_roll_crash_recv_trx; + ut_ad(trx); + ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE)); + + if (trx_get_dict_operation(trx) == TRX_DICT_OP_NONE + && !srv_undo_sources && srv_fast_shutdown) { + return true; + } + + ib_time_t time = ut_time(); + mutex_enter(&trx_sys->mutex); + mutex_enter(&recv_sys->mutex); + + if (recv_sys->report(time)) { + ulint n_trx = 0, n_rows = 0; + for (const trx_t* t = UT_LIST_GET_FIRST(trx_sys->rw_trx_list); + t != NULL; + t = UT_LIST_GET_NEXT(trx_list, t)) { + + assert_trx_in_rw_list(t); + if (t->is_recovered + && trx_state_eq(t, TRX_STATE_ACTIVE)) { + n_trx++; + n_rows += t->undo_no; + } + } + ib_logf(IB_LOG_LEVEL_INFO, + "To roll back: " ULINTPF " transactions, " + ULINTPF " rows", n_trx, n_rows); + sd_notifyf(0, "STATUS=To roll back: " ULINTPF " transactions, " + ULINTPF " rows", n_trx, n_rows); + } + + mutex_exit(&recv_sys->mutex); + mutex_exit(&trx_sys->mutex); + return false; } /*******************************************************************//** @@ -763,17 +807,11 @@ trx_rollback_or_clean_recovered( assert_trx_in_rw_list(trx); - if (srv_shutdown_state != SRV_SHUTDOWN_NONE - && srv_fast_shutdown != 0) { - all = FALSE; - break; - } - /* If this function does a cleanup or rollback then it will release the trx_sys->mutex, therefore we need to reacquire it before retrying the loop. */ - if (trx_rollback_resurrected(trx, all)) { + if (trx_rollback_resurrected(trx, &all)) { mutex_enter(&trx_sys->mutex); @@ -1100,7 +1138,6 @@ trx_roll_pop_top_rec_of_trx( undo_no_t undo_no; ibool is_insert; trx_rseg_t* rseg; - ulint progress_pct; mtr_t mtr; rseg = trx->rseg; @@ -1158,27 +1195,6 @@ trx_roll_pop_top_rec_of_trx( ut_ad(undo_no + 1 == trx->undo_no); - /* We print rollback progress info if we are in a crash recovery - and the transaction has at least 1000 row operations to undo. */ - - if (trx == trx_roll_crash_recv_trx && trx_roll_max_undo_no > 1000) { - - progress_pct = 100 - (ulint) - ((undo_no * 100) / trx_roll_max_undo_no); - if (progress_pct != trx_roll_progress_printed_pct) { - if (trx_roll_progress_printed_pct == 0) { - fprintf(stderr, - "\nInnoDB: Progress in percents:" - " %lu", (ulong) progress_pct); - } else { - fprintf(stderr, - " %lu", (ulong) progress_pct); - } - fflush(stderr); - trx_roll_progress_printed_pct = progress_pct; - } - } - trx->undo_no = undo_no; if (!trx_undo_arr_store_info(trx, undo_no)) { diff --git a/storage/innobase/trx/trx0sys.cc b/storage/innobase/trx/trx0sys.cc index e9443e93..0246eaf3 100644 --- a/storage/innobase/trx/trx0sys.cc +++ b/storage/innobase/trx/trx0sys.cc @@ -180,12 +180,7 @@ trx_sys_flush_max_trx_id(void) mtr_t mtr; trx_sysf_t* sys_header; -#ifndef WITH_WSREP - /* wsrep_fake_trx_id violates this assert - * Copied from trx_sys_get_new_trx_id - */ ut_ad(mutex_own(&trx_sys->mutex)); -#endif /* WITH_WSREP */ if (!srv_read_only_mode) { mtr_start(&mtr); diff --git a/storage/innobase/trx/trx0undo.cc b/storage/innobase/trx/trx0undo.cc index 1836d282..5638ccd1 100644 --- a/storage/innobase/trx/trx0undo.cc +++ b/storage/innobase/trx/trx0undo.cc @@ -2023,9 +2023,13 @@ trx_undo_free_prepared( /* fall through */ case TRX_UNDO_ACTIVE: /* lock_trx_release_locks() assigns - trx->is_recovered=false */ + trx->is_recovered=false and + trx->state = TRX_STATE_COMMITTED_IN_MEMORY, + also for transactions that we faked + to TRX_STATE_PREPARED in trx_rollback_resurrected(). */ ut_a(srv_read_only_mode - || srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO); + || srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO + || srv_fast_shutdown); break; default: ut_error; @@ -2047,9 +2051,13 @@ trx_undo_free_prepared( /* fall through */ case TRX_UNDO_ACTIVE: /* lock_trx_release_locks() assigns - trx->is_recovered=false */ + trx->is_recovered=false and + trx->state = TRX_STATE_COMMITTED_IN_MEMORY, + also for transactions that we faked + to TRX_STATE_PREPARED in trx_rollback_resurrected(). */ ut_a(srv_read_only_mode - || srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO); + || srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO + || srv_fast_shutdown); break; default: ut_error; diff --git a/storage/maria/ma_loghandler.c b/storage/maria/ma_loghandler.c index 7a3d4a21..12977024 100644 --- a/storage/maria/ma_loghandler.c +++ b/storage/maria/ma_loghandler.c @@ -6342,7 +6342,6 @@ my_bool translog_write_record(LSN *lsn, short_trid, &parts, trn, hook_arg); break; case LOGRECTYPE_NOT_ALLOWED: - DBUG_ASSERT(0); default: DBUG_ASSERT(0); rc= 1; diff --git a/storage/mroonga/mysql-test/mroonga/include/mroonga/have_mroonga_helper.inc b/storage/mroonga/mysql-test/mroonga/include/mroonga/have_mroonga_helper.inc index f78a760a..0d93ce03 100644 --- a/storage/mroonga/mysql-test/mroonga/include/mroonga/have_mroonga_helper.inc +++ b/storage/mroonga/mysql-test/mroonga/include/mroonga/have_mroonga_helper.inc @@ -14,4 +14,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -let $MYSQLD_DATADIR= `select @@datadir`; +let MYSQLD_DATADIR= `select @@datadir`; diff --git a/storage/mroonga/mysql-test/mroonga/include/mroonga/print_groonga_query_log.inc b/storage/mroonga/mysql-test/mroonga/include/mroonga/print_groonga_query_log.inc new file mode 100644 index 00000000..d5f8c129 --- /dev/null +++ b/storage/mroonga/mysql-test/mroonga/include/mroonga/print_groonga_query_log.inc @@ -0,0 +1,8 @@ +SHOW GLOBAL VARIABLES LIKE "mroonga_query_log_file"; +perl; +open(F, '<', $_="$ENV{MYSQLD_DATADIR}/groonga-query-log.log") or die "open(<$_): $!"; +while () { + s/^[^|]+\|[^|]+\|[^|]+\| *//; + print; +} +EOF diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_disabled_empty_value.test b/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_disabled_empty_value.test index 912c2e2b..fdd21cc0 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_disabled_empty_value.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_disabled_empty_value.test @@ -21,8 +21,7 @@ SET GLOBAL mroonga_log_file = "groonga-query-log.log"; SET GLOBAL mroonga_query_log_file = ""; -SHOW GLOBAL VARIABLES LIKE "mroonga_query_log_file"; ---exec sed -r -e 's/^[^|]+\|[^|]+\|[^|]+\| *//' $MYSQLD_DATADIR/groonga-query-log.log +--source ../../include/mroonga/print_groonga_query_log.inc SET GLOBAL mroonga_query_log_file = DEFAULT; SET GLOBAL mroonga_log_file = DEFAULT; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_disabled_null_value.test b/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_disabled_null_value.test index a63f4f75..b84fc397 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_disabled_null_value.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_disabled_null_value.test @@ -21,8 +21,7 @@ SET GLOBAL mroonga_log_file = "groonga-query-log.log"; SET GLOBAL mroonga_query_log_file = NULL; -SHOW GLOBAL VARIABLES LIKE "mroonga_query_log_file"; ---exec sed -r -e 's/^[^|]+\|[^|]+\|[^|]+\| *//' $MYSQLD_DATADIR/groonga-query-log.log +--source ../../include/mroonga/print_groonga_query_log.inc SET GLOBAL mroonga_query_log_file = DEFAULT; SET GLOBAL mroonga_log_file = DEFAULT; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_enabled_empty_value.test b/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_enabled_empty_value.test index e37b163b..0cb1a8d2 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_enabled_empty_value.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_enabled_empty_value.test @@ -23,8 +23,7 @@ SET GLOBAL mroonga_query_log_file = "groonga-query.log"; SET GLOBAL mroonga_log_file = "groonga-query-log.log"; SET GLOBAL mroonga_query_log_file = ""; -SHOW GLOBAL VARIABLES LIKE "mroonga_query_log_file"; ---exec sed -r -e 's/^[^|]+\|[^|]+\|[^|]+\| *//' $MYSQLD_DATADIR/groonga-query-log.log +--source ../../include/mroonga/print_groonga_query_log.inc SET GLOBAL mroonga_query_log_file = DEFAULT; SET GLOBAL mroonga_log_file = DEFAULT; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_enabled_null_value.test b/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_enabled_null_value.test index 2df00d6a..d1704a43 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_enabled_null_value.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_enabled_null_value.test @@ -23,8 +23,7 @@ SET GLOBAL mroonga_query_log_file = "groonga-query.log"; SET GLOBAL mroonga_log_file = "groonga-query-log.log"; SET GLOBAL mroonga_query_log_file = NULL; -SHOW GLOBAL VARIABLES LIKE "mroonga_query_log_file"; ---exec sed -r -e 's/^[^|]+\|[^|]+\|[^|]+\| *//' $MYSQLD_DATADIR/groonga-query-log.log +--source ../../include/mroonga/print_groonga_query_log.inc SET GLOBAL mroonga_query_log_file = DEFAULT; SET GLOBAL mroonga_log_file = DEFAULT; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_new_value.test b/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_new_value.test index a3a7dc9b..e298aaa4 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_new_value.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_new_value.test @@ -23,8 +23,7 @@ SET GLOBAL mroonga_log_file = "groonga-query-log.log"; SET GLOBAL mroonga_query_log_file = "groonga-query.log"; -SHOW GLOBAL VARIABLES LIKE "mroonga_query_log_file"; ---exec sed -r -e 's/^[^|]+\|[^|]+\|[^|]+\| *//' $MYSQLD_DATADIR/groonga-query-log.log +--source ../../include/mroonga/print_groonga_query_log.inc SET GLOBAL mroonga_query_log_file = DEFAULT; SET GLOBAL mroonga_log_file = DEFAULT; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_same_value.test b/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_same_value.test index 66024f5c..4c500f1e 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_same_value.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/variable_query_log_file_same_value.test @@ -24,8 +24,7 @@ SET GLOBAL mroonga_query_log_file = "groonga-query.log"; SET GLOBAL mroonga_log_file = "groonga-query-log.log"; SET GLOBAL mroonga_query_log_file = "groonga-query.log"; -SHOW GLOBAL VARIABLES LIKE "mroonga_query_log_file"; ---exec sed -r -e 's/^[^|]+\|[^|]+\|[^|]+\| *//' $MYSQLD_DATADIR/groonga-query-log.log +--source ../../include/mroonga/print_groonga_query_log.inc SET GLOBAL mroonga_query_log_file = DEFAULT; SET GLOBAL mroonga_log_file = DEFAULT; diff --git a/storage/tokudb/CMakeLists.txt b/storage/tokudb/CMakeLists.txt index c959bf00..f01c4aed 100644 --- a/storage/tokudb/CMakeLists.txt +++ b/storage/tokudb/CMakeLists.txt @@ -4,11 +4,17 @@ IF(CMAKE_VERSION VERSION_LESS "2.8.9") MESSAGE(STATUS "CMake 2.8.9 or higher is required by TokuDB") ELSEIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64") +# tokudb requires F_NOCACHE or O_DIRECT, and designated initializers CHECK_CXX_SOURCE_COMPILES( " +#include struct a {int b; int c; }; struct a d = { .b=1, .c=2 }; +#if defined(O_DIRECT) || defined(F_NOCACHE) int main() { return 0; } +#else +#error +#endif " TOKUDB_OK) ENDIF() diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_log.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_log.result index 8cbbda48..f283b3ad 100644 --- a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_log.result +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_log.result @@ -215,7 +215,6 @@ master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Rotate # # master-bin.000002;pos=POS include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000002 # Binlog_checkpoint # # master-bin.000002 master-bin.000002 # Gtid # # GTID #-#-# master-bin.000002 # Query # # use `test`; create table t3 (a int)ENGINE=TokuDB master-bin.000002 # Gtid # # GTID #-#-# @@ -253,7 +252,6 @@ slave-bin.000001 # Query # # use `test`; create table t3 (a int)ENGINE=TokuDB slave-bin.000001 # Rotate # # slave-bin.000002;pos=POS include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info -slave-bin.000002 # Binlog_checkpoint # # slave-bin.000002 slave-bin.000002 # Gtid # # GTID #-#-# slave-bin.000002 # Query # # use `test`; create table t2 (n int)ENGINE=TokuDB slave-bin.000002 # Gtid # # BEGIN GTID #-#-# diff --git a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_stm_log.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_stm_log.result index 42defbe0..0334000f 100644 --- a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_stm_log.result +++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_stm_log.result @@ -215,7 +215,6 @@ master-bin.000001 # Xid # # COMMIT /* XID */ master-bin.000001 # Rotate # # master-bin.000002;pos=POS include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info -master-bin.000002 # Binlog_checkpoint # # master-bin.000002 master-bin.000002 # Gtid # # GTID #-#-# master-bin.000002 # Query # # use `test`; create table t3 (a int)ENGINE=TokuDB master-bin.000002 # Gtid # # GTID #-#-# @@ -252,7 +251,6 @@ slave-bin.000001 # Query # # use `test`; create table t3 (a int)ENGINE=TokuDB slave-bin.000001 # Rotate # # slave-bin.000002;pos=POS include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info -slave-bin.000002 # Binlog_checkpoint # # slave-bin.000002 slave-bin.000002 # Gtid # # GTID #-#-# slave-bin.000002 # Query # # use `test`; create table t2 (n int)ENGINE=TokuDB slave-bin.000002 # Gtid # # BEGIN GTID #-#-# diff --git a/storage/xtradb/CMakeLists.txt b/storage/xtradb/CMakeLists.txt index f66a142e..67d06874 100644 --- a/storage/xtradb/CMakeLists.txt +++ b/storage/xtradb/CMakeLists.txt @@ -93,6 +93,12 @@ SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DUNIV_DEBUG -DUNIV_SYNC_DEB CHECK_FUNCTION_EXISTS(sched_getcpu HAVE_SCHED_GETCPU) IF(NOT MSVC) + + CHECK_FUNCTION_EXISTS(posix_memalign HAVE_POSIX_MEMALIGN) + IF(HAVE_POSIX_MEMALIGN) + ADD_DEFINITIONS(-DHAVE_POSIX_MEMALIGN) + ENDIF() + # either define HAVE_IB_GCC_ATOMIC_BUILTINS or not # workaround for old gcc on x86, gcc atomic ops only work under -march=i686 IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "i686" AND CMAKE_COMPILER_IS_GNUCC AND diff --git a/storage/xtradb/buf/buf0buf.cc b/storage/xtradb/buf/buf0buf.cc index 2ee2b2ba..80ff1c14 100644 --- a/storage/xtradb/buf/buf0buf.cc +++ b/storage/xtradb/buf/buf0buf.cc @@ -102,10 +102,13 @@ inline void* aligned_malloc(size_t size, size_t align) { void *result; #ifdef _MSC_VER result = _aligned_malloc(size, align); -#else +#elif defined (HAVE_POSIX_MEMALIGN) if(posix_memalign(&result, align, size)) { result = 0; } +#else + /* Use unaligned malloc as fallback */ + result = malloc(size); #endif return result; } diff --git a/storage/xtradb/dict/dict0stats_bg.cc b/storage/xtradb/dict/dict0stats_bg.cc index ba6fd115..e166e7df 100644 --- a/storage/xtradb/dict/dict0stats_bg.cc +++ b/storage/xtradb/dict/dict0stats_bg.cc @@ -479,7 +479,6 @@ stats and eventually save its stats. */ static void dict_stats_process_entry_from_defrag_pool() -/*=======================================*/ { table_id_t table_id; index_id_t index_id; @@ -501,31 +500,19 @@ dict_stats_process_entry_from_defrag_pool() table = dict_table_open_on_id(table_id, TRUE, DICT_TABLE_OP_OPEN_ONLY_IF_CACHED); - if (table == NULL) { - mutex_exit(&dict_sys->mutex); - return; - } + dict_index_t* index = table && !table->corrupted + ? dict_table_find_index_on_id(table, index_id) + : NULL; - /* Check whether table is corrupted */ - if (table->corrupted) { - dict_table_close(table, TRUE, FALSE); + if (!index || dict_index_is_corrupted(index)) { + if (table) { + dict_table_close(table, TRUE, FALSE); + } mutex_exit(&dict_sys->mutex); return; } - mutex_exit(&dict_sys->mutex); - - dict_index_t* index = dict_table_find_index_on_id(table, index_id); - - if (index == NULL) { - return; - } - - /* Check whether index is corrupted */ - if (dict_index_is_corrupted(index)) { - dict_table_close(table, FALSE, FALSE); - return; - } + mutex_exit(&dict_sys->mutex); dict_stats_save_defrag_stats(index); dict_table_close(table, FALSE, FALSE); } diff --git a/storage/xtradb/fil/fil0fil.cc b/storage/xtradb/fil/fil0fil.cc index 00f2c446..9023b444 100644 --- a/storage/xtradb/fil/fil0fil.cc +++ b/storage/xtradb/fil/fil0fil.cc @@ -2136,7 +2136,8 @@ fil_write_flushed_lsn( /* If tablespace is not encrypted, stamp flush_lsn to first page of all system tablespace datafiles to avoid unnecessary error messages on possible downgrade. */ - if (!space->crypt_data || space->crypt_data->min_key_version == 0) { + if (!space->crypt_data + || !space->crypt_data->should_encrypt()) { fil_node_t* node; ulint sum_of_sizes = 0; diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc index 28e3b23b..37755cb9 100644 --- a/storage/xtradb/handler/ha_innodb.cc +++ b/storage/xtradb/handler/ha_innodb.cc @@ -3934,6 +3934,17 @@ innobase_init( } } +#ifdef WITH_WSREP + /* Currently, Galera does not support VATS lock schedule algorithm. */ + if (innodb_lock_schedule_algorithm == INNODB_LOCK_SCHEDULE_ALGORITHM_VATS + && global_system_variables.wsrep_on) { + /* Do not allow InnoDB startup with VATS and Galera */ + sql_print_error("In Galera, innodb_lock_schedule_algorithm=vats" + " is not supported."); + goto error; + } +#endif /* WITH_WSREP */ + #ifndef HAVE_LZ4 if (innodb_compression_algorithm == PAGE_LZ4_ALGORITHM) { sql_print_error("InnoDB: innodb_compression_algorithm = %lu unsupported.\n" @@ -5485,8 +5496,8 @@ innobase_kill_connection( 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) { + if (!wsrep_thd_is_BF(trx->mysql_thd, FALSE) + && trx->abort_type == TRX_SERVER_ABORT) { ut_ad(!lock_mutex_own()); lock_mutex_enter(); } @@ -8870,7 +8881,7 @@ ha_innobase::write_row( table->next_number_field); /* Get the value that MySQL attempted to store in the table.*/ - auto_inc = table->next_number_field->val_int(); + auto_inc = table->next_number_field->val_uint(); switch (error) { case DB_DUPLICATE_KEY: @@ -9462,7 +9473,7 @@ ha_innobase::update_row( ulonglong auto_inc; ulonglong col_max_value; - auto_inc = table->next_number_field->val_int(); + auto_inc = table->next_number_field->val_uint(); /* We need the upper limit of the col type to check for whether we update the table autoinc counter or not. */ @@ -20500,7 +20511,7 @@ static MYSQL_SYSVAR_ENUM(empty_free_list_algorithm, &innodb_empty_free_list_algorithm_typelib); static MYSQL_SYSVAR_ENUM(lock_schedule_algorithm, innodb_lock_schedule_algorithm, - PLUGIN_VAR_RQCMDARG, + PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, "The algorithm Innodb uses for deciding which locks to grant next when" " a lock is released. Possible values are" " FCFS" diff --git a/storage/xtradb/include/os0file.h b/storage/xtradb/include/os0file.h index b17e09cf..f6923024 100644 --- a/storage/xtradb/include/os0file.h +++ b/storage/xtradb/include/os0file.h @@ -469,10 +469,10 @@ to original un-instrumented file I/O APIs */ os_file_read_no_error_handling_func(file, buf, offset, n) # define os_file_read_no_error_handling_int_fd( \ file, buf, offset, n) \ - os_file_read_no_error_handling_func(file, buf, offset, n) + os_file_read_no_error_handling_func(OS_FILE_FROM_FD(file), buf, offset, n) # define os_file_write_int_fd(name, file, buf, offset, n) \ - os_file_write_func(name, file, buf, offset, n) + os_file_write_func(name, OS_FILE_FROM_FD(file), buf, offset, n) # define os_file_write(name, file, buf, offset, n) \ os_file_write_func(name, file, buf, offset, n) diff --git a/storage/xtradb/include/que0que.h b/storage/xtradb/include/que0que.h index e5b2a1ba..005f28d2 100644 --- a/storage/xtradb/include/que0que.h +++ b/storage/xtradb/include/que0que.h @@ -384,9 +384,6 @@ struct que_thr_t{ UT_LIST_NODE_T(que_thr_t) thrs; /*!< list of thread nodes of the fork node */ - UT_LIST_NODE_T(que_thr_t) - trx_thrs; /*!< lists of threads in wait list of - the trx */ UT_LIST_NODE_T(que_thr_t) queue; /*!< list of runnable thread nodes in the server task queue */ diff --git a/storage/xtradb/include/trx0rec.h b/storage/xtradb/include/trx0rec.h index a6e202d0..630818a8 100644 --- a/storage/xtradb/include/trx0rec.h +++ b/storage/xtradb/include/trx0rec.h @@ -226,10 +226,8 @@ trx_undo_report_row_operation( marking, the record in the clustered index, otherwise NULL */ const ulint* offsets, /*!< in: rec_get_offsets(rec) */ - roll_ptr_t* roll_ptr) /*!< out: rollback pointer to the - inserted undo log record, - 0 if BTR_NO_UNDO_LOG - flag was specified */ + roll_ptr_t* roll_ptr) /*!< out: DB_ROLL_PTR to the + undo log record */ MY_ATTRIBUTE((nonnull(1,2,8), warn_unused_result)); /******************************************************************//** Copies an undo record to heap. This function can be called if we know that diff --git a/storage/xtradb/include/trx0roll.h b/storage/xtradb/include/trx0roll.h index b2e9d8a0..565079b1 100644 --- a/storage/xtradb/include/trx0roll.h +++ b/storage/xtradb/include/trx0roll.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, 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 @@ -33,7 +34,8 @@ Created 3/26/1996 Heikki Tuuri #include "mtr0mtr.h" #include "trx0sys.h" -extern bool trx_rollback_or_clean_is_active; +extern bool trx_rollback_or_clean_is_active; +extern const trx_t* trx_roll_crash_recv_trx; /*******************************************************************//** Determines if this transaction is rolling back an incomplete transaction @@ -104,6 +106,11 @@ trx_undo_rec_release( /*=================*/ trx_t* trx, /*!< in/out: transaction */ undo_no_t undo_no);/*!< in: undo number */ +/** Report progress when rolling back a row of a recovered transaction. +@return whether the rollback should be aborted due to pending shutdown */ +UNIV_INTERN +bool +trx_roll_must_shutdown(); /*******************************************************************//** Rollback or clean up any incomplete transactions which were encountered in crash recovery. If the transaction already was diff --git a/storage/xtradb/include/trx0sys.ic b/storage/xtradb/include/trx0sys.ic index 6024c1dc..699148cf 100644 --- a/storage/xtradb/include/trx0sys.ic +++ b/storage/xtradb/include/trx0sys.ic @@ -474,10 +474,7 @@ trx_id_t trx_sys_get_new_trx_id(void) /*========================*/ { -#ifndef WITH_WSREP - /* wsrep_fake_trx_id violates this assert */ ut_ad(mutex_own(&trx_sys->mutex)); -#endif /* WITH_WSREP */ /* VERY important: after the database is started, max_trx_id value is divisible by TRX_SYS_TRX_ID_WRITE_MARGIN, and the following if diff --git a/storage/xtradb/lock/lock0lock.cc b/storage/xtradb/lock/lock0lock.cc index ddaeff69..20e3f5ad 100644 --- a/storage/xtradb/lock/lock0lock.cc +++ b/storage/xtradb/lock/lock0lock.cc @@ -937,14 +937,21 @@ lock_reset_lock_and_trx_wait( ib_logf(IB_LOG_LEVEL_INFO, "Trx id " TRX_ID_FMT - " is waiting a lock in statement %s" + " is waiting a lock " " for this trx id " TRX_ID_FMT - " and statement %s wait_lock %p", + " wait_lock %p", lock->trx->id, - stmt ? stmt : "NULL", trx_id, - stmt2 ? stmt2 : "NULL", lock->trx->lock.wait_lock); + + if (stmt) { + ib_logf(IB_LOG_LEVEL_INFO, " SQL1: %s\n", stmt); + } + + if (stmt2) { + ib_logf(IB_LOG_LEVEL_INFO, " SQL2: %s\n", stmt2); + } + ut_ad(lock->trx->lock.wait_lock == lock); } @@ -1162,7 +1169,7 @@ lock_rec_has_to_wait( type_mode, lock_is_on_supremum); fprintf(stderr, "conflicts states: my %d locked %d\n", - wsrep_thd_conflict_state(trx->mysql_thd, FALSE), + wsrep_thd_conflict_state(trx->mysql_thd, FALSE), wsrep_thd_conflict_state(lock2->trx->mysql_thd, FALSE) ); lock_rec_print(stderr, lock2); if (for_locking) return FALSE; @@ -1714,7 +1721,7 @@ lock_rec_other_has_expl_req( ulint heap_no,/*!< in: heap number of the record */ trx_id_t trx_id) /*!< in: transaction */ { - const lock_t* lock; + lock_t* lock; ut_ad(lock_mutex_own()); ut_ad(mode == LOCK_X || mode == LOCK_S); @@ -1723,7 +1730,7 @@ lock_rec_other_has_expl_req( for (lock = lock_rec_get_first(block, heap_no); lock != NULL; - lock = lock_rec_get_next_const(heap_no, lock)) { + lock = lock_rec_get_next(heap_no, lock)) { if (lock->trx->id != trx_id && (gap @@ -1810,7 +1817,7 @@ Checks if some other transaction has a conflicting explicit lock request in the queue, so that we have to wait. @return lock or NULL */ static -const lock_t* +lock_t* lock_rec_other_has_conflicting( /*===========================*/ enum lock_mode mode, /*!< in: LOCK_S or LOCK_X, @@ -1822,7 +1829,7 @@ lock_rec_other_has_conflicting( ulint heap_no,/*!< in: heap number of the record */ const trx_t* trx) /*!< in: our transaction */ { - const lock_t* lock; + lock_t* lock; ibool is_supremum; ut_ad(lock_mutex_own()); @@ -1831,13 +1838,16 @@ lock_rec_other_has_conflicting( for (lock = lock_rec_get_first(block, heap_no); lock != NULL; - lock = lock_rec_get_next_const(heap_no, lock)) { + lock = lock_rec_get_next(heap_no, lock)) { #ifdef WITH_WSREP if (lock_rec_has_to_wait(TRUE, trx, mode, lock, is_supremum)) { if (wsrep_on_trx(trx)) { trx_mutex_enter(lock->trx); - wsrep_kill_victim(trx, lock); + /* Below function will roll back either trx + or lock->trx depending on priority of the + transaction. */ + wsrep_kill_victim(const_cast(trx), lock); trx_mutex_exit(lock->trx); } #else @@ -2045,15 +2055,17 @@ wsrep_print_wait_locks( { if (wsrep_debug && c_lock->trx->lock.wait_lock != c_lock) { fprintf(stderr, "WSREP: c_lock != wait lock\n"); - if (lock_get_type_low(c_lock) & LOCK_TABLE) + if (lock_get_type_low(c_lock) & LOCK_TABLE) { lock_table_print(stderr, c_lock); - else + } else { lock_rec_print(stderr, c_lock); + } - if (lock_get_type_low(c_lock->trx->lock.wait_lock) & LOCK_TABLE) + if (lock_get_type_low(c_lock->trx->lock.wait_lock) & LOCK_TABLE) { lock_table_print(stderr, c_lock->trx->lock.wait_lock); - else + } else { lock_rec_print(stderr, c_lock->trx->lock.wait_lock); + } } } #endif /* WITH_WSREP */ @@ -2358,8 +2370,8 @@ lock_rec_create( if (wsrep_debug) { fprintf( stderr, - "WSREP: c_lock canceled %llu\n", - (ulonglong) c_lock->trx->id); + "WSREP: c_lock canceled " TRX_ID_FMT "\n", + c_lock->trx->id); } /* have to bail out here to avoid lock_set_lock... */ @@ -2551,6 +2563,16 @@ lock_rec_enqueue_waiting( err = DB_LOCK_WAIT; } +#ifdef WITH_WSREP + if (!lock_get_wait(lock) && wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { + if (wsrep_debug) { + fprintf(stderr, "WSREP: BF thread got lock granted early, ID " TRX_ID_FMT + "\n", + lock->trx->id); + } + return(DB_SUCCESS); + } +#endif /* WITH_WSREP */ // Move it only when it does not cause a deadlock. if (err != DB_DEADLOCK && innodb_lock_schedule_algorithm @@ -2981,6 +3003,15 @@ lock_rec_has_to_wait_in_queue( #ifdef WITH_WSREP if (wsrep_thd_is_BF(wait_lock->trx->mysql_thd, FALSE) && wsrep_thd_is_BF(lock->trx->mysql_thd, TRUE)) { + if (wsrep_debug) { + fprintf(stderr, + "BF-BF lock conflict " TRX_ID_FMT + " : " TRX_ID_FMT "\n", + wait_lock->trx->id, + lock->trx->id); + lock_rec_print(stderr, wait_lock); + lock_rec_print(stderr, lock); + } /* don't wait for another BF lock */ continue; } @@ -3139,7 +3170,7 @@ lock_grant_and_move_on_page( && !lock_rec_has_to_wait_in_queue(lock)) { lock_grant(lock, false); - + if (previous != NULL) { /* Move the lock to the head of the list. */ HASH_GET_NEXT(hash, previous) = HASH_GET_NEXT(hash, lock); @@ -5017,8 +5048,8 @@ lock_table_create( } if (wsrep_debug) { - fprintf(stderr, "WSREP: c_lock canceled %llu\n", - (ulonglong) c_lock->trx->id); + fprintf(stderr, "WSREP: c_lock canceled " TRX_ID_FMT "\n", + c_lock->trx->id); } } if (c_lock) { @@ -5297,7 +5328,7 @@ Checks if other transactions have an incompatible mode lock request in the lock queue. @return lock or NULL */ UNIV_INLINE -const lock_t* +lock_t* lock_table_other_has_incompatible( /*==============================*/ const trx_t* trx, /*!< in: transaction, or NULL if all @@ -5308,7 +5339,7 @@ lock_table_other_has_incompatible( const dict_table_t* table, /*!< in: table */ enum lock_mode mode) /*!< in: lock mode */ { - const lock_t* lock; + lock_t* lock; ut_ad(lock_mutex_own()); @@ -5361,7 +5392,7 @@ lock_table( #endif trx_t* trx; dberr_t err; - const lock_t* wait_for; + lock_t* wait_for; ut_ad(table != NULL); ut_ad(thr != NULL); @@ -5412,13 +5443,13 @@ lock_table( if (wait_for != NULL) { #ifdef WITH_WSREP - err = lock_table_enqueue_waiting((ib_lock_t*)wait_for, mode | flags, table, thr); + err = lock_table_enqueue_waiting(wait_for, mode | flags, table, thr); #else err = lock_table_enqueue_waiting(mode | flags, table, thr); #endif } else { #ifdef WITH_WSREP - lock_table_create(c_lock, table, mode | flags, trx); + lock_table_create(c_lock, table, mode | flags, trx); #else lock_table_create(table, mode | flags, trx); #endif @@ -7101,10 +7132,10 @@ lock_rec_insert_check_and_lock( on the successor, which produced an unnecessary deadlock. */ #ifdef WITH_WSREP - if ((c_lock = (ib_lock_t*)lock_rec_other_has_conflicting( - static_cast( - LOCK_X | LOCK_GAP | LOCK_INSERT_INTENTION), - block, next_rec_heap_no, trx))) { + if ((c_lock = lock_rec_other_has_conflicting( + static_cast( + LOCK_X | LOCK_GAP | LOCK_INSERT_INTENTION), + block, next_rec_heap_no, trx))) { #else if (lock_rec_other_has_conflicting( static_cast( @@ -7117,7 +7148,7 @@ lock_rec_insert_check_and_lock( #ifdef WITH_WSREP err = lock_rec_enqueue_waiting(c_lock, - LOCK_X | LOCK_GAP | LOCK_INSERT_INTENTION, + LOCK_X | LOCK_GAP | LOCK_INSERT_INTENTION, block, next_rec_heap_no, index, thr); #else err = lock_rec_enqueue_waiting( diff --git a/storage/xtradb/lock/lock0wait.cc b/storage/xtradb/lock/lock0wait.cc index ca9d05a4..a0f557e1 100644 --- a/storage/xtradb/lock/lock0wait.cc +++ b/storage/xtradb/lock/lock0wait.cc @@ -191,22 +191,25 @@ lock_wait_table_reserve_slot( /*********************************************************************//** check if lock timeout was for priority thread, as a side effect trigger lock monitor +@param[in] trx transaction owning the lock +@param[in] locked true if trx and lock_sys_mutex is ownd @return false for regular lock timeout */ -static ibool +static +bool wsrep_is_BF_lock_timeout( -/*====================*/ - trx_t* trx) /* in: trx to check for lock priority */ + const trx_t* trx, + bool locked = true) { - if (wsrep_on_trx(trx) && - wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { - fprintf(stderr, "WSREP: BF lock wait long\n"); - srv_print_innodb_monitor = TRUE; - srv_print_innodb_lock_monitor = TRUE; - os_event_set(srv_monitor_event); - return TRUE; - } - return FALSE; - } + if (wsrep_on_trx(trx) + && wsrep_thd_is_BF(trx->mysql_thd, FALSE)) { + fprintf(stderr, "WSREP: BF lock wait long for trx " TRX_ID_FMT "\n", trx->id); + srv_print_innodb_monitor = TRUE; + srv_print_innodb_lock_monitor = TRUE; + os_event_set(srv_monitor_event); + return true; + } + return false; +} #endif /* WITH_WSREP */ /***************************************************************//** @@ -402,15 +405,15 @@ lock_wait_suspend_thread( if (lock_wait_timeout < 100000000 && wait_time > (double) lock_wait_timeout) { #ifdef WITH_WSREP - if (!wsrep_on_trx(trx) || - (!wsrep_is_BF_lock_timeout(trx) && - trx->error_state != DB_DEADLOCK)) { + if (!wsrep_on_trx(trx) || + (!wsrep_is_BF_lock_timeout(trx) && + trx->error_state != DB_DEADLOCK)) { #endif /* WITH_WSREP */ - trx->error_state = DB_LOCK_WAIT_TIMEOUT; + trx->error_state = DB_LOCK_WAIT_TIMEOUT; #ifdef WITH_WSREP - } + } #endif /* WITH_WSREP */ MONITOR_INC(MONITOR_TIMEOUT); } diff --git a/storage/xtradb/row/row0ins.cc b/storage/xtradb/row/row0ins.cc index 62e19402..f653a4df 100644 --- a/storage/xtradb/row/row0ins.cc +++ b/storage/xtradb/row/row0ins.cc @@ -3041,6 +3041,10 @@ row_ins_sec_index_entry( mem_heap_t* offsets_heap; mem_heap_t* heap; + DBUG_EXECUTE_IF("row_ins_sec_index_entry_timeout", { + DBUG_SET("-d,row_ins_sec_index_entry_timeout"); + return(DB_LOCK_WAIT);}); + if (!index->table->foreign_set.empty()) { err = row_ins_check_foreign_constraints(index->table, index, entry, thr); diff --git a/storage/xtradb/row/row0log.cc b/storage/xtradb/row/row0log.cc index e15a4f4f..82fde841 100644 --- a/storage/xtradb/row/row0log.cc +++ b/storage/xtradb/row/row0log.cc @@ -1573,13 +1573,10 @@ row_log_table_apply_insert_low( return(error); } - do { - n_index++; - - if (!(index = dict_table_get_next_index(index))) { - break; - } + ut_ad(dict_index_is_clust(index)); + for (n_index += index->type != DICT_CLUSTERED; + (index = dict_table_get_next_index(index)); n_index++) { if (index->type & DICT_FTS) { continue; } @@ -1589,12 +1586,13 @@ row_log_table_apply_insert_low( flags, BTR_MODIFY_TREE, index, offsets_heap, heap, entry, trx_id, thr); - /* Report correct index name for duplicate key error. */ - if (error == DB_DUPLICATE_KEY) { - thr_get_trx(thr)->error_key_num = n_index; + if (error != DB_SUCCESS) { + if (error == DB_DUPLICATE_KEY) { + thr_get_trx(thr)->error_key_num = n_index; + } + break; } - - } while (error == DB_SUCCESS); + } return(error); } @@ -2173,17 +2171,16 @@ row_log_table_apply_update( dtuple_big_rec_free(big_rec); } - while ((index = dict_table_get_next_index(index)) != NULL) { - if (error != DB_SUCCESS) { - break; - } - - n_index++; - + for (n_index += index->type != DICT_CLUSTERED; + (index = dict_table_get_next_index(index)); n_index++) { if (index->type & DICT_FTS) { continue; } + if (error != DB_SUCCESS) { + break; + } + if (!row_upd_changes_ord_field_binary( index, update, thr, old_row, NULL)) { continue; diff --git a/storage/xtradb/row/row0mysql.cc b/storage/xtradb/row/row0mysql.cc index 3f79c3af..43f4d4bc 100644 --- a/storage/xtradb/row/row0mysql.cc +++ b/storage/xtradb/row/row0mysql.cc @@ -74,7 +74,7 @@ UNIV_INTERN ibool row_rollback_on_timeout = FALSE; /** Chain node of the list of tables to drop in the background. */ struct row_mysql_drop_t{ - char* table_name; /*!< table name */ + table_id_t table_id; /*!< table id */ UT_LIST_NODE_T(row_mysql_drop_t)row_mysql_drop_list; /*!< list chain node */ }; @@ -137,19 +137,6 @@ row_mysql_is_system_table( || 0 == strcmp(name + 6, "db")); } -/*********************************************************************//** -If a table is not yet in the drop list, adds the table to the list of tables -which the master thread drops in background. We need this on Unix because in -ALTER TABLE MySQL may call drop table even if the table has running queries on -it. Also, if there are running foreign key checks on the table, we drop the -table lazily. -@return TRUE if the table was not yet in the drop list, and was added there */ -static -ibool -row_add_table_to_background_drop_list( -/*==================================*/ - const char* name); /*!< in: table name */ - /*******************************************************************//** Delays an INSERT, DELETE or UPDATE operation if the purge is lagging. */ static @@ -2787,7 +2774,7 @@ row_drop_tables_for_mysql_in_background(void) mutex_enter(&row_drop_list_mutex); ut_a(row_mysql_drop_list_inited); - +next: drop = UT_LIST_GET_FIRST(row_mysql_drop_list); n_tables = UT_LIST_GET_LEN(row_mysql_drop_list); @@ -2800,62 +2787,39 @@ row_drop_tables_for_mysql_in_background(void) return(n_tables + n_tables_dropped); } - DBUG_EXECUTE_IF("row_drop_tables_in_background_sleep", - os_thread_sleep(5000000); - ); - - table = dict_table_open_on_name(drop->table_name, FALSE, FALSE, - DICT_ERR_IGNORE_NONE); - - if (table == NULL) { - /* If for some reason the table has already been dropped - through some other mechanism, do not try to drop it */ + table = dict_table_open_on_id(drop->table_id, FALSE, + DICT_TABLE_OP_NORMAL); - goto already_dropped; + if (!table) { + n_tables_dropped++; + mutex_enter(&row_drop_list_mutex); + UT_LIST_REMOVE(row_mysql_drop_list, row_mysql_drop_list, drop); + MONITOR_DEC(MONITOR_BACKGROUND_DROP_TABLE); + ut_free(drop); + goto next; } + ut_a(!table->can_be_evicted); + if (!table->to_be_dropped) { - /* There is a scenario: the old table is dropped - just after it's added into drop list, and new - table with the same name is created, then we try - to drop the new table in background. */ dict_table_close(table, FALSE, FALSE); - goto already_dropped; + mutex_enter(&row_drop_list_mutex); + UT_LIST_REMOVE(row_mysql_drop_list, row_mysql_drop_list, drop); + UT_LIST_ADD_LAST(row_mysql_drop_list, row_mysql_drop_list, + drop); + goto next; } - ut_a(!table->can_be_evicted); - dict_table_close(table, FALSE, FALSE); if (DB_SUCCESS != row_drop_table_for_mysql_in_background( - drop->table_name)) { + table->name)) { /* If the DROP fails for some table, we return, and let the main thread retry later */ - return(n_tables + n_tables_dropped); } - n_tables_dropped++; - -already_dropped: - mutex_enter(&row_drop_list_mutex); - - UT_LIST_REMOVE(row_mysql_drop_list, row_mysql_drop_list, drop); - - MONITOR_DEC(MONITOR_BACKGROUND_DROP_TABLE); - - ut_print_timestamp(stderr); - fputs(" InnoDB: Dropped table ", stderr); - ut_print_name(stderr, NULL, TRUE, drop->table_name); - fputs(" in background drop queue.\n", stderr); - - mem_free(drop->table_name); - - mem_free(drop); - - mutex_exit(&row_drop_list_mutex); - goto loop; } @@ -2887,14 +2851,13 @@ which the master thread drops in background. We need this on Unix because in ALTER TABLE MySQL may call drop table even if the table has running queries on it. Also, if there are running foreign key checks on the table, we drop the table lazily. -@return TRUE if the table was not yet in the drop list, and was added there */ +@return whether background DROP TABLE was scheduled for the first time */ static -ibool -row_add_table_to_background_drop_list( -/*==================================*/ - const char* name) /*!< in: table name */ +bool +row_add_table_to_background_drop_list(table_id_t table_id) { row_mysql_drop_t* drop; + bool added = true; mutex_enter(&row_drop_list_mutex); @@ -2905,31 +2868,21 @@ row_add_table_to_background_drop_list( drop != NULL; drop = UT_LIST_GET_NEXT(row_mysql_drop_list, drop)) { - if (strcmp(drop->table_name, name) == 0) { - /* Already in the list */ - - mutex_exit(&row_drop_list_mutex); - - return(FALSE); + if (drop->table_id == table_id) { + added = false; + goto func_exit; } } - drop = static_cast( - mem_alloc(sizeof(row_mysql_drop_t))); - - drop->table_name = mem_strdup(name); + drop = static_cast(ut_malloc(sizeof *drop)); + drop->table_id = table_id; UT_LIST_ADD_LAST(row_mysql_drop_list, row_mysql_drop_list, drop); MONITOR_INC(MONITOR_BACKGROUND_DROP_TABLE); - - /* fputs("InnoDB: Adding table ", stderr); - ut_print_name(stderr, trx, TRUE, drop->table_name); - fputs(" to background drop list\n", stderr); */ - +func_exit: mutex_exit(&row_drop_list_mutex); - - return(TRUE); + return added; } /*********************************************************************//** @@ -4150,7 +4103,7 @@ row_drop_table_for_mysql( DBUG_EXECUTE_IF("row_drop_table_add_to_background", - row_add_table_to_background_drop_list(table->name); + row_add_table_to_background_drop_list(table->id); err = DB_SUCCESS; goto funct_exit; ); @@ -4162,33 +4115,22 @@ row_drop_table_for_mysql( checks take an IS or IX lock on the table. */ if (table->n_foreign_key_checks_running > 0) { - - const char* save_tablename = table->name; - ibool added; - - added = row_add_table_to_background_drop_list(save_tablename); - - if (added) { + if (row_add_table_to_background_drop_list(table->id)) { ut_print_timestamp(stderr); fputs(" InnoDB: You are trying to drop table ", stderr); - ut_print_name(stderr, trx, TRUE, save_tablename); + ut_print_name(stderr, trx, TRUE, table->name); fputs("\n" "InnoDB: though there is a" " foreign key check running on it.\n" "InnoDB: Adding the table to" " the background drop queue.\n", stderr); - - /* We return DB_SUCCESS to MySQL though the drop will - happen lazily later */ - - err = DB_SUCCESS; - } else { - /* The table is already in the background drop list */ - err = DB_ERROR; } + /* We return DB_SUCCESS to MySQL though the drop will + happen lazily later */ + err = DB_SUCCESS; goto funct_exit; } @@ -4213,11 +4155,7 @@ row_drop_table_for_mysql( lock_remove_all_on_table(table, TRUE); ut_a(table->n_rec_locks == 0); } else if (table->n_ref_count > 0 || table->n_rec_locks > 0) { - ibool added; - - added = row_add_table_to_background_drop_list(table->name); - - if (added) { + if (row_add_table_to_background_drop_list(table->id)) { ut_print_timestamp(stderr); fputs(" InnoDB: Warning: MySQL is" " trying to drop table ", stderr); diff --git a/storage/xtradb/row/row0undo.cc b/storage/xtradb/row/row0undo.cc index 82b1ab04..552b99ab 100644 --- a/storage/xtradb/row/row0undo.cc +++ b/storage/xtradb/row/row0undo.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2017, 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 @@ -348,6 +349,13 @@ row_undo_step( ut_ad(que_node_get_type(node) == QUE_NODE_UNDO); + if (UNIV_UNLIKELY(trx == trx_roll_crash_recv_trx) + && trx_roll_must_shutdown()) { + /* Shutdown has been initiated. */ + trx->error_state = DB_INTERRUPTED; + return(NULL); + } + err = row_undo(node, thr); trx->error_state = err; diff --git a/storage/xtradb/trx/trx0rec.cc b/storage/xtradb/trx/trx0rec.cc index 4e0ba825..8cd51c80 100644 --- a/storage/xtradb/trx/trx0rec.cc +++ b/storage/xtradb/trx/trx0rec.cc @@ -1221,10 +1221,8 @@ trx_undo_report_row_operation( marking, the record in the clustered index, otherwise NULL */ const ulint* offsets, /*!< in: rec_get_offsets(rec) */ - roll_ptr_t* roll_ptr) /*!< out: rollback pointer to the - inserted undo log record, - 0 if BTR_NO_UNDO_LOG - flag was specified */ + roll_ptr_t* roll_ptr) /*!< out: DB_ROLL_PTR to the + undo log record */ { trx_t* trx; trx_undo_t* undo; diff --git a/storage/xtradb/trx/trx0roll.cc b/storage/xtradb/trx/trx0roll.cc index 335ef885..9a5fcea7 100644 --- a/storage/xtradb/trx/trx0roll.cc +++ b/storage/xtradb/trx/trx0roll.cc @@ -24,6 +24,9 @@ Transaction rollback Created 3/26/1996 Heikki Tuuri *******************************************************/ +#include "my_config.h" +#include + #include "trx0roll.h" #ifdef UNIV_NONINL @@ -60,14 +63,7 @@ rollback */ bool trx_rollback_or_clean_is_active; /** In crash recovery, the current trx to be rolled back; NULL otherwise */ -static const trx_t* trx_roll_crash_recv_trx = NULL; - -/** In crash recovery we set this to the undo n:o of the current trx to be -rolled back. Then we can print how many % the rollback has progressed. */ -static undo_no_t trx_roll_max_undo_no; - -/** Auxiliary variable which tells the previous progress % we printed */ -static ulint trx_roll_progress_printed_pct; +const trx_t* trx_roll_crash_recv_trx; /****************************************************************//** Finishes a transaction rollback. */ @@ -564,8 +560,6 @@ trx_rollback_active( que_thr_t* thr; roll_node_t* roll_node; dict_table_t* table; - ib_int64_t rows_to_undo; - const char* unit = ""; ibool dictionary_locked = FALSE; heap = mem_heap_create(512); @@ -584,30 +578,8 @@ trx_rollback_active( ut_a(thr == que_fork_start_command(fork)); - mutex_enter(&trx_sys->mutex); - trx_roll_crash_recv_trx = trx; - trx_roll_max_undo_no = trx->undo_no; - - trx_roll_progress_printed_pct = 0; - - rows_to_undo = trx_roll_max_undo_no; - - mutex_exit(&trx_sys->mutex); - - if (rows_to_undo > 1000000000) { - rows_to_undo = rows_to_undo / 1000000; - unit = "M"; - } - - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Rolling back trx with id " TRX_ID_FMT ", %lu%s" - " rows to undo\n", - trx->id, - (ulong) rows_to_undo, unit); - if (trx_get_dict_operation(trx) != TRX_DICT_OP_NONE) { row_mysql_lock_data_dictionary(trx); dictionary_locked = TRUE; @@ -618,6 +590,16 @@ trx_rollback_active( que_run_threads(roll_node->undo_thr); + if (trx->error_state != DB_SUCCESS) { + ut_ad(trx->error_state == DB_INTERRUPTED); + ut_ad(!srv_undo_sources); + ut_ad(srv_fast_shutdown); + ut_ad(!dictionary_locked); + que_graph_free(static_cast( + roll_node->undo_thr->common.parent)); + goto func_exit; + } + trx_rollback_finish(thr_get_trx(roll_node->undo_thr)); /* Free the memory reserved by the undo graph */ @@ -662,13 +644,14 @@ trx_rollback_active( } } + ib_logf(IB_LOG_LEVEL_INFO, + "Rollback of trx with id " TRX_ID_FMT " completed", trx->id); + +func_exit: if (dictionary_locked) { row_mysql_unlock_data_dictionary(trx); } - ib_logf(IB_LOG_LEVEL_INFO, - "Rollback of trx with id " TRX_ID_FMT " completed", trx->id); - mem_heap_free(heap); trx_roll_crash_recv_trx = NULL; @@ -685,7 +668,7 @@ ibool trx_rollback_resurrected( /*=====================*/ trx_t* trx, /*!< in: transaction to rollback or clean */ - ibool all) /*!< in: FALSE=roll back dictionary transactions; + ibool* all) /*!< in/out: FALSE=roll back dictionary transactions; TRUE=roll back all non-PREPARED transactions */ { ut_ad(mutex_own(&trx_sys->mutex)); @@ -696,16 +679,15 @@ trx_rollback_resurrected( to accidentally clean up a non-recovered transaction here. */ trx_mutex_enter(trx); - bool is_recovered = trx->is_recovered; - trx_state_t state = trx->state; - trx_mutex_exit(trx); - - if (!is_recovered) { + if (!trx->is_recovered) { +func_exit: + trx_mutex_exit(trx); return(FALSE); } - switch (state) { + switch (trx->state) { case TRX_STATE_COMMITTED_IN_MEMORY: + trx_mutex_exit(trx); mutex_exit(&trx_sys->mutex); fprintf(stderr, "InnoDB: Cleaning up trx with id " TRX_ID_FMT "\n", @@ -714,21 +696,83 @@ trx_rollback_resurrected( trx_free_for_background(trx); return(TRUE); case TRX_STATE_ACTIVE: - if (all || trx_get_dict_operation(trx) != TRX_DICT_OP_NONE) { + if (!srv_undo_sources && srv_fast_shutdown) { +fake_prepared: + trx->state = TRX_STATE_PREPARED; + trx_sys->n_prepared_trx++; + trx_sys->n_prepared_recovered_trx++; + *all = FALSE; + goto func_exit; + } + trx_mutex_exit(trx); + + if (*all || trx_get_dict_operation(trx) != TRX_DICT_OP_NONE) { mutex_exit(&trx_sys->mutex); trx_rollback_active(trx); + if (trx->error_state != DB_SUCCESS) { + ut_ad(trx->error_state == DB_INTERRUPTED); + ut_ad(!srv_undo_sources); + ut_ad(srv_fast_shutdown); + mutex_enter(&trx_sys->mutex); + trx_mutex_enter(trx); + goto fake_prepared; + } trx_free_for_background(trx); return(TRUE); } return(FALSE); case TRX_STATE_PREPARED: - return(FALSE); + goto func_exit; case TRX_STATE_NOT_STARTED: break; } ut_error; - return(FALSE); + goto func_exit; +} + +/** Report progress when rolling back a row of a recovered transaction. +@return whether the rollback should be aborted due to pending shutdown */ +UNIV_INTERN +bool +trx_roll_must_shutdown() +{ + const trx_t* trx = trx_roll_crash_recv_trx; + ut_ad(trx); + ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE)); + + if (trx_get_dict_operation(trx) == TRX_DICT_OP_NONE + && !srv_undo_sources && srv_fast_shutdown) { + return true; + } + + ib_time_t time = ut_time(); + mutex_enter(&trx_sys->mutex); + mutex_enter(&recv_sys->mutex); + + if (recv_sys->report(time)) { + ulint n_trx = 0, n_rows = 0; + for (const trx_t* t = UT_LIST_GET_FIRST(trx_sys->rw_trx_list); + t != NULL; + t = UT_LIST_GET_NEXT(trx_list, t)) { + + assert_trx_in_rw_list(t); + if (t->is_recovered + && trx_state_eq(t, TRX_STATE_ACTIVE)) { + n_trx++; + n_rows += t->undo_no; + } + } + ib_logf(IB_LOG_LEVEL_INFO, + "To roll back: " ULINTPF " transactions, " + ULINTPF " rows", n_trx, n_rows); + sd_notifyf(0, "STATUS=To roll back: " ULINTPF " transactions, " + ULINTPF " rows", n_trx, n_rows); + } + + mutex_exit(&recv_sys->mutex); + mutex_exit(&trx_sys->mutex); + return false; } /*******************************************************************//** @@ -775,17 +819,11 @@ trx_rollback_or_clean_recovered( assert_trx_in_rw_list(trx); - if (srv_shutdown_state != SRV_SHUTDOWN_NONE - && srv_fast_shutdown != 0) { - all = FALSE; - break; - } - /* If this function does a cleanup or rollback then it will release the trx_sys->mutex, therefore we need to reacquire it before retrying the loop. */ - if (trx_rollback_resurrected(trx, all)) { + if (trx_rollback_resurrected(trx, &all)) { mutex_enter(&trx_sys->mutex); @@ -1118,7 +1156,6 @@ trx_roll_pop_top_rec_of_trx( undo_no_t undo_no; ibool is_insert; trx_rseg_t* rseg; - ulint progress_pct; mtr_t mtr; rseg = trx->rseg; @@ -1176,27 +1213,6 @@ trx_roll_pop_top_rec_of_trx( ut_ad(undo_no + 1 == trx->undo_no); - /* We print rollback progress info if we are in a crash recovery - and the transaction has at least 1000 row operations to undo. */ - - if (trx == trx_roll_crash_recv_trx && trx_roll_max_undo_no > 1000) { - - progress_pct = 100 - (ulint) - ((undo_no * 100) / trx_roll_max_undo_no); - if (progress_pct != trx_roll_progress_printed_pct) { - if (trx_roll_progress_printed_pct == 0) { - fprintf(stderr, - "\nInnoDB: Progress in percents:" - " %lu", (ulong) progress_pct); - } else { - fprintf(stderr, - " %lu", (ulong) progress_pct); - } - fflush(stderr); - trx_roll_progress_printed_pct = progress_pct; - } - } - trx->undo_no = undo_no; if (!trx_undo_arr_store_info(trx, undo_no)) { diff --git a/storage/xtradb/trx/trx0sys.cc b/storage/xtradb/trx/trx0sys.cc index 83bb28b3..6108ab7a 100644 --- a/storage/xtradb/trx/trx0sys.cc +++ b/storage/xtradb/trx/trx0sys.cc @@ -184,12 +184,7 @@ trx_sys_flush_max_trx_id(void) mtr_t mtr; trx_sysf_t* sys_header; -#ifndef WITH_WSREP - /* wsrep_fake_trx_id violates this assert - * Copied from trx_sys_get_new_trx_id - */ ut_ad(mutex_own(&trx_sys->mutex)); -#endif /* WITH_WSREP */ if (!srv_read_only_mode) { mtr_start(&mtr); diff --git a/storage/xtradb/trx/trx0undo.cc b/storage/xtradb/trx/trx0undo.cc index 3259bcb7..24d14e06 100644 --- a/storage/xtradb/trx/trx0undo.cc +++ b/storage/xtradb/trx/trx0undo.cc @@ -2023,10 +2023,14 @@ trx_undo_free_prepared( /* fall through */ case TRX_UNDO_ACTIVE: /* lock_trx_release_locks() assigns - trx->is_recovered=false */ + trx->is_recovered=false and + trx->state = TRX_STATE_COMMITTED_IN_MEMORY, + also for transactions that we faked + to TRX_STATE_PREPARED in trx_rollback_resurrected(). */ ut_a(srv_read_only_mode || srv_apply_log_only - || srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO); + || srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO + || srv_fast_shutdown); break; default: ut_error; @@ -2048,10 +2052,14 @@ trx_undo_free_prepared( /* fall through */ case TRX_UNDO_ACTIVE: /* lock_trx_release_locks() assigns - trx->is_recovered=false */ + trx->is_recovered=false and + trx->state = TRX_STATE_COMMITTED_IN_MEMORY, + also for transactions that we faked + to TRX_STATE_PREPARED in trx_rollback_resurrected(). */ ut_a(srv_read_only_mode || srv_apply_log_only - || srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO); + || srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO + || srv_fast_shutdown); break; default: ut_error; diff --git a/strings/CMakeLists.txt b/strings/CMakeLists.txt index 32a3f06c..65eeb457 100644 --- a/strings/CMakeLists.txt +++ b/strings/CMakeLists.txt @@ -20,7 +20,7 @@ SET(STRINGS_SOURCES bchange.c bmove_upp.c ctype-big5.c ctype-bin.c ctype-cp932.c ctype-latin1.c ctype-mb.c ctype-simple.c ctype-sjis.c ctype-tis620.c ctype-uca.c ctype-ucs2.c ctype-ujis.c ctype-utf8.c ctype-win1250ch.c ctype.c decimal.c dtoa.c int2str.c is_prefix.c llstr.c longlong2str.c my_strtoll10.c my_vsnprintf.c - str2int.c str_alloc.c strcend.c strend.c strfill.c strmake.c strmov.c strnmov.c + str2int.c strcend.c strend.c strfill.c strmake.c strmov.c strnmov.c strxmov.c strxnmov.c xml.c strmov_overlapp.c my_strchr.c strcont.c strappend.c) diff --git a/strings/ctype-tis620.c b/strings/ctype-tis620.c index bd8efeff..5284109b 100644 --- a/strings/ctype-tis620.c +++ b/strings/ctype-tis620.c @@ -524,7 +524,7 @@ int my_strnncoll_tis620(CHARSET_INFO *cs __attribute__((unused)), tc1= buf; if ((len1 + len2 +2) > (int) sizeof(buf)) - tc1= (uchar*) my_str_malloc(len1+len2+2); + tc1= (uchar*) my_malloc(len1+len2+2, MYF(MY_FAE)); tc2= tc1 + len1+1; memcpy((char*) tc1, (char*) s1, len1); tc1[len1]= 0; /* if length(s1)> len1, need to put 'end of string' */ @@ -534,7 +534,7 @@ int my_strnncoll_tis620(CHARSET_INFO *cs __attribute__((unused)), thai2sortable(tc2, len2); i= strcmp((char*)tc1, (char*)tc2); if (tc1 != buf) - my_str_free(tc1); + my_free(tc1); return i; } @@ -555,7 +555,7 @@ int my_strnncollsp_tis620(CHARSET_INFO * cs __attribute__((unused)), a= buf; if ((a_length + b_length +2) > (int) sizeof(buf)) - alloced= a= (uchar*) my_str_malloc(a_length+b_length+2); + alloced= a= (uchar*) my_malloc(a_length+b_length+2, MYF(MY_FAE)); b= a + a_length+1; memcpy((char*) a, (char*) a0, a_length); @@ -604,7 +604,7 @@ int my_strnncollsp_tis620(CHARSET_INFO * cs __attribute__((unused)), ret: if (alloced) - my_str_free(alloced); + my_free(alloced); return res; } diff --git a/strings/my_vsnprintf.c b/strings/my_vsnprintf.c index 4178b207..134fdfc5 100644 --- a/strings/my_vsnprintf.c +++ b/strings/my_vsnprintf.c @@ -755,14 +755,14 @@ int my_vfprintf(FILE *stream, const char* format, va_list args) and try again. */ if (alloc) - (*my_str_free)(p); + my_free(p); else alloc= 1; new_len= cur_len*2; if (new_len < cur_len) return 0; /* Overflow */ cur_len= new_len; - p= (*my_str_malloc)(cur_len); + p= my_malloc(cur_len, MYF(MY_FAE)); if (!p) return 0; } @@ -770,7 +770,7 @@ int my_vfprintf(FILE *stream, const char* format, va_list args) if (fputs(p, stream) < 0) ret= -1; if (alloc) - (*my_str_free)(p); + my_free(p); return ret; } diff --git a/strings/str_alloc.c b/strings/str_alloc.c deleted file mode 100644 index 91246603..00000000 --- a/strings/str_alloc.c +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (c) 2005, 2006 MySQL AB - Copyright (c) 2009-2011, Monty Program Ab - Use is subject to license terms. - Copyright (c) 2009-2011, 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 - the Free Software Foundation; version 2 of the License. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - -#include "strings_def.h" - -static void *my_str_malloc_default(size_t size) -{ - void *ret= malloc(size); - if (!ret) - exit(1); - return ret; -} - -static void my_str_free_default(void *ptr) -{ - free(ptr); -} - -void *my_str_realloc_default(void *ptr, size_t size) -{ - return realloc(ptr, size); -} - -void *(*my_str_malloc)(size_t)= &my_str_malloc_default; -void (*my_str_free)(void *)= &my_str_free_default; -void *(*my_str_realloc)(void *, size_t)= &my_str_realloc_default; diff --git a/strings/xml.c b/strings/xml.c index 4685a04f..b5fed6a6 100644 --- a/strings/xml.c +++ b/strings/xml.c @@ -17,6 +17,7 @@ #include "strings_def.h" #include "m_string.h" #include "my_xml.h" +#include "my_sys.h" #define MY_XML_UNKNOWN 'U' @@ -231,13 +232,13 @@ static int my_xml_attr_ensure_space(MY_XML_PARSER *st, size_t len) if (!st->attr.buffer) { - st->attr.buffer= (char *) my_str_malloc(st->attr.buffer_size); + st->attr.buffer= (char *) my_malloc(st->attr.buffer_size, MYF(0)); if (st->attr.buffer) memcpy(st->attr.buffer, st->attr.static_buffer, ofs + 1 /*term. zero */); } else - st->attr.buffer= (char *) my_str_realloc(st->attr.buffer, - st->attr.buffer_size); + st->attr.buffer= (char *) my_realloc(st->attr.buffer, + st->attr.buffer_size, MYF(0)); st->attr.start= st->attr.buffer; st->attr.end= st->attr.start + ofs; @@ -507,7 +508,7 @@ void my_xml_parser_free(MY_XML_PARSER *p) { if (p->attr.buffer) { - my_str_free(p->attr.buffer); + my_free(p->attr.buffer); p->attr.buffer= NULL; } } diff --git a/support-files/CMakeLists.txt b/support-files/CMakeLists.txt index 71e9b3fa..3b6e8603 100644 --- a/support-files/CMakeLists.txt +++ b/support-files/CMakeLists.txt @@ -104,6 +104,21 @@ IF(UNIX) ${CMAKE_CURRENT_BINARY_DIR}/mariadb.service DESTINATION ${inst_location}/systemd COMPONENT SupportFiles) + IF(INSTALL_SYSTEMD_SYSUSERSDIR) + CONFIGURE_FILE(sysusers.conf.in + ${CMAKE_CURRENT_BINARY_DIR}/sysusers.conf @ONLY) + INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/sysusers.conf + DESTINATION ${INSTALL_SYSTEMD_SYSUSERSDIR} COMPONENT Server) + ENDIF() + + IF(INSTALL_SYSTEMD_TMPFILESDIR) + get_filename_component(MYSQL_UNIX_DIR ${MYSQL_UNIX_ADDR} DIRECTORY) + CONFIGURE_FILE(tmpfiles.conf.in + ${CMAKE_CURRENT_BINARY_DIR}/tmpfiles.conf @ONLY) + INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/tmpfiles.conf + DESTINATION ${INSTALL_SYSTEMD_TMPFILESDIR} COMPONENT Server) + ENDIF() + # @ in directory name broken between CMake version 2.8.12.2 and 3.3 # http://public.kitware.com/Bug/view.php?id=14782 IF(NOT CMAKE_VERSION VERSION_LESS 3.3.0 OR NOT RPM) diff --git a/support-files/mariadb.service.in b/support-files/mariadb.service.in index 6a307b2c..fe00f160 100644 --- a/support-files/mariadb.service.in +++ b/support-files/mariadb.service.in @@ -13,7 +13,9 @@ # and probably others [Unit] -Description=MariaDB database server +Description=MariaDB @VERSION@ database server +Documentation=man:mysqld(8) +Documentation=https://mariadb.com/kb/en/library/systemd/ After=network.target After=syslog.target @@ -76,7 +78,7 @@ ExecStartPre=/bin/sh -c "[ ! -e @bindir@/galera_recovery ] && VAR= || \ # Start main service # MYSQLD_OPTS here is for users to set in /etc/systemd/system/mariadb.service.d/MY_SPECIAL.conf -# Use the [service] section and Environment="MYSQLD_OPTS=...". +# Use the [Service] section and Environment="MYSQLD_OPTS=...". # This isn't a replacement for my.cnf. # _WSREP_NEW_CLUSTER is for the exclusive use of the script galera_new_cluster ExecStart=@sbindir@/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION @@ -103,7 +105,8 @@ UMask=007 ## ## ## by creating a file in /etc/systemd/system/mariadb.service.d/MY_SPECIAL.conf -## and adding/setting the following will override this file's settings. +## and adding/setting the following under [Service] will override this file's +## settings. # Useful options not previously available in [mysqld_safe] diff --git a/support-files/mariadb@.service.in b/support-files/mariadb@.service.in index 410e7433..000724d7 100644 --- a/support-files/mariadb@.service.in +++ b/support-files/mariadb@.service.in @@ -18,7 +18,9 @@ # Inspired from https://gitweb.gentoo.org/repo/gentoo.git/tree/dev-db/mysql-init-scripts/files/mysqld_at.service [Unit] -Description=MariaDB database server +Description=MariaDB @VERSION@ database server (multi-instance) +Documentation=man:mysqld(8) +Documentation=https://mariadb.com/kb/en/library/systemd/ After=network.target After=syslog.target @@ -89,7 +91,7 @@ ExecStartPre=/bin/sh -c "[ ! -e @bindir@/galera_recovery ] && VAR= || \ # Start main service # MYSQLD_OPTS here is for users to set in /etc/systemd/system/mariadb@.service.d/MY_SPECIAL.conf -# Use the [service] section and Environment="MYSQLD_OPTS=...". +# Use the [Service] section and Environment="MYSQLD_OPTS=...". # This isn't a replacement for my.cnf. # _WSREP_NEW_CLUSTER is for the exclusive use of the script galera_new_cluster @@ -124,7 +126,8 @@ UMask=007 ## ## ## by creating a file in /etc/systemd/system/mariadb.service.d/MY_SPECIAL.conf -## and adding/setting the following will override this file's settings. +## and adding/setting the following below [Service] will override this file's +## settings. # Useful options not previously available in [mysqld_safe] diff --git a/support-files/sysusers.conf.in b/support-files/sysusers.conf.in new file mode 100644 index 00000000..a975b294 --- /dev/null +++ b/support-files/sysusers.conf.in @@ -0,0 +1 @@ +u @MYSQLD_USER@ - "MariaDB" @MYSQL_DATADIR@ diff --git a/support-files/tmpfiles.conf.in b/support-files/tmpfiles.conf.in new file mode 100644 index 00000000..03d66abc --- /dev/null +++ b/support-files/tmpfiles.conf.in @@ -0,0 +1 @@ +d @MYSQL_UNIX_DIR@ 0755 @MYSQLD_USER@ @MYSQLD_USER@ - -- GitLab From 5a2d98539a360c6ee6d106b16964451cd0dca81e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Mon, 26 Feb 2018 17:58:05 -0500 Subject: [PATCH 2/3] New upstream version 10.1.31 --- CMakeLists.txt | 4 +- CREDITS | 3 +- Docs/INFO_SRC | 10 +- VERSION | 2 +- client/mysql.cc | 12 +- client/mysqltest.cc | 4 - .../build_configurations/mysql_release.cmake | 1 + config.h.cmake | 1 + configure.cmake | 12 +- extra/mariabackup/xtrabackup.cc | 54 +- include/ma_dyncol.h | 3 + include/my_compare.h | 24 +- include/my_global.h | 8 + include/my_valgrind.h | 26 +- include/welcome_copyright_notice.h | 2 +- libmysql/CMakeLists.txt | 4 +- man/mysqladmin.1 | 186 ++++++- mysql-test/CMakeLists.txt | 1 + mysql-test/include/truncate_file.inc | 11 +- mysql-test/lib/My/SafeProcess.pm | 2 +- mysql-test/mysql-test-run.pl | 25 +- mysql-test/r/contributors.result | 3 +- mysql-test/r/create.result | 138 +++++ mysql-test/r/derived.result | 41 ++ mysql-test/r/dyncol.result | 10 + mysql-test/r/fulltext.result | 20 + mysql-test/r/func_concat.result | 6 + mysql-test/r/func_isnull.result | 84 +++ mysql-test/r/join_cache.result | 58 ++ mysql-test/r/mdev_14586.result | 44 ++ mysql-test/r/merge.result | 4 +- mysql-test/r/myisam_optimize.result | 14 + mysql-test/r/mysqldump-nl.result | 43 ++ mysql-test/r/order_by.result | 46 ++ mysql-test/r/partition.result | 13 +- mysql-test/r/partition_windows.result | 4 - mysql-test/r/ps.result | 18 + mysql-test/r/query_cache_debug.result | 26 + mysql-test/r/repair.result | 17 +- mysql-test/r/sp.result | 123 +++++ mysql-test/r/subselect.result | 26 + mysql-test/r/subselect_no_exists_to_in.result | 26 + mysql-test/r/subselect_no_mat.result | 26 + mysql-test/r/subselect_no_opts.result | 26 + mysql-test/r/subselect_no_scache.result | 26 + mysql-test/r/subselect_no_semijoin.result | 26 + mysql-test/r/union.result | 37 ++ mysql-test/r/update_innodb.result | 10 + mysql-test/r/xa.result | 11 + mysql-test/r/xml.result | 12 + .../encryption/t/debug_key_management.test | 5 +- .../suite/encryption/t/encrypt_and_grep.test | 3 +- .../suite/encryption/t/innodb_encryption.test | 6 +- .../federated/net_thd_crash-12951.result | 11 + .../suite/federated/net_thd_crash-12951.test | 23 + .../suite/galera/r/galera_gtid_slave.result | 26 + .../r/galera_gtid_slave_sst_rsync.result | 130 +++++ .../suite/galera/t/galera_gtid_slave.cnf | 18 + .../suite/galera/t/galera_gtid_slave.test | 78 +++ .../galera/t/galera_gtid_slave_sst_rsync.cnf | 18 + .../galera/t/galera_gtid_slave_sst_rsync.test | 207 +++++++ .../suite/galera_3nodes/galera_2x3nodes.cnf | 122 +++++ .../suite/galera_3nodes/include/have_ipv6.inc | 15 + .../r/galera_gtid_2_cluster.result | 231 ++++++++ .../galera_3nodes/t/galera_gtid_2_cluster.cnf | 28 + .../t/galera_gtid_2_cluster.test | 292 ++++++++++ .../t/galera_innobackupex_backup.test | 2 +- .../t/galera_safe_to_bootstrap.test | 2 +- .../suite/innodb/r/innodb-index-online.result | 16 + .../r/innodb-lru-force-no-free-page.result | 10 + .../innodb/r/innodb-replace-debug.result | 5 +- mysql-test/suite/innodb/r/innodb.result | 82 +++ .../suite/innodb/r/innodb_corrupt_bit.result | 45 ++ .../suite/innodb/t/innodb-index-online.test | 27 +- .../t/innodb-lru-force-no-free-page.test | 25 + mysql-test/suite/innodb/t/innodb-master.opt | 2 + .../suite/innodb/t/innodb-replace-debug.test | 5 +- mysql-test/suite/innodb/t/innodb.test | 103 +++- .../suite/innodb/t/innodb_corrupt_bit.test | 8 +- .../innodb/t/table_definition_cache_debug.opt | 2 +- mysql-test/suite/maria/lock.result | 69 +++ mysql-test/suite/maria/lock.test | 55 ++ mysql-test/suite/maria/maria.result | 11 + mysql-test/suite/maria/maria.test | 15 + mysql-test/suite/maria/repair.result | 24 + mysql-test/suite/maria/repair.test | 24 + mysql-test/suite/mariabackup/huge_lsn.opt | 6 + mysql-test/suite/mariabackup/huge_lsn.result | 19 + mysql-test/suite/mariabackup/huge_lsn.test | 54 ++ .../suite/mariabackup/missing_ibd.result | 6 + mysql-test/suite/mariabackup/missing_ibd.test | 27 + .../parts/r/partition_alter_myisam.result | 13 + .../suite/parts/t/partition_alter_myisam.test | 19 + .../rpl/t/rpl_manual_change_index_file.test | 2 +- ..._print_lock_wait_timeout_info_basic.result | 104 ++++ .../r/sysvars_innodb,32bit,xtradb.rdiff | 18 +- .../sys_vars/r/sysvars_innodb,xtradb.rdiff | 34 +- ...db_print_lock_wait_timeout_info_basic.test | 89 +++ mysql-test/t/create.test | 143 +++++ mysql-test/t/derived.test | 38 ++ mysql-test/t/dyncol.test | 8 + mysql-test/t/fulltext.test | 15 + mysql-test/t/func_concat.test | 6 + mysql-test/t/func_isnull.test | 48 +- mysql-test/t/join_cache.test | 45 ++ mysql-test/t/mdev_14586.test | 27 + mysql-test/t/merge.test | 4 +- mysql-test/t/myisam_optimize.test | 17 + mysql-test/t/mysqldump-nl.test | 20 + mysql-test/t/order_by.test | 38 ++ mysql-test/t/partition.test | 15 +- mysql-test/t/ps.test | 15 + mysql-test/t/query_cache_debug.test | 52 ++ mysql-test/t/repair.test | 23 +- mysql-test/t/sp.test | 149 +++++ mysql-test/t/subselect.test | 27 + mysql-test/t/union.test | 37 ++ mysql-test/t/update_innodb.test | 12 + mysql-test/t/xa.test | 14 + mysql-test/t/xml.test | 9 + mysql-test/unstable-tests | 176 +++--- mysys/ma_dyncol.c | 60 ++- mysys/mf_iocache.c | 2 +- mysys/my_addr_resolve.c | 156 +++--- mysys/my_alloc.c | 11 +- mysys/my_default.c | 5 +- mysys/my_lib.c | 10 - mysys/my_thr_init.c | 1 - mysys_ssl/my_crypt.cc | 23 +- mysys_ssl/yassl.cc | 1 + scripts/galera_recovery.sh | 2 +- scripts/mysql_install_db.sh | 16 +- scripts/wsrep_sst_common.sh | 50 +- scripts/wsrep_sst_mysqldump.sh | 10 +- scripts/wsrep_sst_rsync.sh | 14 +- scripts/wsrep_sst_xtrabackup-v2.sh | 107 ++-- scripts/wsrep_sst_xtrabackup.sh | 55 +- sql/CMakeLists.txt | 2 +- sql/contributors.h | 3 +- sql/field.cc | 4 +- sql/field.h | 2 +- sql/field_conv.cc | 6 +- sql/ha_partition.cc | 69 ++- sql/handler.cc | 14 +- sql/item.cc | 8 +- sql/item.h | 10 +- sql/item_cmpfunc.cc | 45 +- sql/item_cmpfunc.h | 6 +- sql/item_func.cc | 2 + sql/item_strfunc.cc | 185 +++---- sql/item_strfunc.h | 1 + sql/item_subselect.cc | 7 +- sql/item_xmlfunc.cc | 10 +- sql/item_xmlfunc.h | 1 + sql/key.cc | 6 +- sql/log.cc | 88 ++- sql/log.h | 8 +- sql/log_event.cc | 7 +- sql/mysqld.cc | 2 +- sql/net_serv.cc | 4 +- sql/opt_range.cc | 2 +- sql/opt_subselect.cc | 64 ++- sql/sp.cc | 1 - sql/sp_head.cc | 35 +- sql/sp_head.h | 3 - sql/sql_acl.cc | 26 +- sql/sql_admin.cc | 3 +- sql/sql_base.cc | 11 +- sql/sql_cache.cc | 22 +- sql/sql_class.cc | 15 +- sql/sql_class.h | 43 +- sql/sql_cursor.cc | 2 +- sql/sql_derived.cc | 71 ++- sql/sql_explain.h | 6 + sql/sql_insert.cc | 2 +- sql/sql_join_cache.cc | 2 +- sql/sql_lex.cc | 4 +- sql/sql_lex.h | 14 +- sql/sql_lifo_buffer.h | 4 +- sql/sql_list.h | 4 +- sql/sql_parse.cc | 9 +- sql/sql_partition.cc | 7 +- sql/sql_plugin.cc | 5 + sql/sql_prepare.cc | 20 +- sql/sql_select.cc | 74 ++- sql/sql_select.h | 2 +- sql/sql_show.cc | 2 +- sql/sql_string.h | 2 +- sql/sql_table.cc | 11 +- sql/sql_trigger.cc | 7 +- sql/sql_union.cc | 16 - sql/sql_update.cc | 2 + sql/sql_view.cc | 7 +- sql/table.cc | 11 +- sql/table.h | 6 + sql/transaction.cc | 12 +- sql/unireg.cc | 15 +- sql/wsrep_mysqld.cc | 10 + sql/wsrep_sst.cc | 19 +- sql/wsrep_sst.h | 3 +- storage/connect/CMakeLists.txt | 4 +- storage/connect/fmdlex.c | 2 +- storage/connect/global.h | 3 +- storage/connect/ha_connect.cc | 55 +- storage/connect/{inihandl.c => inihandl.cpp} | 35 +- storage/connect/jsonudf.cpp | 13 +- storage/connect/myconn.cpp | 5 +- .../connect/mysql-test/connect/disabled.def | 1 + storage/connect/plgdbutl.cpp | 2 +- storage/connect/plugutil.cpp | 73 ++- storage/connect/tabtbl.cpp | 22 +- storage/connect/tabtbl.h | 50 +- storage/connect/user_connect.cc | 23 +- storage/federated/ha_federated.cc | 9 +- storage/federatedx/ha_federatedx.h | 2 +- storage/heap/ha_heap.cc | 9 + storage/innobase/CMakeLists.txt | 3 +- storage/innobase/api/api0api.cc | 2 +- storage/innobase/btr/btr0cur.cc | 34 +- storage/innobase/btr/btr0pcur.cc | 2 +- storage/innobase/buf/buf0buddy.cc | 3 +- storage/innobase/buf/buf0dump.cc | 1 + storage/innobase/buf/buf0lru.cc | 81 ++- storage/innobase/data/data0type.cc | 10 +- storage/innobase/dict/dict0dict.cc | 1 + storage/innobase/dict/dict0mem.cc | 9 +- storage/innobase/fil/fil0fil.cc | 2 +- storage/innobase/fts/fts0fts.cc | 22 +- storage/innobase/fts/fts0que.cc | 20 +- storage/innobase/handler/ha_innodb.cc | 4 +- storage/innobase/handler/handler0alter.cc | 5 +- storage/innobase/ibuf/ibuf0ibuf.cc | 4 +- storage/innobase/include/btr0cur.h | 12 +- storage/innobase/include/data0type.h | 50 +- storage/innobase/include/data0type.ic | 56 +- storage/innobase/include/dict0dict.h | 14 +- storage/innobase/include/dict0dict.ic | 34 +- storage/innobase/include/dict0mem.h | 11 +- storage/innobase/include/fil0fil.h | 2 +- storage/innobase/include/log0crypt.h | 6 +- storage/innobase/include/mem0mem.ic | 12 +- storage/innobase/include/mtr0mtr.h | 16 +- storage/innobase/include/mtr0mtr.ic | 6 +- storage/innobase/include/rem0rec.ic | 3 +- storage/innobase/include/row0mysql.h | 12 - storage/innobase/include/trx0rec.h | 3 +- storage/innobase/include/trx0undo.h | 13 +- storage/innobase/include/univ.i | 8 - storage/innobase/include/ut0ut.h | 3 +- storage/innobase/lock/lock0lock.cc | 4 +- storage/innobase/log/log0crypt.cc | 54 +- storage/innobase/log/log0log.cc | 7 +- storage/innobase/mem/mem0mem.cc | 13 +- storage/innobase/rem/rem0rec.cc | 18 +- storage/innobase/row/row0ext.cc | 3 +- storage/innobase/row/row0ftsort.cc | 22 +- storage/innobase/row/row0import.cc | 9 +- storage/innobase/row/row0ins.cc | 33 +- storage/innobase/row/row0log.cc | 16 +- storage/innobase/row/row0merge.cc | 25 +- storage/innobase/row/row0mysql.cc | 12 +- storage/innobase/row/row0purge.cc | 4 +- storage/innobase/row/row0quiesce.cc | 8 +- storage/innobase/row/row0row.cc | 9 +- storage/innobase/row/row0sel.cc | 33 +- storage/innobase/row/row0umod.cc | 14 +- storage/innobase/row/row0upd.cc | 15 +- storage/innobase/srv/srv0srv.cc | 4 - storage/innobase/trx/trx0purge.cc | 26 - storage/innobase/trx/trx0rec.cc | 22 +- storage/innobase/trx/trx0roll.cc | 9 +- storage/innobase/trx/trx0undo.cc | 10 +- storage/innobase/ut/ut0ut.cc | 7 +- storage/maria/ha_maria.cc | 7 +- storage/maria/ma_blockrec.c | 20 +- storage/maria/ma_page.c | 40 +- storage/maria/ma_search.c | 14 +- storage/maria/ma_state.c | 24 +- storage/maria/ma_state.h | 1 + storage/maria/ma_write.c | 2 +- storage/maria/maria_def.h | 3 +- .../ma_test_loghandler_multigroup-t.c | 6 +- .../unittest/ma_test_loghandler_nologs-t.c | 2 + storage/myisam/ha_myisam.cc | 47 +- storage/myisam/mi_locking.c | 8 +- storage/myisam/mi_search.c | 14 +- storage/tokudb/CMakeLists.txt | 4 +- storage/tokudb/PerconaFT/CMakeLists.txt | 7 +- .../tokudb/PerconaFT/buildheader/make_tdb.cc | 13 +- .../cmake_modules/TokuSetupCompiler.cmake | 10 +- .../ft/cachetable/background_job_manager.cc | 9 +- .../PerconaFT/ft/cachetable/cachetable.cc | 82 ++- .../PerconaFT/ft/cachetable/checkpoint.cc | 36 +- storage/tokudb/PerconaFT/ft/ft-ops.cc | 304 ++++++++++- storage/tokudb/PerconaFT/ft/ft.cc | 17 +- .../tokudb/PerconaFT/ft/loader/callbacks.cc | 6 +- storage/tokudb/PerconaFT/ft/loader/dbufio.cc | 163 +++--- .../PerconaFT/ft/loader/loader-internal.h | 37 +- storage/tokudb/PerconaFT/ft/loader/loader.cc | 365 +++++++------ storage/tokudb/PerconaFT/ft/loader/loader.h | 5 +- .../tokudb/PerconaFT/ft/logger/log-internal.h | 8 +- .../tokudb/PerconaFT/ft/logger/logcursor.cc | 8 +- storage/tokudb/PerconaFT/ft/logger/logger.cc | 79 ++- storage/tokudb/PerconaFT/ft/logger/recover.cc | 14 +- .../PerconaFT/ft/serialize/block_allocator.cc | 1 + .../PerconaFT/ft/serialize/block_table.cc | 13 +- .../PerconaFT/ft/serialize/ft-serialize.cc | 10 +- .../PerconaFT/ft/serialize/sub_block.cc | 3 + .../tokudb/PerconaFT/ft/serialize/workset.h | 14 +- .../PerconaFT/ft/tests/cachetable-4357.cc | 31 +- .../PerconaFT/ft/tests/cachetable-4365.cc | 42 +- .../PerconaFT/ft/tests/cachetable-5097.cc | 11 +- .../PerconaFT/ft/tests/cachetable-5978-2.cc | 20 +- .../PerconaFT/ft/tests/cachetable-5978.cc | 6 +- .../ft/tests/cachetable-checkpoint-pending.cc | 24 +- ...hetable-cleaner-thread-attrs-accumulate.cc | 2 +- .../ft/tests/cachetable-clone-checkpoint.cc | 11 +- .../ft/tests/cachetable-pin-checkpoint.cc | 21 +- .../ft/tests/cachetable-put-checkpoint.cc | 21 +- .../ft/tests/cachetable-rwlock-test.cc | 47 +- .../cachetable-simple-read-pin-nonblocking.cc | 30 +- .../ft/tests/cachetable-simple-read-pin.cc | 30 +- .../PerconaFT/ft/tests/cachetable-test.cc | 8 +- .../cachetable-unpin-remove-and-checkpoint.cc | 17 +- .../tests/ftloader-test-extractor-errors.cc | 4 +- .../tests/ftloader-test-merge-files-dbufio.cc | 12 +- .../ft/tests/ftloader-test-writer-errors.cc | 4 +- .../tokudb/PerconaFT/ft/tests/log-test4.cc | 13 +- .../tokudb/PerconaFT/ft/tests/log-test5.cc | 16 +- .../tokudb/PerconaFT/ft/tests/log-test6.cc | 13 +- .../ft/tests/recovery-bad-last-entry.cc | 15 +- storage/tokudb/PerconaFT/ft/tests/test-bjm.cc | 14 +- .../ft/tests/test-checkpoint-during-flush.cc | 8 +- .../ft/tests/test-checkpoint-during-merge.cc | 8 +- .../tests/test-checkpoint-during-rebalance.cc | 8 +- .../ft/tests/test-checkpoint-during-split.cc | 8 +- storage/tokudb/PerconaFT/ft/tests/test3681.cc | 34 +- storage/tokudb/PerconaFT/ft/txn/roll.cc | 6 +- .../ft/txn/rollback_log_node_cache.cc | 6 +- storage/tokudb/PerconaFT/ft/txn/txn.cc | 119 ++-- .../PerconaFT/ft/txn/txn_child_manager.cc | 4 +- .../tokudb/PerconaFT/ft/txn/txn_manager.cc | 10 +- .../tokudb/PerconaFT/locktree/lock_request.cc | 2 +- storage/tokudb/PerconaFT/locktree/locktree.cc | 8 +- storage/tokudb/PerconaFT/locktree/manager.cc | 10 +- .../locktree_escalation_1big7lt_1small.cc | 10 +- .../tests/locktree_escalation_2big_1lt.cc | 6 +- .../tests/locktree_escalation_2big_2lt.cc | 6 +- .../tests/locktree_escalation_stalls.cc | 13 +- .../manager_parallel_locktree_get_release.cc | 3 +- storage/tokudb/PerconaFT/locktree/treenode.cc | 8 +- .../PerconaFT/portability/CMakeLists.txt | 5 + storage/tokudb/PerconaFT/portability/file.cc | 498 +++++++++++++---- .../tokudb/PerconaFT/portability/memory.cc | 8 +- .../PerconaFT/portability/portability.cc | 60 ++- .../portability/tests/rwlock_condvar.h | 4 +- .../tests/test-pthread-rwlock-rdlock.cc | 2 +- .../tests/test-pthread-rwlock-rwr.cc | 14 +- .../PerconaFT/portability/tests/test-stat.cc | 9 +- .../portability/tests/test-toku-malloc.cc | 8 +- .../PerconaFT/portability/toku_assert.h | 14 +- .../PerconaFT/portability/toku_instr_mysql.cc | 365 +++++++++++++ .../PerconaFT/portability/toku_instr_mysql.h | 249 +++++++++ .../portability/toku_instrumentation.h | 339 ++++++++++++ .../tokudb/PerconaFT/portability/toku_os.h | 10 +- .../PerconaFT/portability/toku_portability.h | 328 +++++++++-- .../PerconaFT/portability/toku_pthread.h | 450 +++++++++++----- .../tokudb/PerconaFT/src/indexer-undo-do.cc | 2 + storage/tokudb/PerconaFT/src/indexer.cc | 19 +- .../src/tests/blocking-first-empty.cc | 10 +- .../PerconaFT/src/tests/blocking-first.cc | 10 +- .../PerconaFT/src/tests/blocking-last.cc | 10 +- .../src/tests/blocking-next-prev-deadlock.cc | 10 +- .../PerconaFT/src/tests/blocking-next-prev.cc | 10 +- .../src/tests/blocking-prelock-range.cc | 13 +- .../src/tests/blocking-put-timeout.cc | 17 +- .../src/tests/blocking-put-wakeup.cc | 17 +- .../PerconaFT/src/tests/blocking-put.cc | 10 +- .../src/tests/blocking-set-range-0.cc | 11 +- .../src/tests/blocking-set-range-n.cc | 11 +- .../src/tests/blocking-set-range-reverse-0.cc | 11 +- .../PerconaFT/src/tests/blocking-set.cc | 10 +- .../src/tests/blocking-table-lock.cc | 13 +- .../src/tests/checkpoint_fairness.cc | 12 +- .../PerconaFT/src/tests/checkpoint_stress.cc | 37 +- .../tests/db-put-simple-deadlock-threads.cc | 9 +- .../src/tests/db-put-simple-lockwait.cc | 7 +- .../src/tests/db-put-update-deadlock.cc | 15 +- .../tokudb/PerconaFT/src/tests/filesize.cc | 6 +- .../PerconaFT/src/tests/hotindexer-bw.cc | 26 +- .../src/tests/hotindexer-multiclient.cc | 22 +- .../src/tests/hotindexer-put-abort.cc | 9 +- .../src/tests/hotindexer-put-commit.cc | 14 +- .../src/tests/hotindexer-with-queries.cc | 13 +- .../src/tests/locktree_escalation_stalls.cc | 13 +- .../recover-test_crash_in_flusher_thread.h | 19 +- .../PerconaFT/src/tests/recovery_stress.cc | 15 +- .../PerconaFT/src/tests/stress_openclose.h | 11 +- .../tokudb/PerconaFT/src/tests/test3039.cc | 44 +- .../PerconaFT/src/tests/test_1672532.cc | 210 ++++++++ .../tokudb/PerconaFT/src/tests/test_3645.cc | 46 +- .../tokudb/PerconaFT/src/tests/test_4015.cc | 14 +- .../tokudb/PerconaFT/src/tests/test_abort1.cc | 20 +- .../tokudb/PerconaFT/src/tests/test_abort4.cc | 10 +- .../tokudb/PerconaFT/src/tests/test_abort5.cc | 10 +- .../PerconaFT/src/tests/test_forkjoin.cc | 9 +- .../src/tests/test_groupcommit_count.cc | 14 +- .../src/tests/test_groupcommit_perf.cc | 14 +- .../test_iterate_pending_lock_requests.cc | 11 +- .../src/tests/test_lock_timeout_callback.cc | 3 +- .../tokudb/PerconaFT/src/tests/test_log1.cc | 10 +- .../PerconaFT/src/tests/test_log1_abort.cc | 12 +- .../tokudb/PerconaFT/src/tests/test_logmax.cc | 21 +- .../test_multiple_checkpoints_block_commit.cc | 15 +- .../src/tests/test_stress_hot_indexing.cc | 7 +- .../PerconaFT/src/tests/test_thread_insert.cc | 9 +- .../PerconaFT/src/tests/test_txn_abort7.cc | 21 +- .../src/tests/threaded_stress_test_helpers.h | 49 +- .../txn_manager_handle_snapshot_atomicity.cc | 4 +- storage/tokudb/PerconaFT/src/ydb.cc | 31 +- storage/tokudb/PerconaFT/src/ydb_db.cc | 105 ++-- storage/tokudb/PerconaFT/src/ydb_db.h | 3 +- storage/tokudb/PerconaFT/src/ydb_env_func.cc | 2 +- storage/tokudb/PerconaFT/src/ydb_txn.cc | 10 +- storage/tokudb/PerconaFT/tools/CMakeLists.txt | 1 + storage/tokudb/PerconaFT/util/dbt.cc | 3 +- storage/tokudb/PerconaFT/util/fmutex.h | 6 +- storage/tokudb/PerconaFT/util/frwlock.cc | 510 ++++++++++-------- storage/tokudb/PerconaFT/util/frwlock.h | 142 ++--- storage/tokudb/PerconaFT/util/kibbutz.cc | 28 +- storage/tokudb/PerconaFT/util/minicron.cc | 31 +- storage/tokudb/PerconaFT/util/nb_mutex.h | 52 +- storage/tokudb/PerconaFT/util/queue.cc | 13 +- storage/tokudb/PerconaFT/util/rwlock.h | 88 ++- .../PerconaFT/util/tests/marked-omt-test.cc | 18 +- .../PerconaFT/util/tests/minicron-test.cc | 9 +- .../tokudb/PerconaFT/util/tests/queue-test.cc | 6 +- .../PerconaFT/util/tests/rwlock_condvar.h | 6 +- .../tokudb/PerconaFT/util/tests/sm-basic.cc | 3 +- .../util/tests/sm-crash-double-free.cc | 6 +- .../util/tests/test-frwlock-fair-writers.cc | 4 +- .../util/tests/test-rwlock-cheapness.cc | 11 +- .../PerconaFT/util/tests/test-rwlock.cc | 39 +- .../PerconaFT/util/tests/threadpool-test.cc | 7 +- storage/tokudb/PerconaFT/util/threadpool.cc | 31 +- storage/tokudb/ha_tokudb.cc | 139 ++--- storage/tokudb/ha_tokudb.h | 16 +- storage/tokudb/ha_tokudb_update.cc | 4 +- storage/tokudb/hatoku_cmp.cc | 1 + storage/tokudb/hatoku_defines.h | 28 +- storage/tokudb/hatoku_hton.cc | 52 +- storage/tokudb/hatoku_hton.h | 5 +- storage/tokudb/mysql-test/tokudb/disabled.def | 1 + .../tokudb/r/card_scale_percent.result | 11 +- .../r/locking-read-repeatable-read-1.result | 13 + .../r/locking-read-repeatable-read-2.result | 17 + .../tokudb/r/nonflushing_analyze_debug.result | 19 + .../mysql-test/tokudb/r/row_format.result | 39 ++ .../tokudb/t/card_scale_percent.test | 6 +- .../t/locking-read-repeatable-read-1.test | 23 + .../t/locking-read-repeatable-read-2.test | 29 + .../tokudb/t/nonflushing_analyze_debug.test | 10 + .../mysql-test/tokudb/t/row_format.test | 21 + .../r/db756_card_part_hash_1_pick.result | 2 +- .../mysql-test/tokudb_parts/disabled.def | 1 + .../r/nonflushing_analyze_debug.result | 50 ++ .../t/nonflushing_analyze_debug.test | 29 + .../tokudb_perfschema/r/crash_tokudb.result | 30 ++ .../r/start_server_tokudb.result | 114 ++++ .../tokudb_perfschema/t/crash_tokudb.test | 36 ++ .../t/start_server_tokudb.test | 10 + .../mysql-test/tokudb_perfschema/t/suite.opt | 1 + storage/tokudb/tokudb_background.cc | 30 +- storage/tokudb/tokudb_background.h | 4 +- storage/tokudb/tokudb_information_schema.cc | 14 +- storage/tokudb/tokudb_thread.cc | 1 + storage/tokudb/tokudb_thread.h | 298 +++++----- storage/xtradb/api/api0api.cc | 2 +- storage/xtradb/btr/btr0cur.cc | 41 +- storage/xtradb/btr/btr0pcur.cc | 3 +- storage/xtradb/buf/buf0buddy.cc | 3 +- storage/xtradb/buf/buf0lru.cc | 140 ++--- storage/xtradb/buf/buf0rea.cc | 35 +- storage/xtradb/data/data0type.cc | 10 +- storage/xtradb/dict/dict0dict.cc | 1 + storage/xtradb/dict/dict0mem.cc | 5 +- storage/xtradb/dict/dict0stats_bg.cc | 2 +- storage/xtradb/fil/fil0fil.cc | 22 +- storage/xtradb/fts/fts0fts.cc | 92 +++- storage/xtradb/fts/fts0opt.cc | 11 +- storage/xtradb/fts/fts0que.cc | 6 +- storage/xtradb/handler/ha_innodb.cc | 13 +- storage/xtradb/handler/handler0alter.cc | 54 +- storage/xtradb/ibuf/ibuf0ibuf.cc | 4 +- storage/xtradb/include/btr0cur.h | 12 +- storage/xtradb/include/data0type.h | 51 +- storage/xtradb/include/data0type.ic | 56 +- storage/xtradb/include/dict0dict.h | 14 +- storage/xtradb/include/dict0dict.ic | 57 +- storage/xtradb/include/dict0mem.h | 15 +- storage/xtradb/include/dict0stats_bg.h | 4 +- storage/xtradb/include/fil0fil.h | 26 +- storage/xtradb/include/log0crypt.h | 6 +- storage/xtradb/include/log0online.h | 6 +- storage/xtradb/include/mem0mem.ic | 12 +- storage/xtradb/include/mtr0mtr.h | 16 +- storage/xtradb/include/mtr0mtr.ic | 6 +- storage/xtradb/include/os0file.h | 35 +- storage/xtradb/include/os0file.ic | 5 +- storage/xtradb/include/rem0rec.ic | 3 +- storage/xtradb/include/row0mysql.h | 12 - storage/xtradb/include/srv0srv.h | 10 +- storage/xtradb/include/trx0rec.h | 5 +- storage/xtradb/include/trx0undo.h | 13 +- storage/xtradb/include/univ.i | 10 +- storage/xtradb/lock/lock0lock.cc | 4 +- storage/xtradb/lock/lock0wait.cc | 58 ++ storage/xtradb/log/log0crypt.cc | 54 +- storage/xtradb/log/log0log.cc | 7 +- storage/xtradb/log/log0online.cc | 6 +- storage/xtradb/mem/mem0mem.cc | 13 +- storage/xtradb/os/os0file.cc | 146 ++++- storage/xtradb/page/page0page.cc | 2 +- storage/xtradb/rem/rem0rec.cc | 19 +- storage/xtradb/row/row0ext.cc | 3 +- storage/xtradb/row/row0ftsort.cc | 22 +- storage/xtradb/row/row0import.cc | 9 +- storage/xtradb/row/row0ins.cc | 33 +- storage/xtradb/row/row0log.cc | 16 +- storage/xtradb/row/row0merge.cc | 25 +- storage/xtradb/row/row0mysql.cc | 25 +- storage/xtradb/row/row0purge.cc | 4 +- storage/xtradb/row/row0quiesce.cc | 8 +- storage/xtradb/row/row0row.cc | 9 +- storage/xtradb/row/row0sel.cc | 31 +- storage/xtradb/row/row0umod.cc | 14 +- storage/xtradb/row/row0upd.cc | 15 +- storage/xtradb/srv/srv0srv.cc | 10 +- storage/xtradb/trx/trx0purge.cc | 26 - storage/xtradb/trx/trx0rec.cc | 22 +- storage/xtradb/trx/trx0roll.cc | 9 +- storage/xtradb/trx/trx0undo.cc | 10 +- strings/CMakeLists.txt | 3 +- support-files/mariadb.service.in | 1 - support-files/mariadb@.service.in | 1 - support-files/mysql.server.sh | 46 +- unittest/mysys/base64-t.c | 3 + win/packaging/WixUIBannerBmp.jpg | Bin 3703 -> 3856 bytes win/packaging/WixUIDialogBmp.jpg | Bin 12411 -> 9745 bytes 549 files changed, 12024 insertions(+), 4223 deletions(-) create mode 100644 mysql-test/r/mdev_14586.result create mode 100644 mysql-test/suite/federated/net_thd_crash-12951.result create mode 100644 mysql-test/suite/federated/net_thd_crash-12951.test create mode 100644 mysql-test/suite/galera/r/galera_gtid_slave.result create mode 100644 mysql-test/suite/galera/r/galera_gtid_slave_sst_rsync.result create mode 100644 mysql-test/suite/galera/t/galera_gtid_slave.cnf create mode 100644 mysql-test/suite/galera/t/galera_gtid_slave.test create mode 100644 mysql-test/suite/galera/t/galera_gtid_slave_sst_rsync.cnf create mode 100644 mysql-test/suite/galera/t/galera_gtid_slave_sst_rsync.test create mode 100644 mysql-test/suite/galera_3nodes/galera_2x3nodes.cnf create mode 100644 mysql-test/suite/galera_3nodes/include/have_ipv6.inc create mode 100644 mysql-test/suite/galera_3nodes/r/galera_gtid_2_cluster.result create mode 100644 mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.cnf create mode 100644 mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.test create mode 100644 mysql-test/suite/innodb/r/innodb-lru-force-no-free-page.result create mode 100644 mysql-test/suite/innodb/t/innodb-lru-force-no-free-page.test create mode 100644 mysql-test/suite/maria/repair.result create mode 100644 mysql-test/suite/maria/repair.test create mode 100644 mysql-test/suite/mariabackup/huge_lsn.opt create mode 100644 mysql-test/suite/mariabackup/huge_lsn.result create mode 100644 mysql-test/suite/mariabackup/huge_lsn.test create mode 100644 mysql-test/suite/mariabackup/missing_ibd.result create mode 100644 mysql-test/suite/mariabackup/missing_ibd.test create mode 100644 mysql-test/suite/sys_vars/r/innodb_print_lock_wait_timeout_info_basic.result create mode 100644 mysql-test/suite/sys_vars/t/innodb_print_lock_wait_timeout_info_basic.test create mode 100644 mysql-test/t/mdev_14586.test rename storage/connect/{inihandl.c => inihandl.cpp} (97%) create mode 100644 storage/tokudb/PerconaFT/portability/toku_instr_mysql.cc create mode 100644 storage/tokudb/PerconaFT/portability/toku_instr_mysql.h create mode 100644 storage/tokudb/PerconaFT/portability/toku_instrumentation.h create mode 100644 storage/tokudb/PerconaFT/src/tests/test_1672532.cc create mode 100644 storage/tokudb/mysql-test/tokudb/r/locking-read-repeatable-read-1.result create mode 100644 storage/tokudb/mysql-test/tokudb/r/locking-read-repeatable-read-2.result create mode 100644 storage/tokudb/mysql-test/tokudb/r/nonflushing_analyze_debug.result create mode 100644 storage/tokudb/mysql-test/tokudb/t/locking-read-repeatable-read-1.test create mode 100644 storage/tokudb/mysql-test/tokudb/t/locking-read-repeatable-read-2.test create mode 100644 storage/tokudb/mysql-test/tokudb/t/nonflushing_analyze_debug.test create mode 100644 storage/tokudb/mysql-test/tokudb_parts/r/nonflushing_analyze_debug.result create mode 100644 storage/tokudb/mysql-test/tokudb_parts/t/nonflushing_analyze_debug.test create mode 100644 storage/tokudb/mysql-test/tokudb_perfschema/r/crash_tokudb.result create mode 100644 storage/tokudb/mysql-test/tokudb_perfschema/r/start_server_tokudb.result create mode 100644 storage/tokudb/mysql-test/tokudb_perfschema/t/crash_tokudb.test create mode 100644 storage/tokudb/mysql-test/tokudb_perfschema/t/start_server_tokudb.test create mode 100644 storage/tokudb/mysql-test/tokudb_perfschema/t/suite.opt diff --git a/CMakeLists.txt b/CMakeLists.txt index a3865495..b4de70a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,9 +56,9 @@ ENDIF() SET(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel") -# MAX_INDEXES - Set the maximum number of indexes per table, default 64U +# MAX_INDEXES - Set the maximum number of indexes per table, default 64 IF (NOT MAX_INDEXES) - SET(MAX_INDEXES 64U) + SET(MAX_INDEXES 64) ENDIF(NOT MAX_INDEXES) IF (${MAX_INDEXES} GREATER 128) diff --git a/CREDITS b/CREDITS index 6288c2cd..7572f6f5 100644 --- a/CREDITS +++ b/CREDITS @@ -3,8 +3,9 @@ organization registered in the USA. The current main sponsors of the MariaDB Foundation are: -Alibaba Cloud https://intl.aliyun.com (2017) +Alibaba Cloud https://www.alibabacloud.com/ (2017) Booking.com https://www.booking.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) diff --git a/Docs/INFO_SRC b/Docs/INFO_SRC index 3dcb9a5d..bd70a3ac 100644 --- a/Docs/INFO_SRC +++ b/Docs/INFO_SRC @@ -1,8 +1,8 @@ -commit: 461cf3e5a3c2d346d75b1407b285f8daf9d01f67 -date: 2017-12-21 17:40:01 +0200 -build-date: 2017-12-21 15:48:56 +0000 -short: 461cf3e +commit: aba15b864af664276261dcbbdaef35268d407af1 +date: 2018-02-04 04:28:14 +0200 +build-date: 2018-02-04 02:30:32 +0000 +short: aba15b8 branch: HEAD -MariaDB source 10.1.30 +MariaDB source 10.1.31 diff --git a/VERSION b/VERSION index 466fdaeb..244d28b6 100644 --- a/VERSION +++ b/VERSION @@ -1,3 +1,3 @@ MYSQL_VERSION_MAJOR=10 MYSQL_VERSION_MINOR=1 -MYSQL_VERSION_PATCH=30 +MYSQL_VERSION_PATCH=31 diff --git a/client/mysql.cc b/client/mysql.cc index 977085eb..7973c3c7 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -1140,6 +1140,7 @@ int main(int argc,char *argv[]) current_prompt = my_strdup(default_prompt,MYF(MY_WME)); prompt_counter=0; aborted= 0; + sf_leaking_memory= 1; /* no memory leak reports yet */ outfile[0]=0; // no (default) outfile strmov(pager, "stdout"); // the default, if --pager wasn't given @@ -1200,6 +1201,7 @@ int main(int argc,char *argv[]) my_end(0); exit(1); } + sf_leaking_memory= 0; glob_buffer.realloc(512); completion_hash_init(&ht, 128); init_alloc_root(&hash_mem_root, 16384, 0, MYF(0)); @@ -1795,10 +1797,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), #ifndef EMBEDDED_LIBRARY if ((opt_protocol= find_type_with_warning(argument, &sql_protocol_typelib, opt->name)) <= 0) - { - sf_leaking_memory= 1; /* no memory leak reports here */ exit(1); - } #endif break; case OPT_SERVER_ARG: @@ -4593,8 +4592,11 @@ static char *get_arg(char *line, get_arg_mode mode) } for (start=ptr ; *ptr; ptr++) { - if ((*ptr == '\\' && ptr[1]) || // escaped character - (!short_cmd && qtype && *ptr == qtype && ptr[1] == qtype)) // quote + /* if short_cmd use historical rules (only backslash) otherwise SQL rules */ + if (short_cmd + ? (*ptr == '\\' && ptr[1]) // escaped character + : (*ptr == '\\' && ptr[1] && qtype != '`') || // escaped character + (qtype && *ptr == qtype && ptr[1] == qtype)) // quote { // Remove (or skip) the backslash (or a second quote) if (mode != CHECK) diff --git a/client/mysqltest.cc b/client/mysqltest.cc index 2200462b..844a2d7b 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -1523,7 +1523,6 @@ static void cleanup_and_exit(int exit_code) } } - sf_leaking_memory= 0; /* all memory should be freed by now */ exit(exit_code); } @@ -7294,10 +7293,7 @@ get_one_option(int optid, const struct my_option *opt, char *argument) #ifndef EMBEDDED_LIBRARY if ((opt_protocol= find_type_with_warning(argument, &sql_protocol_typelib, opt->name)) <= 0) - { - sf_leaking_memory= 1; /* no memory leak reports here */ exit(1); - } #endif break; case '?': diff --git a/cmake/build_configurations/mysql_release.cmake b/cmake/build_configurations/mysql_release.cmake index c07de46f..04860a40 100644 --- a/cmake/build_configurations/mysql_release.cmake +++ b/cmake/build_configurations/mysql_release.cmake @@ -1,4 +1,5 @@ # Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 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 diff --git a/config.h.cmake b/config.h.cmake index 8ef512c7..b1a9d813 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -150,6 +150,7 @@ #cmakedefine HAVE_CUSERID 1 #cmakedefine HAVE_CXX_NEW 1 #cmakedefine HAVE_DIRECTIO 1 +#cmakedefine HAVE_DLADDR 1 #cmakedefine HAVE_DLERROR 1 #cmakedefine HAVE_DLOPEN 1 #cmakedefine HAVE_DOPRNT 1 diff --git a/configure.cmake b/configure.cmake index 0057c7fb..a1cddbb3 100644 --- a/configure.cmake +++ b/configure.cmake @@ -344,6 +344,7 @@ CHECK_FUNCTION_EXISTS (ftruncate HAVE_FTRUNCATE) CHECK_FUNCTION_EXISTS (getline HAVE_GETLINE) CHECK_FUNCTION_EXISTS (compress HAVE_COMPRESS) CHECK_FUNCTION_EXISTS (crypt HAVE_CRYPT) +CHECK_FUNCTION_EXISTS (dladdr HAVE_DLADDR) CHECK_FUNCTION_EXISTS (dlerror HAVE_DLERROR) CHECK_FUNCTION_EXISTS (dlopen HAVE_DLOPEN) CHECK_FUNCTION_EXISTS (fchmod HAVE_FCHMOD) @@ -407,7 +408,6 @@ CHECK_FUNCTION_EXISTS (pthread_sigmask HAVE_PTHREAD_SIGMASK) CHECK_FUNCTION_EXISTS (pthread_threadmask HAVE_PTHREAD_THREADMASK) CHECK_FUNCTION_EXISTS (pthread_yield_np HAVE_PTHREAD_YIELD_NP) CHECK_FUNCTION_EXISTS (putenv HAVE_PUTENV) -CHECK_FUNCTION_EXISTS (readdir_r HAVE_READDIR_R) CHECK_FUNCTION_EXISTS (readlink HAVE_READLINK) CHECK_FUNCTION_EXISTS (re_comp HAVE_RE_COMP) CHECK_FUNCTION_EXISTS (regcomp HAVE_REGCOMP) @@ -465,6 +465,16 @@ IF(HAVE_SYS_EVENT_H) CHECK_FUNCTION_EXISTS (kqueue HAVE_KQUEUE) ENDIF() +# readdir_r might exist, but be marked deprecated +SET(CMAKE_REQUIRED_FLAGS -Werror) +CHECK_CXX_SOURCE_COMPILES( +"#include +int main() { + readdir_r(0,0,0); + return 0; + }" HAVE_READDIR_R) +SET(CMAKE_REQUIRED_FLAGS) + #-------------------------------------------------------------------- # Support for WL#2373 (Use cycle counter for timing) #-------------------------------------------------------------------- diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index 437fc4aa..2228e542 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -1183,10 +1183,10 @@ debug_sync_point(const char *name) } static const char *xb_client_default_groups[]= - { "xtrabackup", "client", 0, 0, 0 }; + { "xtrabackup", "mariabackup", "client", 0, 0, 0 }; static const char *xb_server_default_groups[]= - { "xtrabackup", "mysqld", 0, 0, 0 }; + { "xtrabackup", "mariabackup", "mysqld", 0, 0, 0 }; static void print_version(void) { @@ -1213,7 +1213,7 @@ GNU General Public License for more details.\n\ \n\ You can download full text of the license on http://www.gnu.org/licenses/gpl-2.0.txt\n"); - printf("Usage: [%s [--defaults-file=#] --backup | %s [--defaults-file=#] --prepare] [OPTIONS]\n",my_progname,my_progname); + printf("Usage: %s [--defaults-file=#] [--backup | --prepare | --copy-back | --move-back] [OPTIONS]\n",my_progname); print_defaults("my", xb_server_default_groups); my_print_help(xb_client_options); my_print_help(xb_server_options); @@ -2698,7 +2698,7 @@ xtrabackup_scan_log_recs( if (srv_encrypt_log) { log_encrypt_before_write(scanned_checkpoint_no, - log_sys->buf, write_size); + log_sys->buf, start_lsn, write_size); } if (ds_write(dst_log_file, log_sys->buf, write_size)) { @@ -4246,16 +4246,11 @@ xtrabackup_init_temp_log(void) ib_int64_t file_size; - lsn_t max_no; - lsn_t max_lsn; - lsn_t checkpoint_no; + lsn_t max_no = 0; + lsn_t max_lsn = 0; ulint fold; - bool checkpoint_found; - - max_no = 0; - if (!log_buf) { goto error; } @@ -4354,35 +4349,29 @@ xtrabackup_init_temp_log(void) // ' ', 4); } - checkpoint_found = false; - /* read last checkpoint lsn */ for (field = LOG_CHECKPOINT_1; field <= LOG_CHECKPOINT_2; field += LOG_CHECKPOINT_2 - LOG_CHECKPOINT_1) { if (!recv_check_cp_is_consistent(const_cast (log_buf + field))) - goto not_consistent; + continue; - checkpoint_no = mach_read_from_8(log_buf + field + - LOG_CHECKPOINT_NO); + lsn_t checkpoint_no = mach_read_from_8(log_buf + field + + LOG_CHECKPOINT_NO); if (checkpoint_no >= max_no) { max_no = checkpoint_no; max_lsn = mach_read_from_8(log_buf + field + LOG_CHECKPOINT_LSN); - checkpoint_found = true; } -not_consistent: - ; } - if (!checkpoint_found) { + if (!max_lsn) { msg("mariabackup: No valid checkpoint found.\n"); goto error; } - /* It seems to be needed to overwrite the both checkpoint area. */ mach_write_to_8(log_buf + LOG_CHECKPOINT_1 + LOG_CHECKPOINT_LSN, max_lsn); @@ -5459,7 +5448,12 @@ xb_export_cfg_write_table( mach_write_to_4(ptr, col->len); ptr += sizeof(ib_uint32_t); - mach_write_to_4(ptr, col->mbminmaxlen); + /* FIXME: This will not work if mbminlen>4. + This field is also redundant, because the lengths + are a property of the character set encoding, which + in turn is encodedin prtype above. */ + mach_write_to_4(ptr, col->mbmaxlen * 5 + col->mbminlen); + ptr += sizeof(ib_uint32_t); mach_write_to_4(ptr, col->ind); @@ -6165,9 +6159,19 @@ xb_init() return(false); } - if (opt_rsync && xtrabackup_stream_fmt) { - msg("Error: --rsync doesn't work with --stream\n"); - return(false); + if (xtrabackup_backup && opt_rsync) + { + if (xtrabackup_stream_fmt) + { + msg("Error: --rsync doesn't work with --stream\n"); + return(false); + } + bool have_rsync = IF_WIN(false, (system("rsync --version > /dev/null 2>&1") == 0)); + if (!have_rsync) + { + msg("Error: rsync executable not found, cannot run backup with --rsync\n"); + return false; + } } n_mixed_options = 0; diff --git a/include/ma_dyncol.h b/include/ma_dyncol.h index 300474e0..4f05b425 100644 --- a/include/ma_dyncol.h +++ b/include/ma_dyncol.h @@ -69,6 +69,9 @@ typedef struct st_mysql_lex_string LEX_STRING; #define DYNCOL_UTF (&my_charset_utf8_general_ci) #endif +/* escape json strings */ +#define DYNCOL_JSON_ESC ((char)1) + enum enum_dyncol_func_result { ER_DYNCOL_OK= 0, diff --git a/include/my_compare.h b/include/my_compare.h index 3440d9ef..1c50ff93 100644 --- a/include/my_compare.h +++ b/include/my_compare.h @@ -91,17 +91,19 @@ typedef struct st_HA_KEYSEG /* Key-portion */ #define size_to_store_key_length(length) ((length) < 255 ? 1 : 3) -#define get_rec_bits(bit_ptr, bit_ofs, bit_len) \ - (((((uint16) (bit_ptr)[1] << 8) | (uint16) (bit_ptr)[0]) >> (bit_ofs)) & \ - ((1 << (bit_len)) - 1)) - -#define set_rec_bits(bits, bit_ptr, bit_ofs, bit_len) \ -{ \ - (bit_ptr)[0]= ((bit_ptr)[0] & ~(((1 << (bit_len)) - 1) << (bit_ofs))) | \ - ((bits) << (bit_ofs)); \ - if ((bit_ofs) + (bit_len) > 8) \ - (bit_ptr)[1]= ((bit_ptr)[1] & ~((1 << ((bit_len) - 8 + (bit_ofs))) - 1)) | \ - ((bits) >> (8 - (bit_ofs))); \ +static inline uint16 get_rec_bits(const uchar *ptr, uchar ofs, uint len) +{ + uint16 val= ptr[0]; + if (ofs + len > 8) + val|= (uint16)(ptr[1]) << 8; + return (val >> ofs) & ((1 << len) - 1); +} + +static inline void set_rec_bits(uint16 bits, uchar *ptr, uchar ofs, uint len) +{ + ptr[0]= (ptr[0] & ~(((1 << len) - 1) << ofs)) | (bits << ofs); + if (ofs + len > 8) + ptr[1]= (ptr[1] & ~((1 << (len - 8 + ofs)) - 1)) | (bits >> (8 - ofs)); } #define clr_rec_bits(bit_ptr, bit_ofs, bit_len) \ diff --git a/include/my_global.h b/include/my_global.h index b9284b99..acc54398 100644 --- a/include/my_global.h +++ b/include/my_global.h @@ -1091,11 +1091,19 @@ static inline char *dlerror(void) #ifndef HAVE_DLERROR #define dlerror() "" #endif +#ifndef HAVE_DLADDR +#define dladdr(A, B) 0 +/* Dummy definition in case we're missing dladdr() */ +typedef struct { const char *dli_fname, dli_fbase; } Dl_info; +#endif #else #define dlerror() "No support for dynamic loading (static build?)" #define dlopen(A,B) 0 #define dlsym(A,B) 0 #define dlclose(A) 0 +#define dladdr(A, B) 0 +/* Dummy definition in case we're missing dladdr() */ +typedef struct { const char *dli_fname, dli_fbase; } Dl_info; #endif /* diff --git a/include/my_valgrind.h b/include/my_valgrind.h index 3fb93350..e3aa11ee 100644 --- a/include/my_valgrind.h +++ b/include/my_valgrind.h @@ -13,6 +13,14 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ +/* clang -> gcc */ +#ifndef __has_feature +# define __has_feature(x) 0 +#endif +#if __has_feature(address_sanitizer) +# define __SANITIZE_ADDRESS__ 1 +#endif + #ifdef HAVE_valgrind #define IF_VALGRIND(A,B) A #else @@ -25,7 +33,13 @@ # define MEM_NOACCESS(a,len) VALGRIND_MAKE_MEM_NOACCESS(a,len) # define MEM_CHECK_ADDRESSABLE(a,len) VALGRIND_CHECK_MEM_IS_ADDRESSABLE(a,len) # define MEM_CHECK_DEFINED(a,len) VALGRIND_CHECK_MEM_IS_DEFINED(a,len) -#else /* HAVE_VALGRIND */ +#elif defined(__SANITIZE_ADDRESS__) +# include +# 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) +# define MEM_CHECK_DEFINED(a,len) ((void) 0) +#else # define MEM_UNDEFINED(a,len) ((void) 0) # define MEM_NOACCESS(a,len) ((void) 0) # define MEM_CHECK_ADDRESSABLE(a,len) ((void) 0) @@ -33,11 +47,9 @@ #endif /* HAVE_VALGRIND */ #ifndef DBUG_OFF -#define TRASH_FILL(A,B,C) do { const size_t trash_tmp= (B); memset(A, C, trash_tmp); MEM_UNDEFINED(A, trash_tmp); } while (0) +#define TRASH_FILL(A,B,C) do { const size_t trash_tmp= (B); MEM_UNDEFINED(A, trash_tmp); memset(A, C, trash_tmp); } while (0) #else -#define TRASH_FILL(A,B,C) do{ const size_t trash_tmp __attribute__((unused)) = (B) ; MEM_CHECK_ADDRESSABLE(A,trash_tmp);MEM_UNDEFINED(A,trash_tmp);} while (0) +#define TRASH_FILL(A,B,C) do { const size_t trash_tmp __attribute__((unused))= (B); MEM_UNDEFINED(A,trash_tmp); } while (0) #endif -#define TRASH_ALLOC(A,B) TRASH_FILL(A,B,0xA5) -#define TRASH_FREE(A,B) TRASH_FILL(A,B,0x8F) -#define TRASH(A,B) TRASH_FREE(A,B) - +#define TRASH_ALLOC(A,B) do { TRASH_FILL(A,B,0xA5); MEM_UNDEFINED(A,B); } while(0) +#define TRASH_FREE(A,B) do { TRASH_FILL(A,B,0x8F); MEM_NOACCESS(A,B); } while(0) diff --git a/include/welcome_copyright_notice.h b/include/welcome_copyright_notice.h index cd7cd669..1b4b17cf 100644 --- a/include/welcome_copyright_notice.h +++ b/include/welcome_copyright_notice.h @@ -17,7 +17,7 @@ #ifndef _welcome_copyright_notice_h_ #define _welcome_copyright_notice_h_ -#define COPYRIGHT_NOTICE_CURRENT_YEAR "2017" +#define COPYRIGHT_NOTICE_CURRENT_YEAR "2018" /* This define specifies copyright notice which is displayed by every MySQL diff --git a/libmysql/CMakeLists.txt b/libmysql/CMakeLists.txt index acbd80b4..001bd884 100644 --- a/libmysql/CMakeLists.txt +++ b/libmysql/CMakeLists.txt @@ -500,14 +500,14 @@ IF(NOT DISABLE_SHARED) OUTPUT_NAME mysqlclient VERSION "${OS_SHARED_LIB_VERSION}" SOVERSION "${SHARED_LIB_MAJOR_VERSION}") - IF(LINK_FLAG_NO_UNDEFINED OR VERSION_SCRIPT_LINK_FLAGS) + IF(VERSION_SCRIPT_LINK_FLAGS) GET_TARGET_PROPERTY(libmysql_link_flags libmysql LINK_FLAGS) IF(NOT libmysql_link_flags) # Avoid libmysql_link_flags-NOTFOUND SET(libmysql_link_flags) ENDIF() SET_TARGET_PROPERTIES(libmysql PROPERTIES LINK_FLAGS - "${libmysql_link_flags} ${LINK_FLAG_NO_UNDEFINED} ${VERSION_SCRIPT_LINK_FLAGS}") + "${libmysql_link_flags} ${VERSION_SCRIPT_LINK_FLAGS}") ENDIF() # clean direct output needs to be set several targets have the same name #(mysqlclient in this case) diff --git a/man/mysqladmin.1 b/man/mysqladmin.1 index d1fdfd9d..cfda6f1c 100644 --- a/man/mysqladmin.1 +++ b/man/mysqladmin.1 @@ -1,6 +1,6 @@ '\" t .\" -.TH "\FBMYSQLADMIN\FR" "1" "14/12/2015" "MariaDB 10\&.1" "MariaDB Database System" +.TH "\FBMYSQLADMIN\FR" "1" "28 December 2017" "MariaDB 10\&.1" "MariaDB Database System" .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- @@ -106,6 +106,97 @@ Display the server status variables and their values\&. .sp -1 .IP \(bu 2.3 .\} +flush\-all\-statistics +.sp +Flush all statistics tables\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +flush\-all\-status +.sp +Flush all status and statistics\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +flush\-binary\-log +.sp +Flush the binary log\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +flush\-client\-statistics +.sp +Flush client statistics\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +flush\-engine\-log +.sp +Flush engine log\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +flush\-error\-log +.sp +Flush error log\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +flush\-general\-log +.sp +Flush general query log\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} flush\-hosts .sp Flush all information in the host cache\&. @@ -119,6 +210,19 @@ Flush all information in the host cache\&. .sp -1 .IP \(bu 2.3 .\} +flush\-index\-statistics +.sp +Flush index statistics\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} flush\-logs .sp Flush all logs\&. @@ -146,6 +250,32 @@ reload)\&. .sp -1 .IP \(bu 2.3 .\} +flush\-relay\-log +.sp +Flush relay log\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +flush\-slow\-log +.sp +Flush slow query log\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} flush\-status .sp Clear status variables\&. @@ -159,6 +289,19 @@ Clear status variables\&. .sp -1 .IP \(bu 2.3 .\} +flush\-table\-statistics +.sp +Flush table statistics\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} flush\-tables .sp Flush all tables\&. @@ -185,6 +328,19 @@ Flush the thread cache\&. .sp -1 .IP \(bu 2.3 .\} +flush\-user\-resources +.sp +Flush user resources\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} kill \fIid\fR,\fIid\fR,\&.\&.\&. .sp Kill server threads\&. If multiple thread ID values are given, there must be no spaces in the list\&. @@ -344,6 +500,19 @@ Stop the server\&. .sp -1 .IP \(bu 2.3 .\} +start\-all\-slaves +.sp +Start all slaves\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} start\-slave .sp Start replication on a slave server\&. @@ -370,6 +539,19 @@ Display a short server status message\&. .sp -1 .IP \(bu 2.3 .\} +stop\-all\-slaves +.sp +Stop all slaves\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} stop\-slave .sp Stop replication on a slave server\&. @@ -821,7 +1003,7 @@ Connect to the MariaDB server on the given host\&. \fB\-\-local\fR, \fB\-l\fR .sp -Suppress the SQL command(s) from being written to the binary log by enabling sql_log_bin=0 for the session\&. +Suppress the SQL command(s) from being written to the binary log by using FLUSH LOCAL or enabling sql_log_bin=0 for the session\&. .RE .sp .RS 4 diff --git a/mysql-test/CMakeLists.txt b/mysql-test/CMakeLists.txt index 1c7cfaf8..c03f0c35 100644 --- a/mysql-test/CMakeLists.txt +++ b/mysql-test/CMakeLists.txt @@ -1,4 +1,5 @@ # Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, 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 diff --git a/mysql-test/include/truncate_file.inc b/mysql-test/include/truncate_file.inc index 2326d6c0..fe88cb05 100644 --- a/mysql-test/include/truncate_file.inc +++ b/mysql-test/include/truncate_file.inc @@ -1,16 +1,11 @@ # truncate a giving file, all contents of the file are be cleared -if (!$file) +if (!$TRUNCATE_FILE) { - --echo Please assign a file name to $file!! - exit; + die TRUNCATE_FILE is not set; } -let TRUNCATE_FILE= $file; - perl; -use Env; -Env::import('TRUNCATE_FILE'); -open FILE, '>', $TRUNCATE_FILE || die "Can not open file $file"; +open FILE, '>', $ENV{TRUNCATE_FILE} or die "open(>$ENV{TRUNCATE_FILE}): $!"; close FILE; EOF diff --git a/mysql-test/lib/My/SafeProcess.pm b/mysql-test/lib/My/SafeProcess.pm index f3ee772c..29809922 100644 --- a/mysql-test/lib/My/SafeProcess.pm +++ b/mysql-test/lib/My/SafeProcess.pm @@ -84,7 +84,7 @@ sub is_child { } -my @safe_process_cmd; +our @safe_process_cmd; my $safe_kill; my $bindir; diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index 3b1bb0b5..eaec51b8 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -1589,6 +1589,7 @@ sub command_line_setup { $opt_manual_debug || $opt_dbx || $opt_client_dbx || $opt_manual_dbx || $opt_debugger || $opt_client_debugger ) { + $ENV{ASAN_OPTIONS}= 'abort_on_error=1:'.($ENV{ASAN_OPTIONS} || ''); if ( using_extern() ) { mtr_error("Can't use --extern when using debugger"); @@ -3198,6 +3199,9 @@ sub mysql_install_db { mtr_appendfile_to_file("$sql_dir/mysql_performance_tables.sql", $bootstrap_sql_file); + # Don't install anonymous users + mtr_tofile($bootstrap_sql_file, "set \@skip_auth_anonymous=1;\n"); + # Add the mysql system tables initial data # for a production system mtr_appendfile_to_file("$sql_dir/mysql_system_tables_data.sql", @@ -3232,10 +3236,6 @@ sub mysql_install_db { sql_to_bootstrap($text)); } - # Remove anonymous users - mtr_tofile($bootstrap_sql_file, - "DELETE FROM mysql.user where user= '';\n"); - # Create mtr database mtr_tofile($bootstrap_sql_file, "CREATE DATABASE mtr CHARSET=latin1;\n"); @@ -5042,7 +5042,7 @@ sub mysqld_start ($$) { my $args; mtr_init_args(\$args); - if ( $opt_valgrind_mysqld ) + if ( $opt_valgrind_mysqld and not $opt_gdb and not $opt_manual_gdb ) { valgrind_arguments($args, \$exe); } @@ -5645,11 +5645,20 @@ sub gdb_arguments { unlink($gdb_init_file); # Put $args into a single string - my $str= join(" ", @$$args); $input = $input ? "< $input" : ""; - # write init file for mysqld or client - mtr_tofile($gdb_init_file, "set args $str $input\n"); + if ($type ne 'client' and $opt_valgrind_mysqld) { + my $v = $$exe; + my $vargs = []; + valgrind_arguments($vargs, \$v); + mtr_tofile($gdb_init_file, < ALL NULL NULL NULL NULL 2 +1 PRIMARY hash_ALL NULL #hash#$hj 3075 func 2 Using where; Using join buffer (flat, BNLH join) +1 PRIMARY t2 eq_ref PRIMARY PRIMARY 4 v3.d 1 Using index +3 DERIVED t3 ALL NULL NULL NULL NULL 2 +2 DERIVED t1 ALL NULL NULL NULL NULL 2 +SELECT * FROM v1, t2, v3 WHERE a = c AND b = d; +a b c d +DROP VIEW v1, v3; +DROP TABLE t1, t2, t3; +# +# MDEV-14786: Server crashes in Item_cond::transform on 2nd +# execution of SP querying from a view +# +create table t1 (i int, row_start timestamp(6) not null default now(), +row_end timestamp(6) not null default '2030-01-01 0:0:0'); +create view v1 as select i from t1 where i < 5 and (row_end = +TIMESTAMP'2030-01-01 0:0:0' or row_end is null); +create procedure pr(x int) select i from v1; +call pr(1); +i +call pr(2); +i +drop procedure pr; +drop view v1; +drop table t1; # end of 5.5 # # Start of 10.1 tests diff --git a/mysql-test/r/dyncol.result b/mysql-test/r/dyncol.result index b0d28a81..81446da9 100644 --- a/mysql-test/r/dyncol.result +++ b/mysql-test/r/dyncol.result @@ -1873,5 +1873,15 @@ SELECT COLUMN_JSON(COLUMN_CREATE('a',1 AS DECIMAL,'b',1 AS DECIMAL)); COLUMN_JSON(COLUMN_CREATE('a',1 AS DECIMAL,'b',1 AS DECIMAL)) {"a":1,"b":1} # +# MDEV-7533: COLUMN_JSON() doesn't escape control characters +# in string values +# +SELECT COLUMN_JSON(COLUMN_CREATE('test','"\\\t\n\Z')) AS json; +json +{"test":"\"\\\u0009\u000A\u001A"} +SELECT COLUMN_JSON(COLUMN_CREATE('test','First line\nSecond line')) AS json; +json +{"test":"First line\u000ASecond line"} +# # end of 10.0 tests # diff --git a/mysql-test/r/fulltext.result b/mysql-test/r/fulltext.result index 8bf948e0..df484363 100644 --- a/mysql-test/r/fulltext.result +++ b/mysql-test/r/fulltext.result @@ -742,6 +742,26 @@ txt1 txt2 nnn2 x2 y2 ööö2 mmm2 ùùù2 DROP TABLE t1; # +# MDEV-14743: Server crashes in Item_func_match::init_search +# +CREATE TABLE t1 (f VARCHAR(8)); +INSERT INTO t1 VALUES ('foo'),('bar'); +SELECT 'foo' IN ( SELECT f FROM t1 GROUP BY MATCH(f) AGAINST ( 'qux' IN BOOLEAN MODE ) ); +'foo' IN ( SELECT f FROM t1 GROUP BY MATCH(f) AGAINST ( 'qux' IN BOOLEAN MODE ) ) +1 +SELECT 'foo' IN ( SELECT f FROM t1 GROUP BY MATCH(f) AGAINST ( 'qux' IN BOOLEAN MODE )) as f1, MATCH(f) AGAINST ( 'qux' IN BOOLEAN MODE ) as f2 from t1 ; +f1 f2 +1 0 +1 0 +explain extended +SELECT 'foo' IN ( SELECT f FROM t1 GROUP BY MATCH(f) AGAINST ( 'qux' IN BOOLEAN MODE )) as f1, MATCH(f) AGAINST ( 'qux' IN BOOLEAN MODE ) as f2 from t1 ; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 2 100.00 +2 SUBQUERY t1 ALL NULL NULL NULL NULL 2 100.00 Using where +Warnings: +Note 1003 select <'foo'>(('foo',(select `test`.`t1`.`f` from `test`.`t1` where (((convert('foo' using latin1)) = `test`.`t1`.`f`) or isnull(`test`.`t1`.`f`)) having (`test`.`t1`.`f`)))) AS `f1`,(match `test`.`t1`.`f` against ('qux' in boolean mode)) AS `f2` from `test`.`t1` +drop table t1; +# # End of 5.5 tests # CREATE TABLE t1 ( diff --git a/mysql-test/r/func_concat.result b/mysql-test/r/func_concat.result index b87ee7bf..9ab6f746 100644 --- a/mysql-test/r/func_concat.result +++ b/mysql-test/r/func_concat.result @@ -262,3 +262,9 @@ c2 abcdefghi-abcdefghi DROP TABLE t1; SET optimizer_switch=@save_optimizer_switch; +# +# MDEV-13790 UNHEX() of a somewhat complicated CONCAT() returns NULL +# +SELECT UNHEX(CONCAT('414C2', HEX(8 + ROUND(RAND()*7)), SUBSTR(SHA(UUID()),6,33),HEX(2+ROUND(RAND()*8)))) IS NULL AS c1; +c1 +0 diff --git a/mysql-test/r/func_isnull.result b/mysql-test/r/func_isnull.result index 2dbe3d03..88c5bfd5 100644 --- a/mysql-test/r/func_isnull.result +++ b/mysql-test/r/func_isnull.result @@ -24,3 +24,87 @@ INSERT INTO t1( id ) VALUES ( NULL ); SELECT t1.id FROM t1 WHERE (id is not null and id is null ); id DROP TABLE t1; +# End of 5.1 tests +# +# MDEV-14911: IS NULL for field from mergeable view +# +CREATE TABLE t1 (d1 datetime NOT NULL); +INSERT INTO t1 VALUES +('0000-00-00 00:00:00'), ('0000-00-00 00:00:00'), ('1979-09-03 20:49:36'); +SELECT * FROM t1; +d1 +0000-00-00 00:00:00 +0000-00-00 00:00:00 +1979-09-03 20:49:36 +SELECT * FROM t1 WHERE d1 IS NULL; +d1 +0000-00-00 00:00:00 +0000-00-00 00:00:00 +EXPLAIN EXTENDED SELECT * FROM t1 WHERE d1 IS NULL; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`d1` AS `d1` from `test`.`t1` where (`test`.`t1`.`d1` = 0) +SELECT count(*) FROM t1 WHERE d1 IS NULL; +count(*) +2 +CREATE VIEW v1 AS (SELECT * FROM t1); +SELECT * FROM v1; +d1 +0000-00-00 00:00:00 +0000-00-00 00:00:00 +1979-09-03 20:49:36 +SELECT * FROM v1 WHERE d1 IS NULL; +d1 +0000-00-00 00:00:00 +0000-00-00 00:00:00 +EXPLAIN EXTENDED SELECT * FROM v1 WHERE d1 IS NULL; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`d1` AS `d1` from `test`.`t1` where (`test`.`t1`.`d1` = 0) +SELECT count(*) FROM v1 WHERE d1 IS NULL; +count(*) +2 +SET @save_optimizer_switch=@@optimizer_switch; +SET SESSION optimizer_switch='derived_merge=off'; +SELECT count(*) FROM ( SELECT * FROM t1 ) AS a1 WHERE d1 IS NULL; +count(*) +2 +SET SESSION optimizer_switch='derived_merge=on'; +SELECT count(*) FROM ( SELECT * FROM t1 ) AS a1 WHERE d1 IS NULL; +count(*) +2 +SET optimizer_switch=@save_optimizer_switch; +CREATE TABLE t2 (d1 datetime NOT NULL); +INSERT INTO t2 VALUES +('1980-09-03 20:49:36'), ('0000-00-00 00:00:00'), ('1979-09-03 20:49:36'); +SELECT * FROM t2 LEFT JOIN t1 ON t2.d1=t1.d1 WHERE t1.d1 IS NULL; +d1 d1 +0000-00-00 00:00:00 0000-00-00 00:00:00 +0000-00-00 00:00:00 0000-00-00 00:00:00 +1980-09-03 20:49:36 NULL +EXPLAIN EXTENDED +SELECT * FROM t2 LEFT JOIN t1 ON t2.d1=t1.d1 WHERE t1.d1 IS NULL; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t2 ALL NULL NULL NULL NULL 3 100.00 +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where; Using join buffer (flat, BNL join) +Warnings: +Note 1003 select `test`.`t2`.`d1` AS `d1`,`test`.`t1`.`d1` AS `d1` from `test`.`t2` left join `test`.`t1` on((`test`.`t1`.`d1` = `test`.`t2`.`d1`)) where ((`test`.`t1`.`d1` = 0) or isnull(`test`.`t1`.`d1`)) +SELECT * FROM t2 LEFT JOIN v1 ON t2.d1=v1.d1 WHERE v1.d1 IS NULL; +d1 d1 +0000-00-00 00:00:00 0000-00-00 00:00:00 +0000-00-00 00:00:00 0000-00-00 00:00:00 +1980-09-03 20:49:36 NULL +EXPLAIN EXTENDED +SELECT * FROM t2 LEFT JOIN v1 ON t2.d1=v1.d1 WHERE v1.d1 IS NULL; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t2 ALL NULL NULL NULL NULL 3 100.00 +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where; Using join buffer (flat, BNL join) +Warnings: +Note 1003 select `test`.`t2`.`d1` AS `d1`,`test`.`t1`.`d1` AS `d1` from `test`.`t2` left join (`test`.`t1`) on((`test`.`t1`.`d1` = `test`.`t2`.`d1`)) where ((`test`.`t1`.`d1` = 0) or isnull(`test`.`t1`.`d1`)) +DROP VIEW v1; +DROP TABLE t1,t2; +# +# End of 5.5 tests +# diff --git a/mysql-test/r/join_cache.result b/mysql-test/r/join_cache.result index 7a11cb95..9eb1654e 100644 --- a/mysql-test/r/join_cache.result +++ b/mysql-test/r/join_cache.result @@ -5864,6 +5864,64 @@ set join_buffer_size=default; set join_cache_level = default; DROP TABLE t1,t2; # +# MDEV-14960: BNLH used for materialized semi-join +# +CREATE TABLE t1 (i1 int); +CREATE TABLE t2 (e1 int); +CREATE TABLE t4 (e1 int); +CREATE TABLE t5 (e1 int); +INSERT INTO t1 VALUES +(1),(2),(3),(4),(5),(6),(7),(8); +INSERT INTO t1 SELECT i1+8 FROM t1; +INSERT INTO t1 SELECT i1+16 FROM t1; +INSERT INTO t1 SELECT i1+32 FROM t1; +INSERT INTO t1 SELECT i1+64 FROM t1; +INSERT INTO t2 SELECT * FROM t1; +INSERT INTO t4 SELECT * FROM t1; +INSERT INTO t5 SELECT * FROM t1; +set @save_optimizer_switch= @@optimizer_switch; +SET join_cache_level = 6; +SET join_buffer_size=4096; +SET join_buffer_space_limit=4096; +SET optimizer_switch = 'join_cache_hashed=on,optimize_join_buffer_size=on'; +EXPLAIN SELECT * FROM t1 +WHERE +i1 < 10 AND +i1 IN +(SELECT i1 FROM +(SELECT (t4.e1) i1 FROM t4 +LEFT JOIN t5 ON t4.e1 = t5.e1 +LEFT JOIN (SELECT e1 FROM t2 ) AS d ON t4.e1 = d.e1) a); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 128 Using where +1 PRIMARY eq_ref distinct_key distinct_key 4 func 1 +2 MATERIALIZED t4 ALL NULL NULL NULL NULL 128 +2 MATERIALIZED t5 hash_ALL NULL #hash#$hj 5 test.t4.e1 128 Using where; Using join buffer (flat, BNLH join) +2 MATERIALIZED t2 hash_ALL NULL #hash#$hj 5 test.t4.e1 128 Using where; Using join buffer (incremental, BNLH join) +SELECT * FROM t1 +WHERE +i1 < 10 AND +i1 IN +(SELECT i1 FROM +(SELECT (t4.e1) i1 FROM t4 +LEFT JOIN t5 ON t4.e1 = t5.e1 +LEFT JOIN (SELECT e1 FROM t2 ) AS d ON t4.e1 = d.e1) a); +i1 +1 +2 +3 +4 +5 +6 +7 +8 +9 +SET join_cache_level = default; +SET join_buffer_size = default; +SET join_buffer_space_limit= default; +set optimizer_switch=@save_optimizer_switch; +DROP TABLE t1,t4,t5,t2; +# # MDEV-5123 Remove duplicated conditions pushed both to join_tab->select_cond and join_tab->cache_select->cond for blocked joins. # set join_cache_level=default; diff --git a/mysql-test/r/mdev_14586.result b/mysql-test/r/mdev_14586.result new file mode 100644 index 00000000..f6c2095d --- /dev/null +++ b/mysql-test/r/mdev_14586.result @@ -0,0 +1,44 @@ +create table t1(a bit(1), b int auto_increment ,id int, index(a,b)); +insert into t1 values(1,null,1); +insert into t1 values(1,null,2); +insert into t1 values(0,null,3); +insert into t1 values(0,null,4); +select a+0, b as auto_increment , id from t1 order by id; +a+0 auto_increment id +1 1 1 +1 2 2 +0 1 3 +0 2 4 +drop table t1; +create table t1(a int auto_increment, b bit(5) ,id int, index (b,a)); +insert into t1 values(null,b'1',1); +insert into t1 values(null,b'1',2); +insert into t1 values(null,b'11',3); +insert into t1 values(null,b'11',4); +select a as auto_increment, b+0, id from t1 order by id; +auto_increment b+0 id +1 1 1 +2 1 2 +1 3 3 +2 3 4 +drop table t1; +create table t1(a bit(1), b int auto_increment , c bit(1) , d bit(1), id int,index(a,c,b,d)); +insert into t1 values(1,null,1,1,1); +insert into t1 values(1,null,1,1,2); +insert into t1 values(0,null,1,1,3); +insert into t1 values(1,null,0,1,4); +select a+0, b as auto_increment, c+0, d+0, id from t1 order by id; +a+0 auto_increment c+0 d+0 id +1 1 1 1 1 +1 2 1 1 2 +0 1 1 1 3 +1 1 0 1 4 +drop table t1; +CREATE TABLE t1 (b BIT(1), pk INTEGER AUTO_INCREMENT PRIMARY KEY); +ALTER TABLE t1 ADD INDEX(b,pk); +INSERT INTO t1 VALUES (1,b'1'); +ALTER TABLE t1 DROP PRIMARY KEY; +select b+0, pk as auto_increment from t1; +b+0 auto_increment +1 1 +DROP TABLE t1; diff --git a/mysql-test/r/merge.result b/mysql-test/r/merge.result index 36e19649..97c39156 100644 --- a/mysql-test/r/merge.result +++ b/mysql-test/r/merge.result @@ -2167,7 +2167,7 @@ col1 int(10) NOT NULL ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(t1); insert into m1 (col1) values (1); insert into m1 (col1) values (1); -ERROR 23000: Duplicate entry '' for key '*UNKNOWN*' +ERROR 23000: Can't write; duplicate key in table 'm1' drop table m1, t1; # # Bug#45800 crash when replacing into a merge table and there is a duplicate @@ -2204,7 +2204,7 @@ CREATE TABLE m1 (c1 INT, c2 INT, UNIQUE (c1)) ENGINE=MRG_MyISAM INSERT_METHOD=LA INSERT INTO m1 VALUES (1,2); # insert the duplicate value into the merge table INSERT INTO m1 VALUES (3,2); -ERROR 23000: Duplicate entry '' for key '*UNKNOWN*' +ERROR 23000: Can't write; duplicate key in table 'm1' DROP TABLE m1,t1; # Try to define MERGE and MyISAM with keys on different columns CREATE TABLE t1 (c1 INT, c2 INT, UNIQUE (c1)); diff --git a/mysql-test/r/myisam_optimize.result b/mysql-test/r/myisam_optimize.result index ae0c5b59..36faba5e 100644 --- a/mysql-test/r/myisam_optimize.result +++ b/mysql-test/r/myisam_optimize.result @@ -22,3 +22,17 @@ a left(b,10) 4 CCCCCCCCCC drop table t1; set debug_sync='reset'; +# End of 5.5 tests +CREATE TABLE t1 (i INT) ENGINE=MyISAM; +INSERT t1 VALUES (1); +LOCK TABLE t1 WRITE; +OPTIMIZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 optimize status OK +SELECT * FROM INFORMATION_SCHEMA.TABLES; +SELECT * FROM t1; +i +1 +UNLOCK TABLES; +DROP TABLE t1; +# End of 10.0 tests diff --git a/mysql-test/r/mysqldump-nl.result b/mysql-test/r/mysqldump-nl.result index 829bf980..d397453b 100644 --- a/mysql-test/r/mysqldump-nl.result +++ b/mysql-test/r/mysqldump-nl.result @@ -124,3 +124,46 @@ v1 1v drop database `mysqltest1 1tsetlqsym`; +create database `test```; +create database `test\`` +\! ls +#`; +show databases like 'test%'; +Database (test%) +test +test\` +\! ls +# +test` + +-- +-- Current Database: `test``` +-- + +/*!40000 DROP DATABASE IF EXISTS `test```*/; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test``` /*!40100 DEFAULT CHARACTER SET latin1 */; + +USE `test```; + +-- +-- Current Database: `test\`` +-- \! ls +-- #` +-- + +/*!40000 DROP DATABASE IF EXISTS `test\`` +\! ls +#`*/; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test\`` +\! ls +#` /*!40100 DEFAULT CHARACTER SET latin1 */; + +USE `test\`` +\! ls +#`; +drop database `test```; +drop database `test\`` +\! ls +#`; diff --git a/mysql-test/r/order_by.result b/mysql-test/r/order_by.result index 71aa32f0..4cd9aebd 100644 --- a/mysql-test/r/order_by.result +++ b/mysql-test/r/order_by.result @@ -2950,6 +2950,52 @@ ORDER BY NULL, @a0 := 3, @a1 := 3, @a2 := 3, @a3 := 3, @a4 := 3, 1 1 2 +# +# mdev-6706: semi-join with duplicate weedout + ORDER BY +# +CREATE TABLE t1 (f1 VARCHAR(3)) ENGINE=MyISAM; +INSERT INTO t1 VALUES ('foo'); +CREATE TABLE t2 (f2 VARCHAR(3)) ENGINE=MyISAM; +INSERT INTO t2 VALUES ('bar'),('baz'); +CREATE TABLE t3 +(i3_key INT, f3_key VARCHAR(3), f3 VARCHAR(3), KEY(f3_key,i3_key)) +ENGINE=MyISAM; +INSERT INTO t3 VALUES (0,'qux','qux'),(8,'bar','bar'); +SELECT CONCAT( f1, f2 ) AS field FROM t1, t2 +WHERE f1 = ANY ( SELECT f1 +FROM t1 +LEFT JOIN ( t3 AS t3a, t3 AS t3b ) +ON ( t3b.f3_key = t3a.f3 ) +WHERE t3a.f3 < f1 OR t3b.f3 != f1 ); +field +foobar +foobaz +SELECT CONCAT( f1, f2 ) AS field FROM t1, t2 +WHERE f1 = ANY ( SELECT f1 +FROM t1 +LEFT JOIN ( t3 AS t3a, t3 AS t3b ) +ON ( t3b.f3_key = t3a.f3 ) +WHERE t3a.f3 < f1 OR t3b.f3 != f1 ) +ORDER BY field; +field +foobar +foobaz +EXPLAIN EXTENDED SELECT CONCAT( f1, f2 ) AS field FROM t1, t2 +WHERE f1 = ANY ( SELECT f1 +FROM t1 +LEFT JOIN ( t3 AS t3a, t3 AS t3b ) +ON ( t3b.f3_key = t3a.f3 ) +WHERE t3a.f3 < f1 OR t3b.f3 != f1 ) +ORDER BY field; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY t1 system NULL NULL NULL NULL 1 100.00 Using temporary; Using filesort +1 PRIMARY t1 system NULL NULL NULL NULL 1 100.00 +1 PRIMARY t2 ALL NULL NULL NULL NULL 2 100.00 +1 PRIMARY t3a ALL NULL NULL NULL NULL 2 100.00 Using where; Start temporary +1 PRIMARY t3b ref f3_key f3_key 6 test.t3a.f3 1 100.00 Using where; End temporary +Warnings: +Note 1003 select concat('foo',`test`.`t2`.`f2`) AS `field` from `test`.`t2` semi join ((`test`.`t3` `t3a` join `test`.`t3` `t3b`)) where ((`test`.`t3a`.`f3` < 'foo') or (`test`.`t3b`.`f3` <> 'foo')) order by concat('foo',`test`.`t2`.`f2`) +DROP TABLE t1,t2,t3; End of 5.5 tests # # MDEV-5884: EXPLAIN UPDATE ... ORDER BY LIMIT shows wrong #rows diff --git a/mysql-test/r/partition.result b/mysql-test/r/partition.result index 49ebd1f5..53f89c9c 100644 --- a/mysql-test/r/partition.result +++ b/mysql-test/r/partition.result @@ -2634,8 +2634,19 @@ alter table t1 drop partition if exists p5; Warnings: Note 1507 Error in list of partitions to DROP DROP TABLE t1; +CREATE TABLE t1 (a INT) ENGINE=MyISAM PARTITION BY RANGE(a) (PARTITION p1 VALUES LESS THAN (0)); +ALTER TABLE t1 ADD PARTITION (PARTITION p2 VALUES LESS THAN (1)); +PREPARE stmt FROM 'ALTER TABLE t1 ADD PARTITION IF NOT EXISTS (PARTITION p2 VALUES LESS THAN (2))'; +EXECUTE stmt; +Warnings: +Note 1517 Duplicate partition name p2 +EXECUTE stmt; +Warnings: +Note 1517 Duplicate partition name p2 +DEALLOCATE PREPARE stmt; +DROP TABLE t1; # -# Start of 10.1 tests +# End of 10.0 tests # # # MDEV-8283 crash in get_mm_leaf with xor on binary col diff --git a/mysql-test/r/partition_windows.result b/mysql-test/r/partition_windows.result index dabcedcb..75669092 100644 --- a/mysql-test/r/partition_windows.result +++ b/mysql-test/r/partition_windows.result @@ -26,9 +26,5 @@ ALTER TABLE t1 ADD PARTITION (PARTITION p3 DATA DIRECTORY = 'G:/mysqltest/p3Data Warnings: Warning 1618 option ignored Warning 1618 option ignored -Warning 1618 option ignored -Warning 1618 option ignored -Warning 1618 option ignored -Warning 1618 option ignored INSERT INTO t1 VALUES (NULL, "last", 4); DROP TABLE t1; diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result index 94f1a51d..26e7bc37 100644 --- a/mysql-test/r/ps.result +++ b/mysql-test/r/ps.result @@ -4332,4 +4332,22 @@ set join_cache_level=@join_cache_level_save; deallocate prepare stmt; drop view v1,v2,v3; drop table t1,t2,t3; +# +# MDEV-10657: incorrect result returned with binary protocol +# (prepared statements) +# +create table t1 (code varchar(10) primary key); +INSERT INTO t1(code) VALUES ('LINE1'), ('LINE2'), ('LINE3'); +SELECT X.* +FROM +(SELECT CODE, RN +FROM +(SELECT A.CODE, @cnt := @cnt + 1 AS RN +FROM t1 A, (SELECT @cnt := 0) C) T +) X; +CODE RN +LINE1 1 +LINE2 2 +LINE3 3 +drop table t1; # End of 5.5 tests diff --git a/mysql-test/r/query_cache_debug.result b/mysql-test/r/query_cache_debug.result index 01c642b3..b3070761 100644 --- a/mysql-test/r/query_cache_debug.result +++ b/mysql-test/r/query_cache_debug.result @@ -221,3 +221,29 @@ RESET QUERY CACHE; DROP TABLE t1; SET GLOBAL query_cache_size= DEFAULT; SET GLOBAL query_cache_type= DEFAULT; +# +# MDEV-14526: MariaDB keeps crashing under load when +# query_cache_type is changed +# +CREATE TABLE t1 ( +`id` int(10) NOT NULL AUTO_INCREMENT, +`k` int(10) default '0', +PRIMARY KEY (`id`)) +ENGINE=MyISAM; +INSERT IGNORE INTO t1 VALUES +(NULL,1),(NULL,8),(NULL,NULL),(NULL,NULL),(NULL,4),(NULL,9),(NULL,7), +(NULL,3),(NULL,NULL),(NULL,2),(NULL,3),(NULL,NULL),(NULL,2),(NULL,7), +(NULL,1),(NULL,2),(NULL,4),(NULL,NULL),(NULL,1),(NULL,1),(NULL,4); +SET GLOBAL query_cache_size= 1024*1024; +SET GLOBAL query_cache_type= 1; +set debug_sync="wait_in_query_cache_store_query SIGNAL parked WAIT_FOR go"; +SELECT DISTINCT id FROM t1 WHERE id BETWEEN 5603 AND 16218 ORDER BY k; +set debug_sync="now WAIT_FOR parked"; +SET GLOBAL query_cache_type= 0; +set debug_sync="now SIGNAL go"; +id +set debug_sync= 'RESET'; +DROP TABLE t1; +SEt GLOBAL query_cache_size= DEFAULT; +SEt GLOBAL query_cache_type= DEFAULT; +# End of 5.5 tests diff --git a/mysql-test/r/repair.result b/mysql-test/r/repair.result index 79ee0c7a..8d48d2f8 100644 --- a/mysql-test/r/repair.result +++ b/mysql-test/r/repair.result @@ -114,7 +114,7 @@ test.t1 repair status OK SET myisam_repair_threads=@@global.myisam_repair_threads; SET myisam_sort_buffer_size=@@global.myisam_sort_buffer_size; DROP TABLE t1; -End of 4.1 tests +# End of 4.1 tests # Test with a saved table from 4.1 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 @@ -150,6 +150,7 @@ SELECT * FROM t1; id 1 DROP TABLE t1; +# End of 5.0 tests DROP TABLE IF EXISTS tt1; CREATE TEMPORARY TABLE tt1 (c1 INT); REPAIR TABLE tt1 USE_FRM; @@ -214,3 +215,17 @@ Table Op Msg_type Msg_text test.v1 repair status OK drop view v1; drop table t1; +# End of 5.5 tests +CREATE TABLE t1 (i INT) ENGINE=MyISAM; +INSERT t1 VALUES (1); +LOCK TABLE t1 WRITE; +REPAIR TABLE t1; +Table Op Msg_type Msg_text +test.t1 repair status OK +SELECT * FROM INFORMATION_SCHEMA.TABLES; +SELECT * FROM t1; +i +1 +UNLOCK TABLES; +DROP TABLE t1; +# End of 10.0 tests diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index 9b0ace5c..57d704c3 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -8119,4 +8119,127 @@ SET @aux = f1(); DROP FUNCTION f1; DROP VIEW v1; DROP TABLE t1; +# +# MDEV-14857: problem with 10.2.11 server crashing when +# executing stored procedure +# +SET max_sp_recursion_depth=10; +CREATE TABLE t1 (a INT); +CREATE TABLE t2 (b INT); +CREATE PROCEDURE proc_0() +BEGIN +CALL empty_1(); +CALL proc_1(); +END || +CREATE PROCEDURE proc_1() +BEGIN +CALL proc_2(); +CALL proc_3(); +CALL proc_4(); +CALL proc_5(); +END || +CREATE PROCEDURE proc_2() +CALL proc_6(); +|| +CREATE PROCEDURE proc_3() +BEGIN +CALL empty_2(); +CALL empty_3(); +END || +CREATE PROCEDURE proc_4() +CALL proc_7(); +|| +CREATE PROCEDURE proc_5() +CALL proc_select(); +|| +CREATE PROCEDURE proc_6() +BEGIN +CALL empty_4(); +CALL empty_5(); +CALL empty_6(); +CALL empty_7(); +CALL proc_8(); +END || +CREATE PROCEDURE proc_7() +CALL proc_9('foo'); +|| +CREATE PROCEDURE proc_8() +CALL proc_10(); +|| +CREATE PROCEDURE proc_9(IN opt VARCHAR(40)) +IF LEFT(opt,1) <> '_' THEN +CALL proc_11(); +END IF; +|| +CREATE PROCEDURE proc_10() +CALL proc_12(); +|| +CREATE PROCEDURE proc_11() +BEGIN +CALL empty_8(); +CALL empty_9(); +CALL empty_10(); +CALL proc_13(); +END || +CREATE PROCEDURE proc_12() +BEGIN +CALL empty_11(); +CALL empty_12(); +CALL empty_13(); +END || +CREATE PROCEDURE proc_13() +BEGIN +CALL proc_9('_bar'); +CALL empty_14(); +END || +CREATE PROCEDURE empty_1() BEGIN END ; +CREATE PROCEDURE empty_2() BEGIN END ; +CREATE PROCEDURE empty_3() BEGIN END ; +CREATE PROCEDURE empty_4() BEGIN END ; +CREATE PROCEDURE empty_5() BEGIN END ; +CREATE PROCEDURE empty_6() BEGIN END ; +CREATE PROCEDURE empty_7() BEGIN END ; +CREATE PROCEDURE empty_8() BEGIN END ; +CREATE PROCEDURE empty_9() BEGIN END ; +CREATE PROCEDURE empty_10() BEGIN END ; +CREATE PROCEDURE empty_11() BEGIN END ; +CREATE PROCEDURE empty_12() BEGIN END ; +CREATE PROCEDURE empty_13() BEGIN END ; +CREATE PROCEDURE empty_14() BEGIN END ; +CREATE PROCEDURE proc_select() +SELECT * FROM t1 WHERE NOT EXISTS ( SELECT * FROM t2) +; +CALL proc_0(); +a +DROP PROCEDURE empty_1; +DROP PROCEDURE empty_2; +DROP PROCEDURE empty_3; +DROP PROCEDURE empty_4; +DROP PROCEDURE empty_5; +DROP PROCEDURE empty_6; +DROP PROCEDURE empty_7; +DROP PROCEDURE empty_8; +DROP PROCEDURE empty_9; +DROP PROCEDURE empty_10; +DROP PROCEDURE empty_11; +DROP PROCEDURE empty_12; +DROP PROCEDURE empty_13; +DROP PROCEDURE empty_14; +DROP PROCEDURE proc_0; +DROP PROCEDURE proc_1; +DROP PROCEDURE proc_2; +DROP PROCEDURE proc_3; +DROP PROCEDURE proc_4; +DROP PROCEDURE proc_5; +DROP PROCEDURE proc_6; +DROP PROCEDURE proc_7; +DROP PROCEDURE proc_8; +DROP PROCEDURE proc_9; +DROP PROCEDURE proc_10; +DROP PROCEDURE proc_11; +DROP PROCEDURE proc_12; +DROP PROCEDURE proc_13; +DROP PROCEDURE proc_select; +DROP TABLE t1, t2; +SET max_sp_recursion_depth=default; #End of 10.1 tests diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index cf542a59..40f936fb 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -7210,6 +7210,32 @@ NULL # SELECT (SELECT MAX(sq.f2) FROM t1) FROM (SELECT * FROM t2) AS sq WHERE f2 = 2; # drop table t1, t2; +# +# MDEV-13933: Wrong results in COUNT() query with EXISTS and exists_to_in +# (5.5 test) +# +SET @optimiser_switch_save= @@optimizer_switch; +CREATE TABLE t1 (a INT NOT NULL); +INSERT INTO t1 VALUES (1),(1),(1),(5),(5); +CREATE TABLE t2 (b INT); +INSERT INTO t2 VALUES (5),(1); +CREATE TABLE t3 (c INT, KEY(c)); +INSERT INTO t3 VALUES (5),(5); +SET optimizer_switch='semijoin=on'; +select t1.a from t1 where t1.a in (select `test`.`t2`.`b` from `test`.`t2`) +and t1.a in (select `test`.`t3`.`c` from `test`.`t3`); +a +5 +5 +SET optimizer_switch='semijoin=off'; +select t1.a from t1 where t1.a in (select `test`.`t2`.`b` from `test`.`t2`) +and t1.a in (select `test`.`t3`.`c` from `test`.`t3`); +a +5 +5 +SET @@optimizer_switch= @optimiser_switch_save; +DROP TABLE t1, t2, t3; +End of 5.5 tests # End of 10.0 tests # # MDEV-9487: Server crashes in Time_and_counter_tracker::incr_loops diff --git a/mysql-test/r/subselect_no_exists_to_in.result b/mysql-test/r/subselect_no_exists_to_in.result index a3a6e2ab..a2382082 100644 --- a/mysql-test/r/subselect_no_exists_to_in.result +++ b/mysql-test/r/subselect_no_exists_to_in.result @@ -7210,6 +7210,32 @@ NULL # SELECT (SELECT MAX(sq.f2) FROM t1) FROM (SELECT * FROM t2) AS sq WHERE f2 = 2; # drop table t1, t2; +# +# MDEV-13933: Wrong results in COUNT() query with EXISTS and exists_to_in +# (5.5 test) +# +SET @optimiser_switch_save= @@optimizer_switch; +CREATE TABLE t1 (a INT NOT NULL); +INSERT INTO t1 VALUES (1),(1),(1),(5),(5); +CREATE TABLE t2 (b INT); +INSERT INTO t2 VALUES (5),(1); +CREATE TABLE t3 (c INT, KEY(c)); +INSERT INTO t3 VALUES (5),(5); +SET optimizer_switch='semijoin=on'; +select t1.a from t1 where t1.a in (select `test`.`t2`.`b` from `test`.`t2`) +and t1.a in (select `test`.`t3`.`c` from `test`.`t3`); +a +5 +5 +SET optimizer_switch='semijoin=off'; +select t1.a from t1 where t1.a in (select `test`.`t2`.`b` from `test`.`t2`) +and t1.a in (select `test`.`t3`.`c` from `test`.`t3`); +a +5 +5 +SET @@optimizer_switch= @optimiser_switch_save; +DROP TABLE t1, t2, t3; +End of 5.5 tests # End of 10.0 tests # # MDEV-9487: Server crashes in Time_and_counter_tracker::incr_loops diff --git a/mysql-test/r/subselect_no_mat.result b/mysql-test/r/subselect_no_mat.result index 11457ccb..baa74307 100644 --- a/mysql-test/r/subselect_no_mat.result +++ b/mysql-test/r/subselect_no_mat.result @@ -7203,6 +7203,32 @@ NULL # SELECT (SELECT MAX(sq.f2) FROM t1) FROM (SELECT * FROM t2) AS sq WHERE f2 = 2; # drop table t1, t2; +# +# MDEV-13933: Wrong results in COUNT() query with EXISTS and exists_to_in +# (5.5 test) +# +SET @optimiser_switch_save= @@optimizer_switch; +CREATE TABLE t1 (a INT NOT NULL); +INSERT INTO t1 VALUES (1),(1),(1),(5),(5); +CREATE TABLE t2 (b INT); +INSERT INTO t2 VALUES (5),(1); +CREATE TABLE t3 (c INT, KEY(c)); +INSERT INTO t3 VALUES (5),(5); +SET optimizer_switch='semijoin=on'; +select t1.a from t1 where t1.a in (select `test`.`t2`.`b` from `test`.`t2`) +and t1.a in (select `test`.`t3`.`c` from `test`.`t3`); +a +5 +5 +SET optimizer_switch='semijoin=off'; +select t1.a from t1 where t1.a in (select `test`.`t2`.`b` from `test`.`t2`) +and t1.a in (select `test`.`t3`.`c` from `test`.`t3`); +a +5 +5 +SET @@optimizer_switch= @optimiser_switch_save; +DROP TABLE t1, t2, t3; +End of 5.5 tests # End of 10.0 tests # # MDEV-9487: Server crashes in Time_and_counter_tracker::incr_loops diff --git a/mysql-test/r/subselect_no_opts.result b/mysql-test/r/subselect_no_opts.result index 076953c2..039f2fe1 100644 --- a/mysql-test/r/subselect_no_opts.result +++ b/mysql-test/r/subselect_no_opts.result @@ -7201,6 +7201,32 @@ NULL # SELECT (SELECT MAX(sq.f2) FROM t1) FROM (SELECT * FROM t2) AS sq WHERE f2 = 2; # drop table t1, t2; +# +# MDEV-13933: Wrong results in COUNT() query with EXISTS and exists_to_in +# (5.5 test) +# +SET @optimiser_switch_save= @@optimizer_switch; +CREATE TABLE t1 (a INT NOT NULL); +INSERT INTO t1 VALUES (1),(1),(1),(5),(5); +CREATE TABLE t2 (b INT); +INSERT INTO t2 VALUES (5),(1); +CREATE TABLE t3 (c INT, KEY(c)); +INSERT INTO t3 VALUES (5),(5); +SET optimizer_switch='semijoin=on'; +select t1.a from t1 where t1.a in (select `test`.`t2`.`b` from `test`.`t2`) +and t1.a in (select `test`.`t3`.`c` from `test`.`t3`); +a +5 +5 +SET optimizer_switch='semijoin=off'; +select t1.a from t1 where t1.a in (select `test`.`t2`.`b` from `test`.`t2`) +and t1.a in (select `test`.`t3`.`c` from `test`.`t3`); +a +5 +5 +SET @@optimizer_switch= @optimiser_switch_save; +DROP TABLE t1, t2, t3; +End of 5.5 tests # End of 10.0 tests # # MDEV-9487: Server crashes in Time_and_counter_tracker::incr_loops diff --git a/mysql-test/r/subselect_no_scache.result b/mysql-test/r/subselect_no_scache.result index b5c7e9bf..0ce77bbb 100644 --- a/mysql-test/r/subselect_no_scache.result +++ b/mysql-test/r/subselect_no_scache.result @@ -7216,6 +7216,32 @@ NULL # SELECT (SELECT MAX(sq.f2) FROM t1) FROM (SELECT * FROM t2) AS sq WHERE f2 = 2; # drop table t1, t2; +# +# MDEV-13933: Wrong results in COUNT() query with EXISTS and exists_to_in +# (5.5 test) +# +SET @optimiser_switch_save= @@optimizer_switch; +CREATE TABLE t1 (a INT NOT NULL); +INSERT INTO t1 VALUES (1),(1),(1),(5),(5); +CREATE TABLE t2 (b INT); +INSERT INTO t2 VALUES (5),(1); +CREATE TABLE t3 (c INT, KEY(c)); +INSERT INTO t3 VALUES (5),(5); +SET optimizer_switch='semijoin=on'; +select t1.a from t1 where t1.a in (select `test`.`t2`.`b` from `test`.`t2`) +and t1.a in (select `test`.`t3`.`c` from `test`.`t3`); +a +5 +5 +SET optimizer_switch='semijoin=off'; +select t1.a from t1 where t1.a in (select `test`.`t2`.`b` from `test`.`t2`) +and t1.a in (select `test`.`t3`.`c` from `test`.`t3`); +a +5 +5 +SET @@optimizer_switch= @optimiser_switch_save; +DROP TABLE t1, t2, t3; +End of 5.5 tests # End of 10.0 tests # # MDEV-9487: Server crashes in Time_and_counter_tracker::incr_loops diff --git a/mysql-test/r/subselect_no_semijoin.result b/mysql-test/r/subselect_no_semijoin.result index 52da5f1c..574e7812 100644 --- a/mysql-test/r/subselect_no_semijoin.result +++ b/mysql-test/r/subselect_no_semijoin.result @@ -7201,6 +7201,32 @@ NULL # SELECT (SELECT MAX(sq.f2) FROM t1) FROM (SELECT * FROM t2) AS sq WHERE f2 = 2; # drop table t1, t2; +# +# MDEV-13933: Wrong results in COUNT() query with EXISTS and exists_to_in +# (5.5 test) +# +SET @optimiser_switch_save= @@optimizer_switch; +CREATE TABLE t1 (a INT NOT NULL); +INSERT INTO t1 VALUES (1),(1),(1),(5),(5); +CREATE TABLE t2 (b INT); +INSERT INTO t2 VALUES (5),(1); +CREATE TABLE t3 (c INT, KEY(c)); +INSERT INTO t3 VALUES (5),(5); +SET optimizer_switch='semijoin=on'; +select t1.a from t1 where t1.a in (select `test`.`t2`.`b` from `test`.`t2`) +and t1.a in (select `test`.`t3`.`c` from `test`.`t3`); +a +5 +5 +SET optimizer_switch='semijoin=off'; +select t1.a from t1 where t1.a in (select `test`.`t2`.`b` from `test`.`t2`) +and t1.a in (select `test`.`t3`.`c` from `test`.`t3`); +a +5 +5 +SET @@optimizer_switch= @optimiser_switch_save; +DROP TABLE t1, t2, t3; +End of 5.5 tests # End of 10.0 tests # # MDEV-9487: Server crashes in Time_and_counter_tracker::incr_loops diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result index 233e7399..62b5e284 100644 --- a/mysql-test/r/union.result +++ b/mysql-test/r/union.result @@ -2068,6 +2068,43 @@ avg(f) sub 31.5000 0 1.5000 1 drop table t1,t2,t3; +# +# MDEV-14715 Assertion `!table || (!table->read_set || +# bitmap_is_set(table->read_set, field_index))' +# failed in Field_num::val_decimal +# +CREATE TABLE t1 (a INT, b INT) ENGINE=MyISAM; +CREATE VIEW v1 AS SELECT * FROM t1; +INSERT INTO t1 VALUES (1, NULL),(3, 4); +(SELECT a, sum(a) AS f FROM v1 group by a ORDER BY b + sum(a)) +UNION +(SELECT 2, 2); +ERROR HY000: Invalid use of group function +(SELECT a, sum(a) AS f FROM v1 group by a ORDER BY b + 1) +UNION +(SELECT 2, 2); +a f +1 1 +3 3 +2 2 +SELECT a, b FROM t1 +UNION +(SELECT a, VAR_POP(a) AS f FROM v1 GROUP BY a ORDER BY b/a ); +a b +1 NULL +3 4 +1 0 +3 0 +DROP TABLE t1; +(SELECT a, sum(a) AS f FROM v1 group by a ORDER BY b + 1) +UNION +(SELECT 2, 2); +ERROR HY000: View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them +DROP VIEW v1; +(SELECT a, sum(a) AS f FROM v1 group by a ORDER BY b + 1) +UNION +(SELECT 2, 2); +ERROR 42S02: Table 'test.v1' doesn't exist End of 5.5 tests # # WL#1763 Avoid creating temporary table in UNION ALL diff --git a/mysql-test/r/update_innodb.result b/mysql-test/r/update_innodb.result index 5fcc5840..0a85c6da 100644 --- a/mysql-test/r/update_innodb.result +++ b/mysql-test/r/update_innodb.result @@ -30,6 +30,16 @@ UPDATE t1 a JOIN t2 b ON a.c1 = b.c1 JOIN v1 vw ON b.c2 = vw.c1 JOIN t3 del ON v drop view v1; drop table t1,t2,t3,t4; # +# MDEV-14862: Server crashes in Bitmap<64u>::merge / add_key_field +# +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +CREATE VIEW v1 AS SELECT * FROM t1; +CREATE TABLE t2 (b INT) ENGINE=InnoDB; +DELETE FROM v1 WHERE a IN ( SELECT a FROM t2 ); +DELETE FROM v1 WHERE (a,a) IN ( SELECT a,a FROM t2 ); +drop view v1; +drop table t1,t2; +# # MDEV-10232 Scalar result of subquery changes after adding an outer select stmt # CREATE TABLE t1 ( diff --git a/mysql-test/r/xa.result b/mysql-test/r/xa.result index 6c242d95..0bf9b07b 100644 --- a/mysql-test/r/xa.result +++ b/mysql-test/r/xa.result @@ -200,6 +200,17 @@ a 1 DROP TABLE t1; # +# MDEV-14609 XA Transction unable to ROLLBACK TO SAVEPOINT +# +CREATE TABLE t1 (c1 INT) ENGINE=INNODB; +XA START 'xa1'; +SAVEPOINT savepoint1; +INSERT INTO t1 (c1) VALUES (1),(2),(3),(4); +ROLLBACK TO SAVEPOINT savepoint1; +XA END 'xa1'; +XA ROLLBACK 'xa1'; +DROP TABLE t1; +# # Bug#12352846 - TRANS_XA_START(THD*): # ASSERTION THD->TRANSACTION.XID_STATE.XID.IS_NULL() # FAILED diff --git a/mysql-test/r/xml.result b/mysql-test/r/xml.result index 41dbc744..375b2c62 100644 --- a/mysql-test/r/xml.result +++ b/mysql-test/r/xml.result @@ -1274,5 +1274,17 @@ c1 c2 2 b2 DROP TABLE t1; # +# MDEV-15118 ExtractValue(xml,something_complex) does not work +# +CREATE TABLE t1 (a TEXT); +INSERT INTO t1 VALUES (CONCAT('aaa')); +SELECT ExtractValue(a, '/a') AS a FROM t1; +a +aaa +SELECT ExtractValue(a, FROM_BASE64(TO_BASE64('/a'))) AS a FROM t1; +a +aaa +DROP TABLE t1; +# # End of 10.0 tests # diff --git a/mysql-test/suite/encryption/t/debug_key_management.test b/mysql-test/suite/encryption/t/debug_key_management.test index 5001ac6a..22b213c6 100644 --- a/mysql-test/suite/encryption/t/debug_key_management.test +++ b/mysql-test/suite/encryption/t/debug_key_management.test @@ -8,13 +8,14 @@ if (`select count(*) = 0 from information_schema.plugins set global innodb_encrypt_tables=ON; show variables like 'innodb_encrypt%'; -let $wait_condition= select count(*) = 3 from information_schema.innodb_tablespaces_encryption where current_key_version=1; +--let $tables_count= `select count(*) + 1 from information_schema.tables where engine = 'InnoDB'` +let $wait_condition= select count(*) = $tables_count from information_schema.innodb_tablespaces_encryption where current_key_version=1; --source include/wait_condition.inc select count(*) from information_schema.innodb_tablespaces_encryption where current_key_version <> 1; set global debug_key_management_version=10; -let $wait_condition= select count(*) = 3 from information_schema.innodb_tablespaces_encryption where current_key_version=10; +let $wait_condition= select count(*) = $tables_count from information_schema.innodb_tablespaces_encryption where current_key_version=10; --source include/wait_condition.inc select count(*) from information_schema.innodb_tablespaces_encryption where current_key_version <> 10; diff --git a/mysql-test/suite/encryption/t/encrypt_and_grep.test b/mysql-test/suite/encryption/t/encrypt_and_grep.test index 175c8309..9395f467 100644 --- a/mysql-test/suite/encryption/t/encrypt_and_grep.test +++ b/mysql-test/suite/encryption/t/encrypt_and_grep.test @@ -63,7 +63,8 @@ SET GLOBAL innodb_encrypt_tables = off; --echo # Wait max 10 min for key encryption threads to decrypt all spaces --let $wait_timeout= 600 ---let $wait_condition=SELECT COUNT(*) = 5 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND CURRENT_KEY_VERSION = 0; +--let $tables_count= `select count(*) from information_schema.tables where engine = 'InnoDB'` +--let $wait_condition=SELECT COUNT(*) = $tables_count FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND CURRENT_KEY_VERSION = 0; --source include/wait_condition.inc SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; diff --git a/mysql-test/suite/encryption/t/innodb_encryption.test b/mysql-test/suite/encryption/t/innodb_encryption.test index 35c2b369..d183a291 100644 --- a/mysql-test/suite/encryption/t/innodb_encryption.test +++ b/mysql-test/suite/encryption/t/innodb_encryption.test @@ -14,9 +14,11 @@ SHOW VARIABLES LIKE 'innodb_encrypt%'; SET GLOBAL innodb_encrypt_tables = ON; +--let $tables_count= `select count(*) + 1 from information_schema.tables where engine = 'InnoDB'` + --echo # Wait max 10 min for key encryption threads to encrypt all spaces --let $wait_timeout= 600 ---let $wait_condition=SELECT COUNT(*) >= 3 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; +--let $wait_condition=SELECT COUNT(*) >= $tables_count FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; --source include/wait_condition.inc SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; @@ -59,7 +61,7 @@ SET GLOBAL innodb_encryption_threads=@start_global_value; --echo # Wait max 10 min for key encryption threads to encrypt all spaces --let $wait_timeout= 600 ---let $wait_condition=SELECT COUNT(*) >=3 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; +--let $wait_condition=SELECT COUNT(*) >= $tables_count FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; --source include/wait_condition.inc SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; diff --git a/mysql-test/suite/federated/net_thd_crash-12951.result b/mysql-test/suite/federated/net_thd_crash-12951.result new file mode 100644 index 00000000..573ac96e --- /dev/null +++ b/mysql-test/suite/federated/net_thd_crash-12951.result @@ -0,0 +1,11 @@ +set global query_cache_size= 16*1024*1024; +set global query_cache_type= 1; +create table t1 (i int) engine=innodb; +create table t2 (i int) engine=federated +CONNECTION="mysql://root@localhost:MASTER_MYPORT/test/t1"; +select * from t2; +i +drop table t2; +drop table t1; +set global query_cache_type= default; +set global query_cache_size= default; diff --git a/mysql-test/suite/federated/net_thd_crash-12951.test b/mysql-test/suite/federated/net_thd_crash-12951.test new file mode 100644 index 00000000..81cd8266 --- /dev/null +++ b/mysql-test/suite/federated/net_thd_crash-12951.test @@ -0,0 +1,23 @@ +# +# MDEV-12951 Server crash [mysqld got exception 0xc0000005] +# + +--source include/have_innodb.inc + +set global query_cache_size= 16*1024*1024; +set global query_cache_type= 1; + +create table t1 (i int) engine=innodb; +--replace_result $MASTER_MYPORT MASTER_MYPORT +eval create table t2 (i int) engine=federated + CONNECTION="mysql://root@localhost:$MASTER_MYPORT/test/t1"; + +select * from t2; + +source include/restart_mysqld.inc; + +drop table t2; +drop table t1; + +set global query_cache_type= default; +set global query_cache_size= default; diff --git a/mysql-test/suite/galera/r/galera_gtid_slave.result b/mysql-test/suite/galera/r/galera_gtid_slave.result new file mode 100644 index 00000000..40f3f1c0 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_gtid_slave.result @@ -0,0 +1,26 @@ +START SLAVE; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES(1); +begin; +insert into t2 values(21); +insert into t2 values(22); +commit; +SELECT @@global.gtid_binlog_state; +@@global.gtid_binlog_state +1-1-4 +INSERT INTO t1 VALUES(2); +INSERT INTO t1 VALUES(3); +SELECT @@global.gtid_binlog_state; +@@global.gtid_binlog_state +1-1-4,2-2-2 +INSERT INTO t1 VALUES(4); +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; diff --git a/mysql-test/suite/galera/r/galera_gtid_slave_sst_rsync.result b/mysql-test/suite/galera/r/galera_gtid_slave_sst_rsync.result new file mode 100644 index 00000000..81fae57d --- /dev/null +++ b/mysql-test/suite/galera/r/galera_gtid_slave_sst_rsync.result @@ -0,0 +1,130 @@ +#Connection 2 +START SLAVE; +#Connection 1 +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY, f2 int unique) ENGINE=InnoDB; +INSERT INTO t2 VALUES(1,11); +INSERT INTO t2 VALUES(2,22); +INSERT INTO t2 VALUES(3,33); +SELECT @@global.gtid_binlog_state; +@@global.gtid_binlog_state +1-1-4 +include/save_master_gtid.inc +#Connection 2 +include/sync_with_master_gtid.inc +SELECT @@global.gtid_binlog_state; +@@global.gtid_binlog_state +1-1-4 +INSERT INTO t2 VALUES(4,44); +INSERT INTO t2 VALUES(5,55); +INSERT INTO t2 VALUES(6,66); +SELECT @@global.gtid_binlog_state; +@@global.gtid_binlog_state +1-1-4,2-2-3 +#Connection 3 +INSERT INTO t2 VALUES(7,77); +INSERT INTO t2 VALUES(8,88); +SELECT @@global.gtid_binlog_state; +@@global.gtid_binlog_state +1-1-4,2-2-3,2-3-5 +#Connection 1 +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'); +COMMIT; +include/save_master_gtid.inc +#Connection 2 +include/sync_with_master_gtid.inc +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +COMMIT; +#Connection 3 +Shutting down server ... +#Connection 2 +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +COMMIT; +#Connection 3 +Starting server ... +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node3_committed_after'); +INSERT INTO t1 VALUES ('node3_committed_after'); +COMMIT; +#Connection 2 +Select * from t1 order by f1; +f1 +node1_committed_before +node1_committed_before +node1_committed_during +node1_committed_during +node2_committed_before +node2_committed_before +node3_committed_after +node3_committed_after +#Connection 3 +Select * from t1 order by f1; +f1 +node1_committed_before +node1_committed_before +node1_committed_during +node1_committed_during +node2_committed_before +node2_committed_before +node3_committed_after +node3_committed_after +#Connection 2 +SELECT @@global.gtid_binlog_state; +@@global.gtid_binlog_state +1-1-6,2-2-7,2-3-8 +#Connection 3 +SELECT @@global.gtid_binlog_state; +@@global.gtid_binlog_state +1-1-6,2-2-7,2-3-8 +#Connection 1 +SET AUTOCOMMIT=ON; +#Connection 2 +SET AUTOCOMMIT=ON; +#Connection 3 +SET AUTOCOMMIT=ON; +#Connection 2 +STOP slave; +INSERT INTO t1 VALUES ('node2_slave_stoped'); +#Connection 1 +INSERT INTO t1 VALUES ('node1_normal_entry'); +include/save_master_gtid.inc +#Connection 2 +INSERT INTO t1 VALUES ('node2_slave_stoped_inserted'); +start slave; +include/sync_with_master_gtid.inc +INSERT INTO t1 VALUES ('node2_slave_started'); +SELECT count(*) from t1; +count(*) +12 +SELECT @@global.gtid_binlog_state; +@@global.gtid_binlog_state +1-1-7,2-3-8,2-2-11 +#Connection 3 +SELECT count(*) from t1; +count(*) +12 +SELECT @@global.gtid_binlog_state; +@@global.gtid_binlog_state +1-1-7,2-3-8,2-2-11 +#Connection 1 +DROP TABLE t2,t1; +#Connection 2 +#Connection 3 +#Connection 2 +STOP SLAVE; +RESET SLAVE ALL; +reset master; +#Connection 3 +reset master; +#Connection 1 +reset master; diff --git a/mysql-test/suite/galera/t/galera_gtid_slave.cnf b/mysql-test/suite/galera/t/galera_gtid_slave.cnf new file mode 100644 index 00000000..409d0d16 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gtid_slave.cnf @@ -0,0 +1,18 @@ +!include ../galera_2nodes_as_slave.cnf + +[mysqld] +log-bin=mysqld-bin +log-slave-updates +binlog-format=ROW + +[mysqld.1] +gtid-domain-id=1 +[mysqld.2] +gtid-domain-id=2 +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=2 +[mysqld.3] +gtid-domain-id=2 +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=2 + diff --git a/mysql-test/suite/galera/t/galera_gtid_slave.test b/mysql-test/suite/galera/t/galera_gtid_slave.test new file mode 100644 index 00000000..8ef87452 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gtid_slave.test @@ -0,0 +1,78 @@ +# +# Test Galera as a slave to a MariaDB master using GTIDs +# +# suite/galera/galera_2nodes_as_slave.cnf describes the setup of the nodes +# suite/galera/t/galera_as_slave_gtid.cnf has the GTID options +# +# In addition to performing DDL and DML, we check that the gtid of the master is preserved inside the cluster +# + +--source include/have_innodb.inc + +# As node #1 is not a Galera node, we connect to node #2 in order to run include/galera_cluster.inc +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--source include/galera_cluster.inc + +--connection node_2 +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_1; +--enable_query_log +START SLAVE; + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES(1); + +#multi stmt trans +begin; +insert into t2 values(21); +insert into t2 values(22); +commit; + +SELECT @@global.gtid_binlog_state; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 1 FROM t1; +--source include/wait_condition.inc +--sleep 1 +INSERT INTO t1 VALUES(2); +INSERT INTO t1 VALUES(3); +SELECT @@global.gtid_binlog_state; + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--let $wait_condition = SELECT COUNT(*) = 3 FROM t1; +--source include/wait_condition.inc + +INSERT INTO t1 VALUES(4); +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'; +--source include/wait_condition.inc + +--connection node_3 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--connection node_2 +STOP SLAVE; +RESET SLAVE ALL; +reset master; + +--connection node_3 +reset master; diff --git a/mysql-test/suite/galera/t/galera_gtid_slave_sst_rsync.cnf b/mysql-test/suite/galera/t/galera_gtid_slave_sst_rsync.cnf new file mode 100644 index 00000000..bb9c8e84 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gtid_slave_sst_rsync.cnf @@ -0,0 +1,18 @@ +!include ../galera_2nodes_as_slave.cnf + +[mysqld] +log-bin=mysqld-bin +log-slave-updates +binlog-format=ROW +wsrep_sst_method=rsync +[mysqld.1] +gtid-domain-id=1 +[mysqld.2] +gtid-domain-id=2 +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=2 +[mysqld.3] +gtid-domain-id=2 +wsrep_gtid_mode=1 +wsrep_gtid_domain_id=2 + diff --git a/mysql-test/suite/galera/t/galera_gtid_slave_sst_rsync.test b/mysql-test/suite/galera/t/galera_gtid_slave_sst_rsync.test new file mode 100644 index 00000000..3fe94ad1 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gtid_slave_sst_rsync.test @@ -0,0 +1,207 @@ +# +# Test Galera as a slave to a MariaDB master using GTIDs +# +# suite/galera/galera_2nodes_as_slave.cnf describes the setup of the nodes +# +# In addition to performing DDL and DML, we check that the gtid of the master is preserved inside the cluster +# + +--source include/big_test.inc +--source include/have_innodb.inc +# As node #1 is not a Galera node, we connect to node #2 in order to run include/galera_cluster.inc +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--source include/galera_cluster.inc + +--echo #Connection 2 +--connection node_2 +--disable_query_log +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_1,master_use_gtid=slave_pos; +--enable_query_log +START SLAVE; +--sleep 1 + + +--echo #Connection 1 +--connection node_1 +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY, f2 int unique) ENGINE=InnoDB; +INSERT INTO t2 VALUES(1,11); +INSERT INTO t2 VALUES(2,22); +INSERT INTO t2 VALUES(3,33); + +SELECT @@global.gtid_binlog_state; +--source include/save_master_gtid.inc + +--echo #Connection 2 +--connection node_2 +--source include/sync_with_master_gtid.inc +SELECT @@global.gtid_binlog_state; + +INSERT INTO t2 VALUES(4,44); +INSERT INTO t2 VALUES(5,55); +INSERT INTO t2 VALUES(6,66); +SELECT @@global.gtid_binlog_state; + +--echo #Connection 3 +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME= 't2'; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 6 FROM t2; +--source include/wait_condition.inc + +INSERT INTO t2 VALUES(7,77); +INSERT INTO t2 VALUES(8,88); +SELECT @@global.gtid_binlog_state; + +#Perform SST +--echo #Connection 1 +--connection node_1 +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'); +COMMIT; +--source include/save_master_gtid.inc + +--echo #Connection 2 +--connection node_2 +--source include/sync_with_master_gtid.inc +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node2_committed_before'); +INSERT INTO t1 VALUES ('node2_committed_before'); +COMMIT; + +--echo #Connection 3 +--connection node_3 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME= 't1'; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 4 FROM t1; +--source include/wait_condition.inc +--let $node_1= node_2 +--let $node_2= node_3 +--source include/auto_increment_offset_save.inc +--echo Shutting down server ... +--source include/shutdown_mysqld.inc + + +--echo #Connection 2 +--connection node_2 +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node1_committed_during'); +INSERT INTO t1 VALUES ('node1_committed_during'); +COMMIT; + +--echo #Connection 3 +--connection node_3 +--echo Starting server ... +--source include/start_mysqld.inc +--source include/wait_until_ready.inc +--source include/auto_increment_offset_restore.inc + +SET AUTOCOMMIT=OFF; +START TRANSACTION; +INSERT INTO t1 VALUES ('node3_committed_after'); +INSERT INTO t1 VALUES ('node3_committed_after'); +COMMIT; + +--echo #Connection 2 +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 8 FROM t1; +--source include/wait_condition.inc +Select * from t1 order by f1; + +--echo #Connection 3 +--connection node_3 +Select * from t1 order by f1; + +#SST Done +--sleep 1 +--echo #Connection 2 +--connection node_2 +SELECT @@global.gtid_binlog_state; + +--echo #Connection 3 +--connection node_3 +SELECT @@global.gtid_binlog_state; + +--echo #Connection 1 +--connection node_1 +SET AUTOCOMMIT=ON; +#drop table t1; +#CREATE TABLE t1 (f1 CHAR(255)) ENGINE=InnoDB; + +--echo #Connection 2 +--connection node_2 +SET AUTOCOMMIT=ON; +--echo #Connection 3 +--connection node_3 +SET AUTOCOMMIT=ON; + +# +#stop slave on node 2 +--echo #Connection 2 +--connection node_2 +STOP slave; +--sleep 1 +INSERT INTO t1 VALUES ('node2_slave_stoped'); + +--echo #Connection 1 +--connection node_1 +INSERT INTO t1 VALUES ('node1_normal_entry'); +--source include/save_master_gtid.inc + +#start slave +--echo #Connection 2 +--connection node_2 +INSERT INTO t1 VALUES ('node2_slave_stoped_inserted'); +start slave; +--source include/sync_with_master_gtid.inc +INSERT INTO t1 VALUES ('node2_slave_started'); +SELECT count(*) from t1; +SELECT @@global.gtid_binlog_state; + +--echo #Connection 3 +--connection node_3 +--let $wait_condition = SELECT COUNT(*) = 12 FROM t1; +--source include/wait_condition.inc +SELECT count(*) from t1; +SELECT @@global.gtid_binlog_state; + +--echo #Connection 1 +--connection node_1 +DROP TABLE t2,t1; + +# 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 3 + +--echo #Connection 2 +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; +--source include/wait_condition.inc + +--echo #Connection 3 +--connection node_3 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--echo #Connection 2 +--connection node_2 +STOP SLAVE; +RESET SLAVE ALL; +reset master; + +--echo #Connection 3 +--connection node_3 +reset master; + +--echo #Connection 1 +--connection node_1 +reset master; diff --git a/mysql-test/suite/galera_3nodes/galera_2x3nodes.cnf b/mysql-test/suite/galera_3nodes/galera_2x3nodes.cnf new file mode 100644 index 00000000..3f39b82f --- /dev/null +++ b/mysql-test/suite/galera_3nodes/galera_2x3nodes.cnf @@ -0,0 +1,122 @@ +# Use default setting for mysqld processes +!include include/default_mysqld.cnf + +[mysqld] +log-bin +log-slave-updates +binlog-format=row +innodb-autoinc-lock-mode=2 +default-storage-engine=innodb +wsrep_gtid_mode=1 +gtid_ignore_duplicates + +wsrep-on=1 +wsrep-provider=@ENV.WSREP_PROVIDER +wsrep_node_address=127.0.0.1 +# enforce read-committed characteristics across the cluster +# wsrep-causal-reads=ON +# wsrep-sync-wait=15 + +[mysqld.1] +#galera_port=@OPT.port +#ist_port=@OPT.port +#sst_port=@OPT.port +wsrep-cluster-address='gcomm://' +wsrep_provider_options='base_port=@mysqld.1.#galera_port;evs.suspect_timeout=PT300S;evs.inactive_timeout=PT1000M;evs.install_timeout=PT155S;evs.keepalive_period = PT100S' + +wsrep_sst_receive_address=127.0.0.2:@mysqld.1.#sst_port +wsrep_node_incoming_address=127.0.0.1:@mysqld.1.port +wsrep_sst_receive_address='127.0.0.1:@mysqld.1.#sst_port' + +[mysqld.2] +#galera_port=@OPT.port +#ist_port=@OPT.port +#sst_port=@OPT.port +wsrep_cluster_address='gcomm://127.0.0.1:@mysqld.1.#galera_port' +wsrep_provider_options='base_port=@mysqld.2.#galera_port;evs.suspect_timeout=PT300S;evs.inactive_timeout=PT1000M;evs.install_timeout=PT155S;evs.keepalive_period = PT100S' + +wsrep_sst_receive_address=127.0.0.2:@mysqld.2.#sst_port +wsrep_node_incoming_address=127.0.0.1:@mysqld.2.port +wsrep_sst_receive_address='127.0.0.1:@mysqld.2.#sst_port' + +[mysqld.3] +#galera_port=@OPT.port +#ist_port=@OPT.port +#sst_port=@OPT.port +wsrep_cluster_address='gcomm://127.0.0.1:@mysqld.1.#galera_port' +wsrep_provider_options='base_port=@mysqld.3.#galera_port;evs.suspect_timeout=PT300S;evs.inactive_timeout=PT1000M;evs.install_timeout=PT155S;evs.keepalive_period = PT100S' + +wsrep_sst_receive_address=127.0.0.2:@mysqld.3.#sst_port +wsrep_node_incoming_address=127.0.0.1:@mysqld.3.port +wsrep_sst_receive_address='127.0.0.1:@mysqld.3.#sst_port' + + +[mysqld.4] +wsrep_cluster_name=cluster2 +#galera_port=@OPT.port +#ist_port=@OPT.port +#sst_port=@OPT.port + +wsrep-cluster-address='gcomm://' +wsrep_provider_options='base_port=@mysqld.4.#galera_port;evs.suspect_timeout=PT300S;evs.inactive_timeout=PT1000M;evs.install_timeout=PT155S;evs.keepalive_period = PT100S' + +wsrep_sst_receive_address=127.0.0.2:@mysqld.4.#sst_port +wsrep_node_incoming_address=127.0.0.1:@mysqld.4.port +wsrep_sst_receive_address='127.0.0.1:@mysqld.4.#sst_port' + +[mysqld.5] +wsrep_cluster_name=cluster2 +#galera_port=@OPT.port +#ist_port=@OPT.port +#sst_port=@OPT.port +wsrep_cluster_address='gcomm://127.0.0.1:@mysqld.4.#galera_port' +wsrep_provider_options='base_port=@mysqld.5.#galera_port;evs.suspect_timeout=PT300S;evs.inactive_timeout=PT1000M;evs.install_timeout=PT155S;evs.keepalive_period = PT100S' + +wsrep_sst_receive_address=127.0.0.2:@mysqld.5.#sst_port +wsrep_node_incoming_address=127.0.0.1:@mysqld.5.port +wsrep_sst_receive_address='127.0.0.1:@mysqld.5.#sst_port' + +[mysqld.6] +wsrep_cluster_name=cluster2 +#galera_port=@OPT.port +#ist_port=@OPT.port +#sst_port=@OPT.port +wsrep_cluster_address='gcomm://127.0.0.1:@mysqld.4.#galera_port' +wsrep_provider_options='base_port=@mysqld.6.#galera_port;evs.suspect_timeout=PT300S;evs.inactive_timeout=PT1000M;evs.install_timeout=PT155S;evs.keepalive_period = PT100S' + +wsrep_sst_receive_address=127.0.0.2:@mysqld.6.#sst_port +wsrep_node_incoming_address=127.0.0.1:@mysqld.6.port +wsrep_sst_receive_address='127.0.0.1:@mysqld.6.#sst_port' + +[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_MYPORT_5= @mysqld.5.port +NODE_MYSOCK_5= @mysqld.5.socket + +NODE_MYPORT_6= @mysqld.6.port +NODE_MYSOCK_6= @mysqld.6.socket + +NODE_GALERAPORT_1= @mysqld.1.#galera_port +NODE_GALERAPORT_2= @mysqld.2.#galera_port +NODE_GALERAPORT_3= @mysqld.3.#galera_port +NODE_GALERAPORT_4= @mysqld.4.#galera_port +NODE_GALERAPORT_5= @mysqld.5.#galera_port +NODE_GALERAPORT_6= @mysqld.6.#galera_port + +NODE_SSTPORT_1= @mysqld.1.#sst_port +NODE_SSTPORT_2= @mysqld.2.#sst_port +NODE_SSTPORT_3= @mysqld.3.#sst_port +NODE_SSTPORT_4= @mysqld.4.#sst_port +NODE_SSTPORT_5= @mysqld.5.#sst_port +NODE_SSTPORT_6= @mysqld.6.#sst_port diff --git a/mysql-test/suite/galera_3nodes/include/have_ipv6.inc b/mysql-test/suite/galera_3nodes/include/have_ipv6.inc new file mode 100644 index 00000000..560cad03 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/include/have_ipv6.inc @@ -0,0 +1,15 @@ +# Check if ipv6 is available. +# +--disable_query_log +--disable_result_log +connect (checkcon123456789,::1,root,,test); +if($mysql_errno) +{ + skip No IPv6 support; +} +connection default; +disconnect checkcon123456789; +--enable_result_log +--enable_query_log +# end check + diff --git a/mysql-test/suite/galera_3nodes/r/galera_gtid_2_cluster.result b/mysql-test/suite/galera_3nodes/r/galera_gtid_2_cluster.result new file mode 100644 index 00000000..35ca8411 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/r/galera_gtid_2_cluster.result @@ -0,0 +1,231 @@ +cluster 1 node 1 +SHOW STATUS LIKE 'wsrep_cluster_size'; +Variable_name Value +wsrep_cluster_size 3 +cluster 1 node 2 +SHOW STATUS LIKE 'wsrep_cluster_size'; +Variable_name Value +wsrep_cluster_size 3 +cluster 1 node 3 +SHOW STATUS LIKE 'wsrep_cluster_size'; +Variable_name Value +wsrep_cluster_size 3 +cluster 2 node 1 +SHOW STATUS LIKE 'wsrep_cluster_size'; +Variable_name Value +wsrep_cluster_size 3 +cluster 2 node 2 +SHOW STATUS LIKE 'wsrep_cluster_size'; +Variable_name Value +wsrep_cluster_size 3 +cluster 2 node 3 +SHOW STATUS LIKE 'wsrep_cluster_size'; +Variable_name Value +wsrep_cluster_size 3 +change master to master_host='127.0.0.1', master_user='root', master_port=NODE_MYPORT_4, master_use_gtid=current_pos, ignore_server_ids=(12,13);; +start slave; +include/wait_for_slave_to_start.inc +select @@gtid_binlog_state; +@@gtid_binlog_state + +select @@gtid_slave_pos; +@@gtid_slave_pos + +change master to master_host='127.0.0.1', master_user='root', master_port=NODE_MYPORT_1, master_use_gtid=current_pos, ignore_server_ids=(22,23);; +start slave; +include/wait_for_slave_to_start.inc +select @@gtid_binlog_state; +@@gtid_binlog_state + +select @@gtid_slave_pos; +@@gtid_slave_pos + +cluster 1 node 1 +create table t1 (cluster_domain_id int ,node_server_id int, seq_no int); +insert into t1 values (1, 11, 2); +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-2 +#wait for sync cluster 1 and 2 +include/save_master_gtid.inc +include/sync_with_master_gtid.inc +cluster 2 node 1 +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-2 +insert into t1 values (2, 21, 1); +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-2,2-21-1 +select * from t1; +cluster_domain_id node_server_id seq_no +1 11 2 +2 21 1 +#wait for sync cluster 1 and 2 +include/save_master_gtid.inc +include/sync_with_master_gtid.inc +cluster 1 node 2 +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-2,2-21-1 +insert into t1 values (1, 12, 3); +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-2,1-12-3,2-21-1 +#wait for sync cluster 1 and 2 +include/save_master_gtid.inc +include/sync_with_master_gtid.inc +cluster 1 node 3 +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-2,1-12-3,2-21-1 +insert into t1 values (1, 13, 4); +select @@gtid_binlog_state; +@@gtid_binlog_state +1-12-3,1-11-2,1-13-4,2-21-1 +#wait for sync cluster 1 and 2 +include/save_master_gtid.inc +include/sync_with_master_gtid.inc +cluster 2 node 2 +select @@gtid_binlog_state; +@@gtid_binlog_state +1-12-3,1-11-2,1-13-4,2-21-1 +insert into t1 values (2, 22, 2); +select @@gtid_binlog_state; +@@gtid_binlog_state +1-12-3,1-11-2,1-13-4,2-21-1,2-22-2 +#wait for sync cluster 2 and 1 +include/save_master_gtid.inc +include/sync_with_master_gtid.inc +cluster 2 node 3 +select @@gtid_binlog_state; +@@gtid_binlog_state +1-12-3,1-11-2,1-13-4,2-21-1,2-22-2 +insert into t1 values (2, 23, 3); +select @@gtid_binlog_state; +@@gtid_binlog_state +1-12-3,1-11-2,1-13-4,2-21-1,2-22-2,2-23-3 +#wait for sync cluster 2 and 1 +include/save_master_gtid.inc +include/sync_with_master_gtid.inc +cluster 1 node 1 +select @@gtid_binlog_state; +@@gtid_binlog_state +1-12-3,1-11-2,1-13-4,2-21-1,2-22-2,2-23-3 +drop table t1; +stop slave; +reset slave; +change master to master_use_gtid=no, ignore_server_ids=(); +reset master; +set global GTID_SLAVE_POS=""; +cluster 2 node 1 +stop slave; +reset slave; +change master to master_use_gtid=no, ignore_server_ids=(); +reset master; +set global GTID_SLAVE_POS=""; +reset master; +reset master; +reset master; +reset master; +change master to master_host='127.0.0.1', master_user='root', master_port=NODE_MYPORT_6, master_use_gtid=current_pos, ignore_server_ids=(12,13);; +start slave; +include/wait_for_slave_to_start.inc +select @@gtid_binlog_state; +@@gtid_binlog_state + +select @@gtid_slave_pos; +@@gtid_slave_pos + +change master to master_host='127.0.0.1', master_user='root', master_port=NODE_MYPORT_3, master_use_gtid=current_pos, ignore_server_ids=(22,23);; +start slave; +include/wait_for_slave_to_start.inc +select @@gtid_binlog_state; +@@gtid_binlog_state + +select @@gtid_slave_pos; +@@gtid_slave_pos + +cluster 1 node 1 +create table t1 (cluster_domain_id int ,node_server_id int, seq_no int); +insert into t1 values (1, 11, 2); +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-2 +#wait for sync cluster 1 and 2 +include/save_master_gtid.inc +include/sync_with_master_gtid.inc +cluster 2 node 1 +insert into t1 values (2, 21, 1); +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-2,2-21-1 +select * from t1; +cluster_domain_id node_server_id seq_no +1 11 2 +2 21 1 +#wait for sync cluster 1 and 2 +include/save_master_gtid.inc +include/sync_with_master_gtid.inc +cluster 1 node 2 +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-2,2-21-1 +insert into t1 values (1, 12, 3); +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-2,1-12-3,2-21-1 +#wait for sync cluster 1 and 2 +include/save_master_gtid.inc +include/sync_with_master_gtid.inc +cluster 1 node 3 +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-2,1-12-3,2-21-1 +insert into t1 values (1, 13, 4); +select @@gtid_binlog_state; +@@gtid_binlog_state +1-12-3,1-11-2,1-13-4,2-21-1 +#wait for sync cluster 1 and 2 +include/save_master_gtid.inc +include/sync_with_master_gtid.inc +cluster 2 node 2 +select @@gtid_binlog_state; +@@gtid_binlog_state +1-12-3,1-11-2,1-13-4,2-21-1 +insert into t1 values (2, 22, 2); +select @@gtid_binlog_state; +@@gtid_binlog_state +1-12-3,1-11-2,1-13-4,2-21-1,2-22-2 +#wait for sync cluster 2 and 1 +include/save_master_gtid.inc +include/sync_with_master_gtid.inc +cluster 2 node 3 +select @@gtid_binlog_state; +@@gtid_binlog_state +1-12-3,1-11-2,1-13-4,2-21-1,2-22-2 +insert into t1 values (2, 23, 3); +select @@gtid_binlog_state; +@@gtid_binlog_state +1-12-3,1-11-2,1-13-4,2-21-1,2-22-2,2-23-3 +#wait for sync cluster 2 and 1 +include/save_master_gtid.inc +include/sync_with_master_gtid.inc +cluster 1 node 1 +select @@gtid_binlog_state; +@@gtid_binlog_state +1-12-3,1-11-2,1-13-4,2-21-1,2-22-2,2-23-3 +drop table t1; +stop slave; +change master to master_use_gtid=no, ignore_server_ids=(); +reset master; +set global GTID_SLAVE_POS=""; +cluster 2 node 1 +stop slave; +change master to master_use_gtid=no, ignore_server_ids=(); +reset master; +set global GTID_SLAVE_POS=""; +reset master; +reset master; +reset master; +reset master; diff --git a/mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.cnf b/mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.cnf new file mode 100644 index 00000000..dc5535ef --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.cnf @@ -0,0 +1,28 @@ +# We need a dedicated .cnf file, even if empty, in order to force this test to run +# alone on a freshly started cluster. Otherwise there are adverse interactions with +# following tests such as galera_3nodes.galera_var_dirty_reads2 + +!include ../galera_2x3nodes.cnf +[mysqld.1] +wsrep_gtid_domain_id=1 +server-id=11 + +[mysqld.2] +wsrep_gtid_domain_id=1 +server-id=12 + +[mysqld.3] +wsrep_gtid_domain_id=1 +server-id=13 + +[mysqld.4] +wsrep_gtid_domain_id=2 +server-id=21 + +[mysqld.5] +wsrep_gtid_domain_id=2 +server-id=22 + +[mysqld.6] +wsrep_gtid_domain_id=2 +server-id=23 diff --git a/mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.test b/mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.test new file mode 100644 index 00000000..c679db13 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.test @@ -0,0 +1,292 @@ +# +# This test creates 2x 3 nodes galera cluster. +# The whole test case +# A <-> B <-> C {Galera cluster 1} +# | {Circular Async replication} +# D <-> E <-> F {Galera cluster 2} +# We will write on any random node to see if gtid is consitent or not +# Then we will kill node D and set up the replication between A and E +# To see whether fail over works or not. + +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +--echo cluster 1 node 1 +SHOW STATUS LIKE 'wsrep_cluster_size'; + +--connection node_2 +--echo cluster 1 node 2 +SHOW STATUS LIKE 'wsrep_cluster_size'; + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connection node_3 +--echo cluster 1 node 3 +SHOW STATUS LIKE 'wsrep_cluster_size'; + +--connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4 +--connection node_4 +--echo cluster 2 node 1 +SHOW STATUS LIKE 'wsrep_cluster_size'; + +--connect node_5, 127.0.0.1, root, , test, $NODE_MYPORT_5 +--connection node_5 +--echo cluster 2 node 2 +SHOW STATUS LIKE 'wsrep_cluster_size'; + +--connect node_6, 127.0.0.1, root, , test, $NODE_MYPORT_6 +--connection node_6 +--echo cluster 2 node 3 +SHOW STATUS LIKE 'wsrep_cluster_size'; +#--disable_parsing +--connection node_1 +--replace_result $NODE_MYPORT_4 NODE_MYPORT_4 +--eval change master to master_host='127.0.0.1', master_user='root', master_port=$NODE_MYPORT_4, master_use_gtid=current_pos, ignore_server_ids=(12,13); +start slave; +--source include/wait_for_slave_to_start.inc +select @@gtid_binlog_state; +select @@gtid_slave_pos; +#--query_vertical SHOW SLAVE STATUS; + +--connection node_4 +--replace_result $NODE_MYPORT_1 NODE_MYPORT_1 +--eval change master to master_host='127.0.0.1', master_user='root', master_port=$NODE_MYPORT_1, master_use_gtid=current_pos, ignore_server_ids=(22,23); +start slave; +--source include/wait_for_slave_to_start.inc +select @@gtid_binlog_state; +select @@gtid_slave_pos; +#--query_vertical SHOW SLAVE STATUS; + +--echo cluster 1 node 1 +--connection node_1 +create table t1 (cluster_domain_id int ,node_server_id int, seq_no int); +insert into t1 values (1, 11, 2); +select @@gtid_binlog_state; + +--echo #wait for sync cluster 1 and 2 +--connection node_1 +--source include/save_master_gtid.inc +--connection node_4 +--source include/sync_with_master_gtid.inc + +--echo cluster 2 node 1 +--connection node_4 +select @@gtid_binlog_state; +insert into t1 values (2, 21, 1); +select @@gtid_binlog_state; +select * from t1; +--echo #wait for sync cluster 1 and 2 +--connection node_1 +--source include/save_master_gtid.inc +--connection node_4 +--source include/sync_with_master_gtid.inc + + +--echo cluster 1 node 2 +--connection node_2 +select @@gtid_binlog_state; +insert into t1 values (1, 12, 3); +select @@gtid_binlog_state; + +--echo #wait for sync cluster 1 and 2 +--connection node_1 +--source include/save_master_gtid.inc +--connection node_4 +--source include/sync_with_master_gtid.inc + +--echo cluster 1 node 3 +--connection node_3 +select @@gtid_binlog_state; +insert into t1 values (1, 13, 4); +select @@gtid_binlog_state; + +--echo #wait for sync cluster 1 and 2 +--connection node_1 +--source include/save_master_gtid.inc +--connection node_4 +--source include/sync_with_master_gtid.inc + +--echo cluster 2 node 2 +--connection node_5 +select @@gtid_binlog_state; +insert into t1 values (2, 22, 2); +select @@gtid_binlog_state; + +--echo #wait for sync cluster 2 and 1 +--connection node_4 +--source include/save_master_gtid.inc +--connection node_1 +--source include/sync_with_master_gtid.inc + +--echo cluster 2 node 3 +--connection node_6 +select @@gtid_binlog_state; +insert into t1 values (2, 23, 3); +select @@gtid_binlog_state; + +--echo #wait for sync cluster 2 and 1 +--connection node_4 +--source include/save_master_gtid.inc +--connection node_1 +--source include/sync_with_master_gtid.inc + + +--echo cluster 1 node 1 +--connection node_1 +select @@gtid_binlog_state; +drop table t1; +stop slave; +reset slave; +change master to master_use_gtid=no, ignore_server_ids=(); +reset master; +set global GTID_SLAVE_POS=""; +--sleep 2 + +--echo cluster 2 node 1 +--connection node_4 +stop slave; +reset slave; +change master to master_use_gtid=no, ignore_server_ids=(); +reset master; +set global GTID_SLAVE_POS=""; + +--connection node_2 +reset master; +--connection node_3 +reset master; +--connection node_5 +reset master; +--connection node_6 +reset master; +#--enable_parsing +# +# This test creates 2x 3 nodes galera cluster. +# The whole test case +# A <-> B <-> C {Galera cluster 1} +# \ / +# \ / +# / {C->D, F->A , Async normal slave repl} +# / \ +# | \ +# D <-> E <-> F {Galera cluster 2} +# We will write on any random node to see if gtid is consitent or not +# Then we will kill node D and set up the replication between A and E +# To see whether fail over works or not. +--connection node_1 +--replace_result $NODE_MYPORT_6 NODE_MYPORT_6 +--eval change master to master_host='127.0.0.1', master_user='root', master_port=$NODE_MYPORT_6, master_use_gtid=current_pos, ignore_server_ids=(12,13); +start slave; +--source include/wait_for_slave_to_start.inc +select @@gtid_binlog_state; +select @@gtid_slave_pos; +#--query_vertical SHOW SLAVE STATUS; + +--connection node_4 +--replace_result $NODE_MYPORT_3 NODE_MYPORT_3 +--eval change master to master_host='127.0.0.1', master_user='root', master_port=$NODE_MYPORT_3, master_use_gtid=current_pos, ignore_server_ids=(22,23); +start slave; +--source include/wait_for_slave_to_start.inc +select @@gtid_binlog_state; +select @@gtid_slave_pos; +#--query_vertical SHOW SLAVE STATUS; + +--echo cluster 1 node 1 +--connection node_1 +create table t1 (cluster_domain_id int ,node_server_id int, seq_no int); +insert into t1 values (1, 11, 2); + +select @@gtid_binlog_state; + +--echo #wait for sync cluster 1 and 2 +--connection node_1 +--source include/save_master_gtid.inc +--connection node_4 +--source include/sync_with_master_gtid.inc +--sleep 2 +--echo cluster 2 node 1 +--connection node_4 +insert into t1 values (2, 21, 1); +select @@gtid_binlog_state; +select * from t1; + +--echo #wait for sync cluster 1 and 2 +--connection node_1 +--source include/save_master_gtid.inc +--connection node_4 +--source include/sync_with_master_gtid.inc + + +--echo cluster 1 node 2 +--connection node_2 +select @@gtid_binlog_state; +insert into t1 values (1, 12, 3); +select @@gtid_binlog_state; + +--echo #wait for sync cluster 1 and 2 +--connection node_1 +--source include/save_master_gtid.inc +--connection node_4 +--source include/sync_with_master_gtid.inc + +--echo cluster 1 node 3 +--connection node_3 +select @@gtid_binlog_state; +insert into t1 values (1, 13, 4); +select @@gtid_binlog_state; + +--echo #wait for sync cluster 1 and 2 +--connection node_1 +--source include/save_master_gtid.inc +--connection node_4 +--source include/sync_with_master_gtid.inc + +--echo cluster 2 node 2 +--connection node_5 +select @@gtid_binlog_state; +insert into t1 values (2, 22, 2); +select @@gtid_binlog_state; + +--echo #wait for sync cluster 2 and 1 +--connection node_4 +--source include/save_master_gtid.inc +--connection node_1 +--source include/sync_with_master_gtid.inc + +--echo cluster 2 node 3 +--connection node_6 +select @@gtid_binlog_state; +insert into t1 values (2, 23, 3); +select @@gtid_binlog_state; + +--echo #wait for sync cluster 2 and 1 +--connection node_4 +--source include/save_master_gtid.inc +--connection node_1 +--source include/sync_with_master_gtid.inc + + +--echo cluster 1 node 1 +--connection node_1 +select @@gtid_binlog_state; +drop table t1; +stop slave; +change master to master_use_gtid=no, ignore_server_ids=(); +reset master; +set global GTID_SLAVE_POS=""; + +--echo cluster 2 node 1 +--connection node_4 +stop slave; +change master to master_use_gtid=no, ignore_server_ids=(); +reset master; +set global GTID_SLAVE_POS=""; + +--connection node_2 +reset master; +--connection node_3 +reset master; +--connection node_5 +reset master; +--connection node_6 +reset master; diff --git a/mysql-test/suite/galera_3nodes/t/galera_innobackupex_backup.test b/mysql-test/suite/galera_3nodes/t/galera_innobackupex_backup.test index a6660bd0..cc3f42c7 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_innobackupex_backup.test +++ b/mysql-test/suite/galera_3nodes/t/galera_innobackupex_backup.test @@ -16,7 +16,7 @@ SELECT COUNT(*) = 10 FROM t1; --exec innobackupex --defaults-file=$MYSQLTEST_VARDIR/my.cnf --defaults-group=mysqld.2 $MYSQL_TMP_DIR/innobackupex_backup --galera-info --port=$NODE_MYPORT_2 --host=127.0.0.1 --no-timestamp > $MYSQL_TMP_DIR/innobackupex-backup.log --exec innobackupex --defaults-file=$MYSQLTEST_VARDIR/my.cnf --defaults-group=mysqld.2 $MYSQL_TMP_DIR/innobackupex_backup --apply-log --galera-info --port=$NODE_MYPORT_2 --host=127.0.0.1 --no-timestamp > $MYSQL_TMP_DIR/innobackupex-apply.log ---source include/kill_galera.inc +--source ../galera/include/kill_galera.inc --sleep 1 --connection node_1 diff --git a/mysql-test/suite/galera_3nodes/t/galera_safe_to_bootstrap.test b/mysql-test/suite/galera_3nodes/t/galera_safe_to_bootstrap.test index 7c9991e6..88d0cfba 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_safe_to_bootstrap.test +++ b/mysql-test/suite/galera_3nodes/t/galera_safe_to_bootstrap.test @@ -108,7 +108,7 @@ SET SESSION wsrep_on = OFF; --let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; --source include/wait_condition.inc ---source include/kill_galera.inc +--source ../galera/include/kill_galera.inc # # Only node #1 should have safe_to_bootstrap: 1 diff --git a/mysql-test/suite/innodb/r/innodb-index-online.result b/mysql-test/suite/innodb/r/innodb-index-online.result index d6941770..efbc5c14 100644 --- a/mysql-test/suite/innodb/r/innodb-index-online.result +++ b/mysql-test/suite/innodb/r/innodb-index-online.result @@ -426,6 +426,22 @@ ERROR 42000: Duplicate key name 'c2h' SET DEBUG_SYNC = 'RESET'; SET GLOBAL innodb_monitor_disable = module_ddl; DROP TABLE t1; +# +# MDEV-13205 assertion !dict_index_is_online_ddl(index) upon ALTER TABLE +# +CREATE TABLE t1 (c VARCHAR(64)) ENGINE=InnoDB; +SET DEBUG_SYNC = 'row_log_apply_before SIGNAL t1u_created WAIT_FOR dup_done'; +ALTER TABLE t1 ADD UNIQUE(c); +SET DEBUG_SYNC = 'now WAIT_FOR t1u_created'; +BEGIN; +INSERT INTO t1 VALUES('bar'),('bar'); +SET DEBUG_SYNC = 'now SIGNAL dup_done'; +ERROR 23000: Duplicate entry 'bar' for key 'c' +SET DEBUG_SYNC = 'RESET'; +CREATE TABLE t2 (c VARCHAR(64)) ENGINE=InnoDB; +ALTER TABLE t2 ADD FOREIGN KEY (c) REFERENCES t1 (c); +ERROR HY000: Can't create table `test`.`#sql-temporary` (errno: 150 "Foreign key constraint is incorrectly formed") +DROP TABLE t2,t1; SET GLOBAL innodb_file_per_table = @global_innodb_file_per_table_orig; SET GLOBAL innodb_monitor_enable = default; SET GLOBAL innodb_monitor_disable = default; diff --git a/mysql-test/suite/innodb/r/innodb-lru-force-no-free-page.result b/mysql-test/suite/innodb/r/innodb-lru-force-no-free-page.result new file mode 100644 index 00000000..dba01945 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-lru-force-no-free-page.result @@ -0,0 +1,10 @@ +call mtr.add_suppression("InnoDB: Difficult to find free blocks in the buffer pool"); +SET @saved_debug = @@SESSION.debug_dbug; +SET SESSION debug_dbug="+d,ib_lru_force_no_free_page"; +CREATE TABLE t1 (j LONGBLOB) ENGINE = InnoDB; +BEGIN; +INSERT INTO t1 VALUES (repeat('abcdefghijklmnopqrstuvwxyz',200)); +COMMIT; +SET debug_dbug = @saved_debug; +DROP TABLE t1; +FOUND /InnoDB: Difficult to find free blocks / in mysqld.1.err diff --git a/mysql-test/suite/innodb/r/innodb-replace-debug.result b/mysql-test/suite/innodb/r/innodb-replace-debug.result index 84bc9dc9..989fb055 100644 --- a/mysql-test/suite/innodb/r/innodb-replace-debug.result +++ b/mysql-test/suite/innodb/r/innodb-replace-debug.result @@ -4,10 +4,11 @@ create table t1 (f1 int primary key, f2 int, f3 int, unique key k1(f2), key k2(f3)) engine=innodb; insert into t1 values (14, 24, 34); -set @@debug_dbug = '+d,row_ins_sec_index_entry_timeout'; +set @old_dbug= @@session.debug_dbug; +set debug_dbug = '+d,row_ins_sec_index_entry_timeout'; replace into t1 values (14, 25, 34); select * from t1; f1 f2 f3 14 25 34 drop table t1; -set @@debug_dbug = '-d,row_ins_sec_index_entry_timeout'; +set debug_dbug = @old_dbug; diff --git a/mysql-test/suite/innodb/r/innodb.result b/mysql-test/suite/innodb/r/innodb.result index d50b9b36..3255b61d 100644 --- a/mysql-test/suite/innodb/r/innodb.result +++ b/mysql-test/suite/innodb/r/innodb.result @@ -1,3 +1,5 @@ +create temporary table t (a char(1) character set filename) engine=innodb; +drop temporary table t; set optimizer_switch = 'mrr=on,mrr_sort_keys=on,index_condition_pushdown=on'; drop table if exists t1,t2,t3,t4; drop database if exists mysqltest; @@ -3144,3 +3146,83 @@ show status like "handler_read_key"; Variable_name Value Handler_read_key 0 drop table t1; +CREATE TABLE t1 (c1 INT) ENGINE=InnoDB; +CREATE TEMPORARY TABLE t2 (c1 INT) ENGINE=InnoDB; +START TRANSACTION READ ONLY; +INSERT INTO t2 VALUES(0); +INSERT INTO t1 VALUES(0); +ERROR 25006: Cannot execute statement in a READ ONLY transaction. +ROLLBACK; +SELECT * FROM t1; +c1 +SELECT * FROM t2; +c1 +START TRANSACTION READ ONLY; +INSERT INTO t1 VALUES(0); +ERROR 25006: Cannot execute statement in a READ ONLY transaction. +INSERT INTO t2 VALUES(1); +COMMIT; +SET TRANSACTION READ ONLY; +START TRANSACTION; +INSERT INTO t2 VALUES(3); +INSERT INTO t1 VALUES(0); +ERROR 25006: Cannot execute statement in a READ ONLY transaction. +COMMIT; +SELECT * FROM t1; +c1 +SELECT * FROM t2; +c1 +1 +3 +DROP TABLE t2; +CREATE TEMPORARY TABLE t2 ( +c1 INT AUTO_INCREMENT PRIMARY KEY, +c2 INT, INDEX idx(c2)) ENGINE=InnoDB; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TEMPORARY TABLE `t2` ( + `c1` int(11) NOT NULL AUTO_INCREMENT, + `c2` int(11) DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `idx` (`c2`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +START TRANSACTION READ ONLY; +INSERT INTO t2 VALUES(NULL,1),(NULL,2),(NULL,3); +INSERT INTO t1 VALUES(0); +ERROR 25006: Cannot execute statement in a READ ONLY transaction. +ROLLBACK; +SELECT * FROM t1; +c1 +SELECT * FROM t2; +c1 c2 +START TRANSACTION READ ONLY; +INSERT INTO t1 VALUES(0); +ERROR 25006: Cannot execute statement in a READ ONLY transaction. +INSERT INTO t2 VALUES(NULL,1),(NULL,2),(NULL,3); +COMMIT; +SET TRANSACTION READ ONLY; +START TRANSACTION; +INSERT INTO t2 VALUES(NULL,1),(NULL,2),(NULL,3); +INSERT INTO t1 VALUES(0); +ERROR 25006: Cannot execute statement in a READ ONLY transaction. +COMMIT; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TEMPORARY TABLE `t2` ( + `c1` int(11) NOT NULL AUTO_INCREMENT, + `c2` int(11) DEFAULT NULL, + PRIMARY KEY (`c1`), + KEY `idx` (`c2`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1 +SELECT * FROM t1; +c1 +SELECT * FROM t2; +c1 c2 +4 1 +7 1 +5 2 +8 2 +6 3 +9 3 +DROP TABLE t1; +DROP TABLE t2; diff --git a/mysql-test/suite/innodb/r/innodb_corrupt_bit.result b/mysql-test/suite/innodb/r/innodb_corrupt_bit.result index 0ef6f65d..b3392c1a 100644 --- a/mysql-test/suite/innodb/r/innodb_corrupt_bit.result +++ b/mysql-test/suite/innodb/r/innodb_corrupt_bit.result @@ -1,26 +1,62 @@ +set names utf8; +SET UNIQUE_CHECKS=0; +CREATE TABLE corrupt_bit_test_ā( +a INT AUTO_INCREMENT PRIMARY KEY, +b CHAR(100), +c INT, +z INT, +INDEX idx(b)) +ENGINE=InnoDB; +INSERT INTO corrupt_bit_test_ā VALUES(0,'x',1, 1); +CREATE UNIQUE INDEX idxā ON corrupt_bit_test_ā(c, b); +CREATE UNIQUE INDEX idxē ON corrupt_bit_test_ā(z, b); +SELECT * FROM corrupt_bit_test_ā; a b c z 1 x 1 1 +INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+1,z+1 FROM corrupt_bit_test_ā; +select count(*) from corrupt_bit_test_ā; count(*) 2 +SET @save_dbug = @@SESSION.debug_dbug; +SET debug_dbug = '+d,dict_set_index_corrupted'; +check table corrupt_bit_test_ā; Table Op Msg_type Msg_text test.corrupt_bit_test_ā check Warning InnoDB: Index "idx" is marked as corrupted test.corrupt_bit_test_ā check Warning InnoDB: Index "idxā" is marked as corrupted test.corrupt_bit_test_ā check Warning InnoDB: Index "idxē" is marked as corrupted test.corrupt_bit_test_ā check error Corrupt +SET debug_dbug = @save_dbug; +CREATE INDEX idx3 ON corrupt_bit_test_ā(b, c); ERROR HY000: Index "idx" is corrupted +CREATE INDEX idx4 ON corrupt_bit_test_ā(b, z); ERROR HY000: Index "idx" is corrupted +select c from corrupt_bit_test_ā; ERROR HY000: Index corrupt_bit_test_ā is corrupted +select z from corrupt_bit_test_ā; ERROR HY000: Index corrupt_bit_test_ā is corrupted +show warnings; Level Code Message Warning 180 InnoDB: Index "idxē" for table "test"."corrupt_bit_test_ā" is marked as corrupted Error 1712 Index corrupt_bit_test_ā is corrupted +insert into corrupt_bit_test_ā values (10001, "a", 20001, 20001); +select * from corrupt_bit_test_ā use index(primary) where a = 10001; a b c z 10001 a 20001 20001 +begin; +insert into corrupt_bit_test_ā values (10002, "a", 20002, 20002); +delete from corrupt_bit_test_ā where a = 10001; +insert into corrupt_bit_test_ā values (10001, "a", 20001, 20001); +rollback; +drop index idxā on corrupt_bit_test_ā; +check table corrupt_bit_test_ā; Table Op Msg_type Msg_text test.corrupt_bit_test_ā check Warning InnoDB: Index "idx" is marked as corrupted test.corrupt_bit_test_ā check Warning InnoDB: Index "idxē" is marked as corrupted test.corrupt_bit_test_ā check error Corrupt +set names utf8; +select z from corrupt_bit_test_ā; ERROR HY000: Index corrupt_bit_test_ā is corrupted +show create table corrupt_bit_test_ā; Table Create Table corrupt_bit_test_ā CREATE TABLE `corrupt_bit_test_ā` ( `a` int(11) NOT NULL AUTO_INCREMENT, @@ -31,8 +67,12 @@ corrupt_bit_test_ā CREATE TABLE `corrupt_bit_test_ā` ( UNIQUE KEY `idxē` (`z`,`b`), KEY `idx` (`b`) ) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=latin1 +drop index idxē on corrupt_bit_test_ā; +CREATE INDEX idx3 ON corrupt_bit_test_ā(b, c); ERROR HY000: Index "idx" is corrupted +CREATE INDEX idx4 ON corrupt_bit_test_ā(b, z); ERROR HY000: Index "idx" is corrupted +show create table corrupt_bit_test_ā; Table Create Table corrupt_bit_test_ā CREATE TABLE `corrupt_bit_test_ā` ( `a` int(11) NOT NULL AUTO_INCREMENT, @@ -42,7 +82,12 @@ corrupt_bit_test_ā CREATE TABLE `corrupt_bit_test_ā` ( PRIMARY KEY (`a`), KEY `idx` (`b`) ) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=latin1 +drop index idx on corrupt_bit_test_ā; +CREATE INDEX idx3 ON corrupt_bit_test_ā(b, c); +CREATE INDEX idx4 ON corrupt_bit_test_ā(b, z); +select z from corrupt_bit_test_ā limit 10; z 20001 1 2 +drop table corrupt_bit_test_ā; diff --git a/mysql-test/suite/innodb/t/innodb-index-online.test b/mysql-test/suite/innodb/t/innodb-index-online.test index 5509d985..efe1c796 100644 --- a/mysql-test/suite/innodb/t/innodb-index-online.test +++ b/mysql-test/suite/innodb/t/innodb-index-online.test @@ -457,8 +457,6 @@ connection default; reap; --enable_parsing #remove below con1 disconnect if above test case is enabled -connection con1; -disconnect con1; connection default; SHOW CREATE TABLE t1; @@ -474,6 +472,31 @@ SET GLOBAL innodb_monitor_disable = module_ddl; DROP TABLE t1; +--echo # +--echo # MDEV-13205 assertion !dict_index_is_online_ddl(index) upon ALTER TABLE +--echo # +CREATE TABLE t1 (c VARCHAR(64)) ENGINE=InnoDB; +SET DEBUG_SYNC = 'row_log_apply_before SIGNAL t1u_created WAIT_FOR dup_done'; +send ALTER TABLE t1 ADD UNIQUE(c); + +connection con1; +SET DEBUG_SYNC = 'now WAIT_FOR t1u_created'; +BEGIN; +INSERT INTO t1 VALUES('bar'),('bar'); +SET DEBUG_SYNC = 'now SIGNAL dup_done'; + +connection default; +--error ER_DUP_ENTRY +reap; + +SET DEBUG_SYNC = 'RESET'; +disconnect con1; +CREATE TABLE t2 (c VARCHAR(64)) ENGINE=InnoDB; +--replace_regex /#sql-[0-9a-f_]*/#sql-temporary/ +--error ER_CANT_CREATE_TABLE +ALTER TABLE t2 ADD FOREIGN KEY (c) REFERENCES t1 (c); +DROP TABLE t2,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-lru-force-no-free-page.test b/mysql-test/suite/innodb/t/innodb-lru-force-no-free-page.test new file mode 100644 index 00000000..fe04f4b7 --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-lru-force-no-free-page.test @@ -0,0 +1,25 @@ +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/not_embedded.inc + +call mtr.add_suppression("InnoDB: Difficult to find free blocks in the buffer pool"); + +SET @saved_debug = @@SESSION.debug_dbug; +SET SESSION debug_dbug="+d,ib_lru_force_no_free_page"; + +CREATE TABLE t1 (j LONGBLOB) ENGINE = InnoDB; +BEGIN; +INSERT INTO t1 VALUES (repeat('abcdefghijklmnopqrstuvwxyz',200)); +COMMIT; + +SET debug_dbug = @saved_debug; + +DROP TABLE t1; + +# +# There should be only one message +# +let SEARCH_RANGE= -50000; +let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err; +--let SEARCH_PATTERN=InnoDB: Difficult to find free blocks +--source include/search_pattern_in_file.inc diff --git a/mysql-test/suite/innodb/t/innodb-master.opt b/mysql-test/suite/innodb/t/innodb-master.opt index 5266978e..2e71d622 100644 --- a/mysql-test/suite/innodb/t/innodb-master.opt +++ b/mysql-test/suite/innodb/t/innodb-master.opt @@ -2,3 +2,5 @@ --default-storage-engine=MyISAM --innodb-strict-mode=0 --innodb-file-per-table=0 +--loose-innodb-track-changed-pages +--loose-innodb-log-archive diff --git a/mysql-test/suite/innodb/t/innodb-replace-debug.test b/mysql-test/suite/innodb/t/innodb-replace-debug.test index 5cec9e1f..7e710ae1 100644 --- a/mysql-test/suite/innodb/t/innodb-replace-debug.test +++ b/mysql-test/suite/innodb/t/innodb-replace-debug.test @@ -8,8 +8,9 @@ create table t1 (f1 int primary key, f2 int, f3 int, unique key k1(f2), key k2(f3)) engine=innodb; insert into t1 values (14, 24, 34); -set @@debug_dbug = '+d,row_ins_sec_index_entry_timeout'; +set @old_dbug= @@session.debug_dbug; +set debug_dbug = '+d,row_ins_sec_index_entry_timeout'; replace into t1 values (14, 25, 34); select * from t1; drop table t1; -set @@debug_dbug = '-d,row_ins_sec_index_entry_timeout'; +set debug_dbug = @old_dbug; diff --git a/mysql-test/suite/innodb/t/innodb.test b/mysql-test/suite/innodb/t/innodb.test index 2e7306c8..087d0c6a 100644 --- a/mysql-test/suite/innodb/t/innodb.test +++ b/mysql-test/suite/innodb/t/innodb.test @@ -1,18 +1,3 @@ -####################################################################### -# # -# Please, DO NOT TOUCH this file as well as the innodb.result file. # -# These files are to be modified ONLY BY INNOBASE guys. # -# # -# Use innodb_mysql.[test|result] files instead. # -# # -# If nevertheless you need to make some changes here, please, forward # -# your commit message # -# To: innodb_dev_ww@oracle.com # -# Cc: dev-innodb@mysql.com # -# (otherwise your changes may be erased). # -# # -####################################################################### - -- source include/have_innodb.inc -- source include/have_innodb_16k.inc @@ -20,6 +5,10 @@ let $MYSQLD_DATADIR= `select @@datadir`; let collation=utf8_unicode_ci; --source include/have_collation.inc + +create temporary table t (a char(1) character set filename) engine=innodb; +drop temporary table t; + set optimizer_switch = 'mrr=on,mrr_sort_keys=on,index_condition_pushdown=on'; # Save the original values of some variables in order to be able to @@ -2530,17 +2519,73 @@ select f1 from t1; show status like "handler_read_key"; drop table t1; -####################################################################### -# # -# Please, DO NOT TOUCH this file as well as the innodb.result file. # -# These files are to be modified ONLY BY INNOBASE guys. # -# # -# Use innodb_mysql.[test|result] files instead. # -# # -# If nevertheless you need to make some changes here, please, forward # -# your commit message # -# To: innodb_dev_ww@oracle.com # -# Cc: dev-innodb@mysql.com # -# (otherwise your changes may be erased). # -# # -####################################################################### +# +# Test handling of writes to TEMPORARY tables for read-only transactions +# +CREATE TABLE t1 (c1 INT) ENGINE=InnoDB; +CREATE TEMPORARY TABLE t2 (c1 INT) ENGINE=InnoDB; + +# Check that the rollback works +START TRANSACTION READ ONLY; +INSERT INTO t2 VALUES(0); +--error ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION +INSERT INTO t1 VALUES(0); +ROLLBACK; + +SELECT * FROM t1; +SELECT * FROM t2; + +START TRANSACTION READ ONLY; +--error ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION +INSERT INTO t1 VALUES(0); +INSERT INTO t2 VALUES(1); +COMMIT; + +SET TRANSACTION READ ONLY; +START TRANSACTION; +INSERT INTO t2 VALUES(3); +--error ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION +INSERT INTO t1 VALUES(0); +COMMIT; + +SELECT * FROM t1; +SELECT * FROM t2; + +DROP TABLE t2; + +# This time with some indexes +CREATE TEMPORARY TABLE t2 ( + c1 INT AUTO_INCREMENT PRIMARY KEY, + c2 INT, INDEX idx(c2)) ENGINE=InnoDB; + +SHOW CREATE TABLE t2; + +# Check that the rollback works +START TRANSACTION READ ONLY; +INSERT INTO t2 VALUES(NULL,1),(NULL,2),(NULL,3); +--error ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION +INSERT INTO t1 VALUES(0); +ROLLBACK; + +SELECT * FROM t1; +SELECT * FROM t2; + +START TRANSACTION READ ONLY; +--error ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION +INSERT INTO t1 VALUES(0); +INSERT INTO t2 VALUES(NULL,1),(NULL,2),(NULL,3); +COMMIT; + +SET TRANSACTION READ ONLY; +START TRANSACTION; +INSERT INTO t2 VALUES(NULL,1),(NULL,2),(NULL,3); +--error ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION +INSERT INTO t1 VALUES(0); +COMMIT; + +SHOW CREATE TABLE t2; +SELECT * FROM t1; +SELECT * FROM t2; + +DROP TABLE t1; +DROP TABLE t2; diff --git a/mysql-test/suite/innodb/t/innodb_corrupt_bit.test b/mysql-test/suite/innodb/t/innodb_corrupt_bit.test index ee04e8d6..86b604b4 100644 --- a/mysql-test/suite/innodb/t/innodb_corrupt_bit.test +++ b/mysql-test/suite/innodb/t/innodb_corrupt_bit.test @@ -8,7 +8,8 @@ -- source include/have_debug.inc -- disable_query_log -call mtr.add_suppression("Flagged corruption of idx.*in"); +call mtr.add_suppression("Flagged corruption of idx.*in "); +-- enable_query_log set names utf8; @@ -37,9 +38,10 @@ INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+1,z+1 FROM corrupt_bit_test_ā; select count(*) from corrupt_bit_test_ā; # This will flag all secondary indexes corrupted -SET SESSION debug_dbug="+d,dict_set_index_corrupted"; +SET @save_dbug = @@SESSION.debug_dbug; +SET debug_dbug = '+d,dict_set_index_corrupted'; check table corrupt_bit_test_ā; -SET SESSION debug_dbug=""; +SET debug_dbug = @save_dbug; # Cannot create new indexes while corrupted indexes exist --error ER_INDEX_CORRUPT diff --git a/mysql-test/suite/innodb/t/table_definition_cache_debug.opt b/mysql-test/suite/innodb/t/table_definition_cache_debug.opt index 6d341857..c2db7e1d 100644 --- a/mysql-test/suite/innodb/t/table_definition_cache_debug.opt +++ b/mysql-test/suite/innodb/t/table_definition_cache_debug.opt @@ -1 +1 @@ ---innodb-open-files=20 +--innodb-open-files=30 diff --git a/mysql-test/suite/maria/lock.result b/mysql-test/suite/maria/lock.result index 52e83eb1..90250568 100644 --- a/mysql-test/suite/maria/lock.result +++ b/mysql-test/suite/maria/lock.result @@ -30,3 +30,72 @@ drop table t1; CREATE TABLE t1 (i INT) ENGINE=Aria; LOCK TABLES t1 WRITE, t1 AS t1a WRITE; DROP TABLE t1; +# +# MDEV-8200 aria bug with insert select when select is a aria table +# (wrong result or assertion failure: +# `table->file->stats.records > 0 || error') +# +CREATE TABLE t1 (f1 INT) ENGINE=Aria; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f1` int(11) DEFAULT NULL +) ENGINE=Aria DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1 +INSERT INTO t1 VALUES (1); +CREATE TABLE t2 (f2 INT) ENGINE=MyISAM; +CREATE TABLE tmp (f3 INT) engine=Aria; +LOCK TABLE t2 WRITE, tmp WRITE, tmp AS tmp_alias WRITE, t1 WRITE; +INSERT INTO tmp SELECT f1 FROM t1; +INSERT INTO t2 SELECT f3 FROM tmp AS tmp_alias; +select * from t2; +f2 +1 +unlock tables; +DROP TABLE t1,t2,tmp; +# +# Same without transactional +# +CREATE TABLE t1 (f1 INT) transactional=0 ENGINE=Aria; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f1` int(11) DEFAULT NULL +) ENGINE=Aria DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1 TRANSACTIONAL=0 +INSERT INTO t1 VALUES (2); +CREATE TABLE t2 (f2 INT) ENGINE=MyISAM; +CREATE TABLE tmp (f3 INT) transactional=0 engine=Aria; +LOCK TABLE t2 WRITE, tmp WRITE, tmp AS tmp_alias WRITE, t1 WRITE; +INSERT INTO tmp SELECT f1 FROM t1; +INSERT INTO t2 SELECT f3 FROM tmp AS tmp_alias; +select * from t2; +f2 +2 +unlock tables; +DROP TABLE t1,t2,tmp; +# +# Using spatical keys (disables versioning) +# +CREATE TABLE t1 (f1 INT, c1 geometry NOT NULL, SPATIAL KEY i1 (c1)) transactional=1 ENGINE=Aria; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f1` int(11) DEFAULT NULL, + `c1` geometry NOT NULL, + SPATIAL KEY `i1` (`c1`) +) ENGINE=Aria DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1 TRANSACTIONAL=1 +INSERT INTO t1 VALUES (3, +PolygonFromText('POLYGON((-18.6086111000 -66.9327777000, + -18.6055555000 -66.8158332999, + -18.7186111000 -66.8102777000, + -18.7211111000 -66.9269443999, + -18.6086111000 -66.9327777000))')); +CREATE TABLE t2 (f2 INT) ENGINE=MyISAM; +CREATE TABLE tmp (f3 INT, c1 geometry NOT NULL, SPATIAL KEY i1 (c1)) transactional=1 ENGINE=Aria; +LOCK TABLE t2 WRITE, tmp WRITE, tmp AS tmp_alias WRITE, t1 WRITE; +INSERT INTO tmp SELECT f1,c1 FROM t1; +INSERT INTO t2 (f2) SELECT f3 FROM tmp AS tmp_alias; +select * from t2; +f2 +3 +unlock tables; +DROP TABLE t1,t2,tmp; diff --git a/mysql-test/suite/maria/lock.test b/mysql-test/suite/maria/lock.test index 5b6d1706..57447a18 100644 --- a/mysql-test/suite/maria/lock.test +++ b/mysql-test/suite/maria/lock.test @@ -50,3 +50,58 @@ drop table t1; CREATE TABLE t1 (i INT) ENGINE=Aria; LOCK TABLES t1 WRITE, t1 AS t1a WRITE; DROP TABLE t1; + +--echo # +--echo # MDEV-8200 aria bug with insert select when select is a aria table +--echo # (wrong result or assertion failure: +--echo # `table->file->stats.records > 0 || error') +--echo # + +CREATE TABLE t1 (f1 INT) ENGINE=Aria; +SHOW CREATE TABLE t1; +INSERT INTO t1 VALUES (1); +CREATE TABLE t2 (f2 INT) ENGINE=MyISAM; +CREATE TABLE tmp (f3 INT) engine=Aria; +LOCK TABLE t2 WRITE, tmp WRITE, tmp AS tmp_alias WRITE, t1 WRITE; +INSERT INTO tmp SELECT f1 FROM t1; +INSERT INTO t2 SELECT f3 FROM tmp AS tmp_alias; +select * from t2; +unlock tables; +DROP TABLE t1,t2,tmp; + +--echo # +--echo # Same without transactional +--echo # + +CREATE TABLE t1 (f1 INT) transactional=0 ENGINE=Aria; +SHOW CREATE TABLE t1; +INSERT INTO t1 VALUES (2); +CREATE TABLE t2 (f2 INT) ENGINE=MyISAM; +CREATE TABLE tmp (f3 INT) transactional=0 engine=Aria; +LOCK TABLE t2 WRITE, tmp WRITE, tmp AS tmp_alias WRITE, t1 WRITE; +INSERT INTO tmp SELECT f1 FROM t1; +INSERT INTO t2 SELECT f3 FROM tmp AS tmp_alias; +select * from t2; +unlock tables; +DROP TABLE t1,t2,tmp; + +--echo # +--echo # Using spatical keys (disables versioning) +--echo # + +CREATE TABLE t1 (f1 INT, c1 geometry NOT NULL, SPATIAL KEY i1 (c1)) transactional=1 ENGINE=Aria; +SHOW CREATE TABLE t1; +INSERT INTO t1 VALUES (3, +PolygonFromText('POLYGON((-18.6086111000 -66.9327777000, + -18.6055555000 -66.8158332999, + -18.7186111000 -66.8102777000, + -18.7211111000 -66.9269443999, + -18.6086111000 -66.9327777000))')); +CREATE TABLE t2 (f2 INT) ENGINE=MyISAM; +CREATE TABLE tmp (f3 INT, c1 geometry NOT NULL, SPATIAL KEY i1 (c1)) transactional=1 ENGINE=Aria; +LOCK TABLE t2 WRITE, tmp WRITE, tmp AS tmp_alias WRITE, t1 WRITE; +INSERT INTO tmp SELECT f1,c1 FROM t1; +INSERT INTO t2 (f2) SELECT f3 FROM tmp AS tmp_alias; +select * from t2; +unlock tables; +DROP TABLE t1,t2,tmp; diff --git a/mysql-test/suite/maria/maria.result b/mysql-test/suite/maria/maria.result index ddafea14..8078687d 100644 --- a/mysql-test/suite/maria/maria.result +++ b/mysql-test/suite/maria/maria.result @@ -2696,6 +2696,17 @@ count(*) 13 drop table t1; # +# MDEV-14690: Assertion `page_link == &fake_link' failed in +# pagecache_write_part +# +CREATE TABLE t1 (a CHAR(8), b CHAR(8), c CHAR(8) NOT NULL DEFAULT '', f FLOAT, KEY(f)) ENGINE=Aria; +INSERT INTO t1 (a) VALUES ('foo'); +DELETE FROM t1 WHERE c < 'bar'; +ALTER TABLE t1 DISABLE KEYS; +INSERT INTO t1 (b) VALUES (''); +ALTER TABLE t1 ENABLE KEYS; +DROP TABLE t1; +# # BUG#47444 - --myisam_repair_threads > 1 can result in all index # cardinalities=1 # diff --git a/mysql-test/suite/maria/maria.test b/mysql-test/suite/maria/maria.test index 720e7d2e..27e9a45f 100644 --- a/mysql-test/suite/maria/maria.test +++ b/mysql-test/suite/maria/maria.test @@ -1967,6 +1967,21 @@ unlock tables; select count(*) from t1; drop table t1; +--echo # +--echo # MDEV-14690: Assertion `page_link == &fake_link' failed in +--echo # pagecache_write_part +--echo # + +CREATE TABLE t1 (a CHAR(8), b CHAR(8), c CHAR(8) NOT NULL DEFAULT '', f FLOAT, KEY(f)) ENGINE=Aria; +INSERT INTO t1 (a) VALUES ('foo'); +DELETE FROM t1 WHERE c < 'bar'; +ALTER TABLE t1 DISABLE KEYS; +INSERT INTO t1 (b) VALUES (''); +ALTER TABLE t1 ENABLE KEYS; + +# Cleanup +DROP TABLE t1; + --echo # --echo # BUG#47444 - --myisam_repair_threads > 1 can result in all index --echo # cardinalities=1 diff --git a/mysql-test/suite/maria/repair.result b/mysql-test/suite/maria/repair.result new file mode 100644 index 00000000..6bb9e1b5 --- /dev/null +++ b/mysql-test/suite/maria/repair.result @@ -0,0 +1,24 @@ +CREATE TABLE t1 (i INT) ENGINE=Aria TRANSACTIONAL=1; +INSERT t1 VALUES (1); +LOCK TABLE t1 WRITE; +REPAIR TABLE t1; +Table Op Msg_type Msg_text +test.t1 repair status OK +SELECT * FROM INFORMATION_SCHEMA.TABLES; +SELECT * FROM t1; +i +1 +UNLOCK TABLES; +DROP TABLE t1; +CREATE TABLE t1 (i INT) ENGINE=Aria TRANSACTIONAL=1; +INSERT t1 VALUES (1); +LOCK TABLE t1 WRITE; +OPTIMIZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 optimize status OK +SELECT * FROM INFORMATION_SCHEMA.TABLES; +SELECT * FROM t1; +i +1 +UNLOCK TABLES; +DROP TABLE t1; diff --git a/mysql-test/suite/maria/repair.test b/mysql-test/suite/maria/repair.test new file mode 100644 index 00000000..2f713950 --- /dev/null +++ b/mysql-test/suite/maria/repair.test @@ -0,0 +1,24 @@ +# +# MDEV-11539 test_if_reopen: Assertion `strcmp(share->unique_file_name,filename) || share->last_version' failed upon select from I_S +# +CREATE TABLE t1 (i INT) ENGINE=Aria TRANSACTIONAL=1; +INSERT t1 VALUES (1); +LOCK TABLE t1 WRITE; +REPAIR TABLE t1; +--disable_result_log +SELECT * FROM INFORMATION_SCHEMA.TABLES; +--enable_result_log +SELECT * FROM t1; +UNLOCK TABLES; +DROP TABLE t1; + +CREATE TABLE t1 (i INT) ENGINE=Aria TRANSACTIONAL=1; +INSERT t1 VALUES (1); +LOCK TABLE t1 WRITE; +OPTIMIZE TABLE t1; +--disable_result_log +SELECT * FROM INFORMATION_SCHEMA.TABLES; +--enable_result_log +SELECT * FROM t1; +UNLOCK TABLES; +DROP TABLE t1; diff --git a/mysql-test/suite/mariabackup/huge_lsn.opt b/mysql-test/suite/mariabackup/huge_lsn.opt new file mode 100644 index 00000000..74a6450a --- /dev/null +++ b/mysql-test/suite/mariabackup/huge_lsn.opt @@ -0,0 +1,6 @@ +--innodb-encrypt-log=ON +--plugin-load-add=$FILE_KEY_MANAGEMENT_SO +--loose-file-key-management +--loose-file-key-management-filekey=FILE:$MTR_SUITE_DIR/filekeys-data.key +--loose-file-key-management-filename=$MTR_SUITE_DIR/filekeys-data.enc +--loose-file-key-management-encryption-algorithm=aes_cbc diff --git a/mysql-test/suite/mariabackup/huge_lsn.result b/mysql-test/suite/mariabackup/huge_lsn.result new file mode 100644 index 00000000..f2202c20 --- /dev/null +++ b/mysql-test/suite/mariabackup/huge_lsn.result @@ -0,0 +1,19 @@ +# +# MDEV-13416 mariabackup fails with EFAULT "Bad Address" +# +call mtr.add_suppression("InnoDB: New log files created"); +FOUND /InnoDB: New log files created, LSN=175964\d{8}/ in mysqld.1.err +CREATE TABLE t(i INT) ENGINE INNODB; +INSERT INTO t VALUES(1); +# xtrabackup backup +SET GLOBAL innodb_flush_log_at_trx_commit=1; +INSERT INTO t VALUES(2); +# xtrabackup prepare +# shutdown server +# remove datadir +# xtrabackup move back +# restart server +SELECT * FROM t; +i +1 +DROP TABLE t; diff --git a/mysql-test/suite/mariabackup/huge_lsn.test b/mysql-test/suite/mariabackup/huge_lsn.test new file mode 100644 index 00000000..baf57776 --- /dev/null +++ b/mysql-test/suite/mariabackup/huge_lsn.test @@ -0,0 +1,54 @@ +--source include/not_embedded.inc +--source include/have_file_key_management.inc + +--echo # +--echo # MDEV-13416 mariabackup fails with EFAULT "Bad Address" +--echo # + +let INNODB_PAGE_SIZE=`select @@innodb_page_size`; +let MYSQLD_DATADIR=`select @@datadir`; +call mtr.add_suppression("InnoDB: New log files created"); + +--source include/shutdown_mysqld.inc + +perl; +my $file= "$ENV{MYSQLD_DATADIR}/ibdata1"; +open(FILE, "+<", $file) or die "Unable to open $file\n"; +binmode FILE; +my $ps= $ENV{INNODB_PAGE_SIZE}; +my $page; +die "Unable to read $file" unless sysread(FILE, $page, $ps) == $ps; +substr($page,26,8) = pack("NN", 4096, ~1024); +substr($page,0,4)=pack("N",0xdeadbeef); +substr($page,$ps-8,4)=pack("N",0xdeadbeef); +sysseek(FILE, 0, 0) || die "Unable to rewind $file\n"; +syswrite(FILE, $page, $ps)==$ps || die "Unable to write $file\n"; +close(FILE) || die "Unable to close $file\n"; +EOF + +--remove_files_wildcard $MYSQLD_DATADIR ib_logfile* + +--source include/start_mysqld.inc +let SEARCH_RANGE= -50000; +let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err; +--let SEARCH_PATTERN= InnoDB: New log files created, LSN=175964\d{8} +--source include/search_pattern_in_file.inc + +CREATE TABLE t(i INT) ENGINE INNODB; +INSERT INTO t VALUES(1); + +echo # xtrabackup backup; +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +--enable_result_log +SET GLOBAL innodb_flush_log_at_trx_commit=1; +INSERT INTO t VALUES(2); +echo # xtrabackup prepare; +--disable_result_log +exec $XTRABACKUP --prepare --target-dir=$targetdir; +--source include/restart_and_restore.inc +--enable_result_log +SELECT * FROM t; +DROP TABLE t; +rmdir $targetdir; diff --git a/mysql-test/suite/mariabackup/missing_ibd.result b/mysql-test/suite/mariabackup/missing_ibd.result new file mode 100644 index 00000000..53989be7 --- /dev/null +++ b/mysql-test/suite/mariabackup/missing_ibd.result @@ -0,0 +1,6 @@ +create table t1(c1 int) engine=InnoDB; +INSERT INTO t1 VALUES(1); +# xtrabackup backup +select * from t1; +ERROR 42S02: Table 'test.t1' doesn't exist in engine +drop table t1; diff --git a/mysql-test/suite/mariabackup/missing_ibd.test b/mysql-test/suite/mariabackup/missing_ibd.test new file mode 100644 index 00000000..53ce397f --- /dev/null +++ b/mysql-test/suite/mariabackup/missing_ibd.test @@ -0,0 +1,27 @@ +--source include/have_innodb.inc + +# +# MDEV-13499: Backing up table that "doesn't exist in engine" cause crash in mariabackup when using encryption +# +create table t1(c1 int) engine=InnoDB; +INSERT INTO t1 VALUES(1); +let MYSQLD_DATADIR=`select @@datadir`; + +--source include/shutdown_mysqld.inc + +--remove_file $MYSQLD_DATADIR/test/t1.ibd + +--source include/start_mysqld.inc + +echo # xtrabackup backup; +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +--enable_result_log + +rmdir $targetdir; + +--error ER_NO_SUCH_TABLE_IN_ENGINE +select * from t1; +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 9f238103..41af6af7 100644 --- a/mysql-test/suite/parts/r/partition_alter_myisam.result +++ b/mysql-test/suite/parts/r/partition_alter_myisam.result @@ -42,3 +42,16 @@ 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 ( c1 int, c2 int, c3 varchar(100)) delay_key_write=1 +partition by key(c1) ( +partition p01 data directory = 'MYSQL_TMP_DIR' + index directory = 'MYSQL_TMP_DIR', +partition p02 data directory = 'MYSQL_TMP_DIR' + index directory = 'MYSQL_TMP_DIR'); +insert into t1 values (1, 1, repeat('a', 100)); +insert into t1 select rand()*1000, rand()*1000, repeat('b', 100) from t1; +insert into t1 select rand()*1000, rand()*1000, repeat('b', 100) from t1; +insert into t1 select rand()*1000, rand()*1000, repeat('b', 100) from t1; +alter online table t1 delay_key_write=0; +alter online table t1 delay_key_write=1; +drop table t1; diff --git a/mysql-test/suite/parts/t/partition_alter_myisam.test b/mysql-test/suite/parts/t/partition_alter_myisam.test index a53fa333..b2bd0e72 100644 --- a/mysql-test/suite/parts/t/partition_alter_myisam.test +++ b/mysql-test/suite/parts/t/partition_alter_myisam.test @@ -1,3 +1,22 @@ --source include/have_partition.inc --let $engine=MyISAM --source inc/part_alter_values.inc + +# +# MDEV-14026 ALTER TABLE ... DELAY_KEY_WRITE=1 creates table copy for partitioned MyISAM table with DATA DIRECTORY/INDEX DIRECTORY options +# + +replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR; +eval 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' + index directory = '$MYSQL_TMP_DIR', + partition p02 data directory = '$MYSQL_TMP_DIR' + index directory = '$MYSQL_TMP_DIR'); +insert into t1 values (1, 1, repeat('a', 100)); +insert into t1 select rand()*1000, rand()*1000, repeat('b', 100) from t1; +insert into t1 select rand()*1000, rand()*1000, repeat('b', 100) from t1; +insert into t1 select rand()*1000, rand()*1000, repeat('b', 100) from t1; +alter online table t1 delay_key_write=0; +alter online table t1 delay_key_write=1; +drop table t1; diff --git a/mysql-test/suite/rpl/t/rpl_manual_change_index_file.test b/mysql-test/suite/rpl/t/rpl_manual_change_index_file.test index 981cecb6..1c087c55 100644 --- a/mysql-test/suite/rpl/t/rpl_manual_change_index_file.test +++ b/mysql-test/suite/rpl/t/rpl_manual_change_index_file.test @@ -25,7 +25,7 @@ sync_slave_with_master; connection master; # Delete './master-bin.000001' from index file. let $MYSQLD_DATADIR= `SELECT @@DATADIR`; -let $file= $MYSQLD_DATADIR/master-bin.index; +let TRUNCATE_FILE= $MYSQLD_DATADIR/master-bin.index; source include/truncate_file.inc; if (`SELECT CONVERT(@@VERSION_COMPILE_OS USING latin1) NOT IN ('Win32', 'Win64', 'Windows')`) diff --git a/mysql-test/suite/sys_vars/r/innodb_print_lock_wait_timeout_info_basic.result b/mysql-test/suite/sys_vars/r/innodb_print_lock_wait_timeout_info_basic.result new file mode 100644 index 00000000..cc035e4f --- /dev/null +++ b/mysql-test/suite/sys_vars/r/innodb_print_lock_wait_timeout_info_basic.result @@ -0,0 +1,104 @@ +SET @start_global_value = @@global.innodb_print_lock_wait_timeout_info; +SELECT @start_global_value; +@start_global_value +0 +Valid values are 'ON' and 'OFF' +SELECT @@global.innodb_print_lock_wait_timeout_info in (0, 1); +@@global.innodb_print_lock_wait_timeout_info in (0, 1) +1 +SELECT @@global.innodb_print_lock_wait_timeout_info; +@@global.innodb_print_lock_wait_timeout_info +0 +SELECT @@session.innodb_print_lock_wait_timeout_info; +ERROR HY000: Variable 'innodb_print_lock_wait_timeout_info' is a GLOBAL variable +SHOW global variables LIKE 'innodb_print_lock_wait_timeout_info'; +Variable_name Value +innodb_print_lock_wait_timeout_info OFF +SHOW session variables LIKE 'innodb_print_lock_wait_timeout_info'; +Variable_name Value +innodb_print_lock_wait_timeout_info OFF +SELECT * FROM information_schema.global_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +VARIABLE_NAME VARIABLE_VALUE +INNODB_PRINT_LOCK_WAIT_TIMEOUT_INFO OFF +SELECT * FROM information_schema.session_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +VARIABLE_NAME VARIABLE_VALUE +INNODB_PRINT_LOCK_WAIT_TIMEOUT_INFO OFF +SET global innodb_print_lock_wait_timeout_info='OFF'; +SELECT @@global.innodb_print_lock_wait_timeout_info; +@@global.innodb_print_lock_wait_timeout_info +0 +SELECT * FROM information_schema.global_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +VARIABLE_NAME VARIABLE_VALUE +INNODB_PRINT_LOCK_WAIT_TIMEOUT_INFO OFF +SELECT * FROM information_schema.session_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +VARIABLE_NAME VARIABLE_VALUE +INNODB_PRINT_LOCK_WAIT_TIMEOUT_INFO OFF +SET @@global.innodb_print_lock_wait_timeout_info=1; +SELECT @@global.innodb_print_lock_wait_timeout_info; +@@global.innodb_print_lock_wait_timeout_info +1 +SELECT * FROM information_schema.global_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +VARIABLE_NAME VARIABLE_VALUE +INNODB_PRINT_LOCK_WAIT_TIMEOUT_INFO ON +SELECT * FROM information_schema.session_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +VARIABLE_NAME VARIABLE_VALUE +INNODB_PRINT_LOCK_WAIT_TIMEOUT_INFO ON +SET global innodb_print_lock_wait_timeout_info=0; +SELECT @@global.innodb_print_lock_wait_timeout_info; +@@global.innodb_print_lock_wait_timeout_info +0 +SELECT * FROM information_schema.global_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +VARIABLE_NAME VARIABLE_VALUE +INNODB_PRINT_LOCK_WAIT_TIMEOUT_INFO OFF +SELECT * FROM information_schema.session_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +VARIABLE_NAME VARIABLE_VALUE +INNODB_PRINT_LOCK_WAIT_TIMEOUT_INFO OFF +SET @@global.innodb_print_lock_wait_timeout_info='ON'; +SELECT @@global.innodb_print_lock_wait_timeout_info; +@@global.innodb_print_lock_wait_timeout_info +1 +SELECT * FROM information_schema.global_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +VARIABLE_NAME VARIABLE_VALUE +INNODB_PRINT_LOCK_WAIT_TIMEOUT_INFO ON +SELECT * FROM information_schema.session_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +VARIABLE_NAME VARIABLE_VALUE +INNODB_PRINT_LOCK_WAIT_TIMEOUT_INFO ON +SET session innodb_print_lock_wait_timeout_info='OFF'; +ERROR HY000: Variable 'innodb_print_lock_wait_timeout_info' is a GLOBAL variable and should be set with SET GLOBAL +SET @@session.innodb_print_lock_wait_timeout_info='ON'; +ERROR HY000: Variable 'innodb_print_lock_wait_timeout_info' is a GLOBAL variable and should be set with SET GLOBAL +SET global innodb_print_lock_wait_timeout_info=1.1; +ERROR 42000: Incorrect argument type to variable 'innodb_print_lock_wait_timeout_info' +SET global innodb_print_lock_wait_timeout_info=1e1; +ERROR 42000: Incorrect argument type to variable 'innodb_print_lock_wait_timeout_info' +SET global innodb_print_lock_wait_timeout_info=2; +ERROR 42000: Variable 'innodb_print_lock_wait_timeout_info' can't be set to the value of '2' +SET global innodb_print_lock_wait_timeout_info=-3; +ERROR 42000: Variable 'innodb_print_lock_wait_timeout_info' can't be set to the value of '-3' +SELECT @@global.innodb_print_lock_wait_timeout_info; +@@global.innodb_print_lock_wait_timeout_info +1 +SELECT * FROM information_schema.global_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +VARIABLE_NAME VARIABLE_VALUE +INNODB_PRINT_LOCK_WAIT_TIMEOUT_INFO ON +SELECT * FROM information_schema.session_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +VARIABLE_NAME VARIABLE_VALUE +INNODB_PRINT_LOCK_WAIT_TIMEOUT_INFO ON +SET global innodb_print_lock_wait_timeout_info='AUTO'; +ERROR 42000: Variable 'innodb_print_lock_wait_timeout_info' can't be set to the value of 'AUTO' +SET @@global.innodb_print_lock_wait_timeout_info = @start_global_value; +SELECT @@global.innodb_print_lock_wait_timeout_info; +@@global.innodb_print_lock_wait_timeout_info +0 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 5c7e310c..a57fc129 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 @@ -829,10 +829,24 @@ VARIABLE_COMMENT Page size to use for all InnoDB tablespaces. NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 65536 -@@ -1727,13 +2035,69 @@ +@@ -1727,13 +2035,83 @@ ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL ++VARIABLE_NAME INNODB_PRINT_LOCK_WAIT_TIMEOUT_INFO ++SESSION_VALUE NULL ++GLOBAL_VALUE OFF ++GLOBAL_VALUE_ORIGIN COMPILE-TIME ++DEFAULT_VALUE OFF ++VARIABLE_SCOPE GLOBAL ++VARIABLE_TYPE BOOLEAN ++VARIABLE_COMMENT Print lock wait timeout info to MySQL error log (off by default) ++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_PRIORITY_CLEANER +SESSION_VALUE NULL +GLOBAL_VALUE OFF @@ -1222,7 +1236,7 @@ VARIABLE_NAME INNODB_VERSION SESSION_VALUE NULL -GLOBAL_VALUE 5.6.37 -+GLOBAL_VALUE 5.6.36-82.2 ++GLOBAL_VALUE 5.6.36-83.0 GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL 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 6aa4e32e..0a2757c5 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff @@ -415,10 +415,24 @@ VARIABLE_NAME INNODB_MAX_DIRTY_PAGES_PCT SESSION_VALUE NULL GLOBAL_VALUE 75.000000 -@@ -1727,6 +2035,62 @@ +@@ -1727,6 +2035,76 @@ ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL ++VARIABLE_NAME INNODB_PRINT_LOCK_WAIT_TIMEOUT_INFO ++SESSION_VALUE NULL ++GLOBAL_VALUE OFF ++GLOBAL_VALUE_ORIGIN COMPILE-TIME ++DEFAULT_VALUE OFF ++VARIABLE_SCOPE GLOBAL ++VARIABLE_TYPE BOOLEAN ++VARIABLE_COMMENT Print lock wait timeout info to MySQL error log (off by default) ++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_PRIORITY_CLEANER +SESSION_VALUE NULL +GLOBAL_VALUE OFF @@ -478,7 +492,7 @@ VARIABLE_NAME INNODB_PURGE_BATCH_SIZE SESSION_VALUE NULL GLOBAL_VALUE 300 -@@ -1895,6 +2259,48 @@ +@@ -1895,6 +2273,48 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -527,7 +541,7 @@ VARIABLE_NAME INNODB_SCRUB_LOG SESSION_VALUE NULL GLOBAL_VALUE OFF -@@ -1923,6 +2329,34 @@ +@@ -1923,6 +2343,34 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -562,7 +576,7 @@ VARIABLE_NAME INNODB_SIMULATE_COMP_FAILURES SESSION_VALUE NULL GLOBAL_VALUE 0 -@@ -2000,7 +2434,7 @@ +@@ -2000,7 +2448,7 @@ DEFAULT_VALUE nulls_equal VARIABLE_SCOPE GLOBAL VARIABLE_TYPE ENUM @@ -571,7 +585,7 @@ NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -@@ -2245,6 +2679,34 @@ +@@ -2245,6 +2693,34 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -606,7 +620,7 @@ VARIABLE_NAME INNODB_TRX_PURGE_VIEW_UPDATE_ONLY_DEBUG SESSION_VALUE NULL GLOBAL_VALUE OFF -@@ -2322,7 +2784,7 @@ +@@ -2322,7 +2798,7 @@ DEFAULT_VALUE OFF VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BOOLEAN @@ -615,7 +629,7 @@ NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -@@ -2343,6 +2805,20 @@ +@@ -2343,6 +2819,20 @@ ENUM_VALUE_LIST OFF,ON READ_ONLY YES COMMAND_LINE_ARGUMENT NONE @@ -636,7 +650,7 @@ VARIABLE_NAME INNODB_USE_MTFLUSH SESSION_VALUE NULL GLOBAL_VALUE OFF -@@ -2357,6 +2833,20 @@ +@@ -2357,6 +2847,20 @@ ENUM_VALUE_LIST OFF,ON READ_ONLY YES COMMAND_LINE_ARGUMENT NONE @@ -657,12 +671,12 @@ VARIABLE_NAME INNODB_USE_SYS_MALLOC SESSION_VALUE NULL GLOBAL_VALUE ON -@@ -2387,12 +2877,12 @@ +@@ -2387,12 +2891,12 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_VERSION SESSION_VALUE NULL -GLOBAL_VALUE 5.6.37 -+GLOBAL_VALUE 5.6.36-82.2 ++GLOBAL_VALUE 5.6.36-83.0 GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL diff --git a/mysql-test/suite/sys_vars/t/innodb_print_lock_wait_timeout_info_basic.test b/mysql-test/suite/sys_vars/t/innodb_print_lock_wait_timeout_info_basic.test new file mode 100644 index 00000000..23d8ba66 --- /dev/null +++ b/mysql-test/suite/sys_vars/t/innodb_print_lock_wait_timeout_info_basic.test @@ -0,0 +1,89 @@ +--source include/have_xtradb.inc + +SET @start_global_value = @@global.innodb_print_lock_wait_timeout_info; +SELECT @start_global_value; + +# +# exists as global only +# +--echo Valid values are 'ON' and 'OFF' +SELECT @@global.innodb_print_lock_wait_timeout_info in (0, 1); +SELECT @@global.innodb_print_lock_wait_timeout_info; +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.innodb_print_lock_wait_timeout_info; +SHOW global variables LIKE 'innodb_print_lock_wait_timeout_info'; +SHOW session variables LIKE 'innodb_print_lock_wait_timeout_info'; +--disable_warnings +SELECT * FROM information_schema.global_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +SELECT * FROM information_schema.session_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +--enable_warnings + +# +# SHOW that it's writable +# +SET global innodb_print_lock_wait_timeout_info='OFF'; +SELECT @@global.innodb_print_lock_wait_timeout_info; +--disable_warnings +SELECT * FROM information_schema.global_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +SELECT * FROM information_schema.session_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +--enable_warnings +SET @@global.innodb_print_lock_wait_timeout_info=1; +SELECT @@global.innodb_print_lock_wait_timeout_info; +--disable_warnings +SELECT * FROM information_schema.global_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +SELECT * FROM information_schema.session_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +--enable_warnings +SET global innodb_print_lock_wait_timeout_info=0; +SELECT @@global.innodb_print_lock_wait_timeout_info; +--disable_warnings +SELECT * FROM information_schema.global_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +SELECT * FROM information_schema.session_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +--enable_warnings +SET @@global.innodb_print_lock_wait_timeout_info='ON'; +SELECT @@global.innodb_print_lock_wait_timeout_info; +--disable_warnings +SELECT * FROM information_schema.global_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +SELECT * FROM information_schema.session_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +--enable_warnings +--error ER_GLOBAL_VARIABLE +SET session innodb_print_lock_wait_timeout_info='OFF'; +--error ER_GLOBAL_VARIABLE +SET @@session.innodb_print_lock_wait_timeout_info='ON'; + +# +# incorrect types +# +--error ER_WRONG_TYPE_FOR_VAR +SET global innodb_print_lock_wait_timeout_info=1.1; +--error ER_WRONG_TYPE_FOR_VAR +SET global innodb_print_lock_wait_timeout_info=1e1; +--error ER_WRONG_VALUE_FOR_VAR +SET global innodb_print_lock_wait_timeout_info=2; +--error ER_WRONG_VALUE_FOR_VAR +SET global innodb_print_lock_wait_timeout_info=-3; +SELECT @@global.innodb_print_lock_wait_timeout_info; +--disable_warnings +SELECT * FROM information_schema.global_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +SELECT * FROM information_schema.session_variables +WHERE variable_name='innodb_print_lock_wait_timeout_info'; +--enable_warnings +--error ER_WRONG_VALUE_FOR_VAR +SET global innodb_print_lock_wait_timeout_info='AUTO'; + +# +# Cleanup +# + +SET @@global.innodb_print_lock_wait_timeout_info = @start_global_value; +SELECT @@global.innodb_print_lock_wait_timeout_info; diff --git a/mysql-test/t/create.test b/mysql-test/t/create.test index 7306a819..c6a91a18 100644 --- a/mysql-test/t/create.test +++ b/mysql-test/t/create.test @@ -1765,6 +1765,149 @@ create table t1(ID decimal(2,1) unsigned NOT NULL, PRIMARY KEY (ID))engine=memor select 2.1 ID; drop table t1; +# +# many keys with long names and comments +# +--error ER_CANT_CREATE_TABLE +create table t1 ( + f01 int, f02 int, f03 int, f04 int, f05 int, f06 int, f07 int, f08 int, f09 int, f10 int, f11 int, f12 int, f13 int, f14 int, f15 int, f16 int, f17 int, f18 int, f19 int, f20 int, f21 int, f22 int, f23 int, f24 int, f25 int, f26 int, f27 int, f28 int, f29 int, f30 int, f31 int, f32 int, f33 int, f34 int, f35 int, f36 int, f37 int, f38 int, f39 int, f40 int, f41 int, f42 int, f43 int, f44 int, f45 int, f46 int, f47 int, f48 int, f49 int, f50 int, f51 int, f52 int, f53 int, f54 int, f55 int, f56 int, f57 int, f58 int, f59 int, f60 int, f61 int, f62 int, f63 int, f64 int, + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0001 (f01) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0002 (f02) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0003 (f03) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0004 (f04) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0005 (f05) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0006 (f06) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0007 (f07) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0008 (f08) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0009 (f09) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0010 (f10) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0011 (f11) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0012 (f12) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0013 (f13) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0014 (f14) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0015 (f15) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0016 (f16) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0017 (f17) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0018 (f18) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0019 (f19) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0020 (f20) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0021 (f21) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0022 (f22) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0023 (f23) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0024 (f24) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0025 (f25) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0026 (f26) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0027 (f27) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0028 (f28) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0029 (f29) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0030 (f30) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0031 (f31) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0032 (f32) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0033 (f33) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0034 (f34) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0035 (f35) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0036 (f36) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0037 (f37) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0038 (f38) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0039 (f39) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0040 (f40) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0041 (f41) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0042 (f42) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0043 (f43) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0044 (f44) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0045 (f45) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0046 (f46) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0047 (f47) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0048 (f48) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0049 (f49) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0050 (f50) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0051 (f51) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0052 (f52) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0053 (f53) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0054 (f54) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0055 (f55) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0056 (f56) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0057 (f57) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0058 (f58) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0059 (f59) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0060 (f60) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0061 (f61) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0062 (f62) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0063 (f63) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0064 (f64) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + fend int); + +create table t1 ( + f01 int, f02 int, f03 int, f04 int, f05 int, f06 int, f07 int, f08 int, f09 int, f10 int, f11 int, f12 int, f13 int, f14 int, f15 int, f16 int, f17 int, f18 int, f19 int, f20 int, f21 int, f22 int, f23 int, f24 int, f25 int, f26 int, f27 int, f28 int, f29 int, f30 int, f31 int, f32 int, f33 int, f34 int, f35 int, f36 int, f37 int, f38 int, f39 int, f40 int, f41 int, f42 int, f43 int, f44 int, f45 int, f46 int, f47 int, f48 int, f49 int, f50 int, f51 int, f52 int, f53 int, f54 int, f55 int, f56 int, f57 int, f58 int, f59 int, f60 int, f61 int, f62 int, f63 int, f64 int, + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0001 (f01) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0002 (f02) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0003 (f03) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0004 (f04) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0005 (f05) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0006 (f06) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0007 (f07) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0008 (f08) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0009 (f09) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0010 (f10) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0011 (f11) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0012 (f12) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0013 (f13) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0014 (f14) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0015 (f15) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0016 (f16) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0017 (f17) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0018 (f18) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0019 (f19) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0020 (f20) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0021 (f21) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0022 (f22) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0023 (f23) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0024 (f24) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0025 (f25) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0026 (f26) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0027 (f27) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0028 (f28) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0029 (f29) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0030 (f30) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0031 (f31) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0032 (f32) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0033 (f33) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0034 (f34) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0035 (f35) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0036 (f36) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0037 (f37) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0038 (f38) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0039 (f39) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0040 (f40) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0041 (f41) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0042 (f42) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0043 (f43) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0044 (f44) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0045 (f45) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0046 (f46) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0047 (f47) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0048 (f48) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0049 (f49) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0050 (f50) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0051 (f51) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0052 (f52) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0053 (f53) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0054 (f54) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0055 (f55) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0056 (f56) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0057 (f57) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0058 (f58) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0059 (f59) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0060 (f60) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0061 (f61) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0062 (f62) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0063 (f63) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + fend int); +--error ER_CANT_CREATE_TABLE +alter table t1 add + key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0064 (f64) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'; +drop table t1; + --echo End of 5.5 tests # diff --git a/mysql-test/t/derived.test b/mysql-test/t/derived.test index d881430a..b0415cf3 100644 --- a/mysql-test/t/derived.test +++ b/mysql-test/t/derived.test @@ -897,6 +897,44 @@ select distinct t1.id, tt.id, tt.data drop table t1; +--echo # +--echo # MDEV-14241: Server crash in key_copy / get_matching_chain_by_join_key +--echo # or valgrind warnings +--echo # + +CREATE TABLE t1 (a VARCHAR(10)) ENGINE=MyISAM; +CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1; +INSERT INTO t1 VALUES ('foo'),('bar'); + +CREATE TABLE t2 (b integer auto_increment primary key) ENGINE=MyISAM; +INSERT INTO t2 VALUES (NULL),(NULL); + +CREATE TABLE t3 (c VARCHAR(1024) CHARACTER SET utf8, d INT) ENGINE=MyISAM; +CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v3 AS SELECT * FROM t3; +INSERT INTO t3 VALUES ('abc',NULL),('def',4); + +SET join_cache_level= 8; +explain +SELECT * FROM v1, t2, v3 WHERE a = c AND b = d; +SELECT * FROM v1, t2, v3 WHERE a = c AND b = d; + +DROP VIEW v1, v3; +DROP TABLE t1, t2, t3; + +--echo # +--echo # MDEV-14786: Server crashes in Item_cond::transform on 2nd +--echo # execution of SP querying from a view +--echo # +create table t1 (i int, row_start timestamp(6) not null default now(), + row_end timestamp(6) not null default '2030-01-01 0:0:0'); +create view v1 as select i from t1 where i < 5 and (row_end = +TIMESTAMP'2030-01-01 0:0:0' or row_end is null); +create procedure pr(x int) select i from v1; +call pr(1); +call pr(2); +drop procedure pr; +drop view v1; +drop table t1; --echo # end of 5.5 diff --git a/mysql-test/t/dyncol.test b/mysql-test/t/dyncol.test index 03e2345b..2c93f75c 100644 --- a/mysql-test/t/dyncol.test +++ b/mysql-test/t/dyncol.test @@ -920,6 +920,14 @@ SELECT COLUMN_JSON(COLUMN_CREATE('a',0 AS DECIMAL,'b',1 AS DECIMAL)); SELECT COLUMN_JSON(COLUMN_CREATE('a',1 AS DECIMAL,'b',1 AS DECIMAL)); + +--echo # +--echo # MDEV-7533: COLUMN_JSON() doesn't escape control characters +--echo # in string values +--echo # +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 # end of 10.0 tests --echo # diff --git a/mysql-test/t/fulltext.test b/mysql-test/t/fulltext.test index 9dfc49d3..fc7b15c0 100644 --- a/mysql-test/t/fulltext.test +++ b/mysql-test/t/fulltext.test @@ -682,6 +682,21 @@ SELECT * FROM t1 WHERE MATCH (txt1,txt2) AGAINST ('ööö1' IN BOOLEAN MODE); SELECT * FROM t1 WHERE MATCH (txt1,txt2) AGAINST ('ùùù2' IN BOOLEAN MODE); DROP TABLE t1; + +--echo # +--echo # MDEV-14743: Server crashes in Item_func_match::init_search +--echo # + +CREATE TABLE t1 (f VARCHAR(8)); +INSERT INTO t1 VALUES ('foo'),('bar'); + +SELECT 'foo' IN ( SELECT f FROM t1 GROUP BY MATCH(f) AGAINST ( 'qux' IN BOOLEAN MODE ) ); +SELECT 'foo' IN ( SELECT f FROM t1 GROUP BY MATCH(f) AGAINST ( 'qux' IN BOOLEAN MODE )) as f1, MATCH(f) AGAINST ( 'qux' IN BOOLEAN MODE ) as f2 from t1 ; +explain extended +SELECT 'foo' IN ( SELECT f FROM t1 GROUP BY MATCH(f) AGAINST ( 'qux' IN BOOLEAN MODE )) as f1, MATCH(f) AGAINST ( 'qux' IN BOOLEAN MODE ) as f2 from t1 ; + +drop table t1; + --echo # --echo # End of 5.5 tests --echo # diff --git a/mysql-test/t/func_concat.test b/mysql-test/t/func_concat.test index be573f49..69dd2c40 100644 --- a/mysql-test/t/func_concat.test +++ b/mysql-test/t/func_concat.test @@ -236,3 +236,9 @@ SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT TRIM(t) t2 FROM t1) sub; DROP TABLE t1; SET optimizer_switch=@save_optimizer_switch; + +--echo # +--echo # MDEV-13790 UNHEX() of a somewhat complicated CONCAT() returns NULL +--echo # + +SELECT UNHEX(CONCAT('414C2', HEX(8 + ROUND(RAND()*7)), SUBSTR(SHA(UUID()),6,33),HEX(2+ROUND(RAND()*8)))) IS NULL AS c1; diff --git a/mysql-test/t/func_isnull.test b/mysql-test/t/func_isnull.test index 326574e0..4c59fa3c 100644 --- a/mysql-test/t/func_isnull.test +++ b/mysql-test/t/func_isnull.test @@ -38,5 +38,51 @@ INSERT INTO t1( id ) VALUES ( NULL ); SELECT t1.id FROM t1 WHERE (id is not null and id is null ); DROP TABLE t1; -# End of 5.1 tests +--echo # End of 5.1 tests +--echo # +--echo # MDEV-14911: IS NULL for field from mergeable view +--echo # + +CREATE TABLE t1 (d1 datetime NOT NULL); +INSERT INTO t1 VALUES + ('0000-00-00 00:00:00'), ('0000-00-00 00:00:00'), ('1979-09-03 20:49:36'); + +SELECT * FROM t1; +SELECT * FROM t1 WHERE d1 IS NULL; +EXPLAIN EXTENDED SELECT * FROM t1 WHERE d1 IS NULL; +SELECT count(*) FROM t1 WHERE d1 IS NULL; + +CREATE VIEW v1 AS (SELECT * FROM t1); +SELECT * FROM v1; +SELECT * FROM v1 WHERE d1 IS NULL; +EXPLAIN EXTENDED SELECT * FROM v1 WHERE d1 IS NULL; +SELECT count(*) FROM v1 WHERE d1 IS NULL; + +SET @save_optimizer_switch=@@optimizer_switch; + +SET SESSION optimizer_switch='derived_merge=off'; +SELECT count(*) FROM ( SELECT * FROM t1 ) AS a1 WHERE d1 IS NULL; +SET SESSION optimizer_switch='derived_merge=on'; +SELECT count(*) FROM ( SELECT * FROM t1 ) AS a1 WHERE d1 IS NULL; + +SET optimizer_switch=@save_optimizer_switch; + +CREATE TABLE t2 (d1 datetime NOT NULL); +INSERT INTO t2 VALUES + ('1980-09-03 20:49:36'), ('0000-00-00 00:00:00'), ('1979-09-03 20:49:36'); + +SELECT * FROM t2 LEFT JOIN t1 ON t2.d1=t1.d1 WHERE t1.d1 IS NULL; +EXPLAIN EXTENDED +SELECT * FROM t2 LEFT JOIN t1 ON t2.d1=t1.d1 WHERE t1.d1 IS NULL; + +SELECT * FROM t2 LEFT JOIN v1 ON t2.d1=v1.d1 WHERE v1.d1 IS NULL; +EXPLAIN EXTENDED +SELECT * FROM t2 LEFT JOIN v1 ON t2.d1=v1.d1 WHERE v1.d1 IS NULL; + +DROP VIEW v1; +DROP TABLE t1,t2; + +--echo # +--echo # End of 5.5 tests +--echo # diff --git a/mysql-test/t/join_cache.test b/mysql-test/t/join_cache.test index 5ee868b4..ee3e324c 100644 --- a/mysql-test/t/join_cache.test +++ b/mysql-test/t/join_cache.test @@ -3824,6 +3824,51 @@ set join_cache_level = default; DROP TABLE t1,t2; +--echo # +--echo # MDEV-14960: BNLH used for materialized semi-join +--echo # + +CREATE TABLE t1 (i1 int); +CREATE TABLE t2 (e1 int); +CREATE TABLE t4 (e1 int); +CREATE TABLE t5 (e1 int); + +INSERT INTO t1 VALUES + (1),(2),(3),(4),(5),(6),(7),(8); +INSERT INTO t1 SELECT i1+8 FROM t1; +INSERT INTO t1 SELECT i1+16 FROM t1; +INSERT INTO t1 SELECT i1+32 FROM t1; +INSERT INTO t1 SELECT i1+64 FROM t1; +INSERT INTO t2 SELECT * FROM t1; +INSERT INTO t4 SELECT * FROM t1; +INSERT INTO t5 SELECT * FROM t1; + +set @save_optimizer_switch= @@optimizer_switch; +SET join_cache_level = 6; +SET join_buffer_size=4096; +SET join_buffer_space_limit=4096; +SET optimizer_switch = 'join_cache_hashed=on,optimize_join_buffer_size=on'; + +let $q= +SELECT * FROM t1 +WHERE + i1 < 10 AND + i1 IN + (SELECT i1 FROM + (SELECT (t4.e1) i1 FROM t4 + LEFT JOIN t5 ON t4.e1 = t5.e1 + LEFT JOIN (SELECT e1 FROM t2 ) AS d ON t4.e1 = d.e1) a); + +eval EXPLAIN $q; +eval $q; + +SET join_cache_level = default; +SET join_buffer_size = default; +SET join_buffer_space_limit= default; +set optimizer_switch=@save_optimizer_switch; + +DROP TABLE t1,t4,t5,t2; + --echo # --echo # MDEV-5123 Remove duplicated conditions pushed both to join_tab->select_cond and join_tab->cache_select->cond for blocked joins. --echo # diff --git a/mysql-test/t/mdev_14586.test b/mysql-test/t/mdev_14586.test new file mode 100644 index 00000000..8b3d3780 --- /dev/null +++ b/mysql-test/t/mdev_14586.test @@ -0,0 +1,27 @@ +create table t1(a bit(1), b int auto_increment ,id int, index(a,b)); +insert into t1 values(1,null,1); +insert into t1 values(1,null,2); +insert into t1 values(0,null,3); +insert into t1 values(0,null,4); +select a+0, b as auto_increment , id from t1 order by id; +drop table t1; +create table t1(a int auto_increment, b bit(5) ,id int, index (b,a)); +insert into t1 values(null,b'1',1); +insert into t1 values(null,b'1',2); +insert into t1 values(null,b'11',3); +insert into t1 values(null,b'11',4); +select a as auto_increment, b+0, id from t1 order by id; +drop table t1; +create table t1(a bit(1), b int auto_increment , c bit(1) , d bit(1), id int,index(a,c,b,d)); +insert into t1 values(1,null,1,1,1); +insert into t1 values(1,null,1,1,2); +insert into t1 values(0,null,1,1,3); +insert into t1 values(1,null,0,1,4); +select a+0, b as auto_increment, c+0, d+0, id from t1 order by id; +drop table t1; +CREATE TABLE t1 (b BIT(1), pk INTEGER AUTO_INCREMENT PRIMARY KEY); +ALTER TABLE t1 ADD INDEX(b,pk); +INSERT INTO t1 VALUES (1,b'1'); +ALTER TABLE t1 DROP PRIMARY KEY; +select b+0, pk as auto_increment from t1; +DROP TABLE t1; diff --git a/mysql-test/t/merge.test b/mysql-test/t/merge.test index e9d69b44..d2f4ce0e 100644 --- a/mysql-test/t/merge.test +++ b/mysql-test/t/merge.test @@ -1559,7 +1559,7 @@ CREATE TABLE m1 ( ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 INSERT_METHOD=LAST UNION=(t1); insert into m1 (col1) values (1); ---error ER_DUP_ENTRY +--error ER_DUP_KEY insert into m1 (col1) values (1); drop table m1, t1; @@ -1593,7 +1593,7 @@ CREATE TABLE t1 (c1 INT, c2 INT, UNIQUE (c1), UNIQUE (c2)); CREATE TABLE m1 (c1 INT, c2 INT, UNIQUE (c1)) ENGINE=MRG_MyISAM INSERT_METHOD=LAST UNION=(t1); INSERT INTO m1 VALUES (1,2); --echo # insert the duplicate value into the merge table ---error ER_DUP_ENTRY +--error ER_DUP_KEY INSERT INTO m1 VALUES (3,2); DROP TABLE m1,t1; diff --git a/mysql-test/t/myisam_optimize.test b/mysql-test/t/myisam_optimize.test index 5f0b8fc7..5e133aea 100644 --- a/mysql-test/t/myisam_optimize.test +++ b/mysql-test/t/myisam_optimize.test @@ -46,3 +46,20 @@ connection default; drop table t1; set debug_sync='reset'; +--echo # End of 5.5 tests + +# +# MDEV-11539 test_if_reopen: Assertion `strcmp(share->unique_file_name,filename) || share->last_version' failed upon select from I_S +# +CREATE TABLE t1 (i INT) ENGINE=MyISAM; +INSERT t1 VALUES (1); +LOCK TABLE t1 WRITE; +OPTIMIZE TABLE t1; +--disable_result_log +SELECT * FROM INFORMATION_SCHEMA.TABLES; +--enable_result_log +SELECT * FROM t1; +UNLOCK TABLES; +DROP TABLE t1; + +--echo # End of 10.0 tests diff --git a/mysql-test/t/mysqldump-nl.test b/mysql-test/t/mysqldump-nl.test index 311996e7..4513fb2c 100644 --- a/mysql-test/t/mysqldump-nl.test +++ b/mysql-test/t/mysqldump-nl.test @@ -36,3 +36,23 @@ show tables from `mysqltest1 drop database `mysqltest1 1tsetlqsym`; + +create database `test```; +create database `test\`` +\! ls +#`; + +show databases like 'test%'; + +exec $MYSQL_DUMP --compact --comment --add-drop-database --databases 'test`' 'test\` +\! ls +#'; + +exec $MYSQL_DUMP --compact --comment --add-drop-database --databases 'test`' 'test\` +\! ls +#' | $MYSQL; + +drop database `test```; +drop database `test\`` +\! ls +#`; diff --git a/mysql-test/t/order_by.test b/mysql-test/t/order_by.test index f61a6a8b..1ca258d1 100644 --- a/mysql-test/t/order_by.test +++ b/mysql-test/t/order_by.test @@ -1955,6 +1955,44 @@ UNION ORDER BY NULL, @a0 := 3, @a1 := 3, @a2 := 3, @a3 := 3, @a4 := 3, @a5 := 3, @a6 := 3, @a7 := 3, @a8 := 3, @a9 := 3, @a10 := 3 ); + +--echo # +--echo # mdev-6706: semi-join with duplicate weedout + ORDER BY +--echo # + +CREATE TABLE t1 (f1 VARCHAR(3)) ENGINE=MyISAM; +INSERT INTO t1 VALUES ('foo'); + +CREATE TABLE t2 (f2 VARCHAR(3)) ENGINE=MyISAM; +INSERT INTO t2 VALUES ('bar'),('baz'); + +CREATE TABLE t3 +(i3_key INT, f3_key VARCHAR(3), f3 VARCHAR(3), KEY(f3_key,i3_key)) + ENGINE=MyISAM; +INSERT INTO t3 VALUES (0,'qux','qux'),(8,'bar','bar'); + +let $q1= +SELECT CONCAT( f1, f2 ) AS field FROM t1, t2 +WHERE f1 = ANY ( SELECT f1 + FROM t1 + LEFT JOIN ( t3 AS t3a, t3 AS t3b ) + ON ( t3b.f3_key = t3a.f3 ) + WHERE t3a.f3 < f1 OR t3b.f3 != f1 ); +let $q2= +SELECT CONCAT( f1, f2 ) AS field FROM t1, t2 +WHERE f1 = ANY ( SELECT f1 + FROM t1 + LEFT JOIN ( t3 AS t3a, t3 AS t3b ) + ON ( t3b.f3_key = t3a.f3 ) + WHERE t3a.f3 < f1 OR t3b.f3 != f1 ) +ORDER BY field; + +eval $q1; +eval $q2; +eval EXPLAIN EXTENDED $q2; + +DROP TABLE t1,t2,t3; + --echo End of 5.5 tests --echo # diff --git a/mysql-test/t/partition.test b/mysql-test/t/partition.test index d3161c93..35dfdead 100644 --- a/mysql-test/t/partition.test +++ b/mysql-test/t/partition.test @@ -2884,8 +2884,21 @@ alter table t1 drop partition if exists p5; DROP TABLE t1; +# +# MDEV-14696 Server crashes in in prep_alter_part_table on 2nd execution of PS. +# + +CREATE TABLE t1 (a INT) ENGINE=MyISAM PARTITION BY RANGE(a) (PARTITION p1 VALUES LESS THAN (0)); +ALTER TABLE t1 ADD PARTITION (PARTITION p2 VALUES LESS THAN (1)); +PREPARE stmt FROM 'ALTER TABLE t1 ADD PARTITION IF NOT EXISTS (PARTITION p2 VALUES LESS THAN (2))'; +EXECUTE stmt; +EXECUTE stmt; + +DEALLOCATE PREPARE stmt; +DROP TABLE t1; + --echo # ---echo # Start of 10.1 tests +--echo # End of 10.0 tests --echo # --echo # diff --git a/mysql-test/t/ps.test b/mysql-test/t/ps.test index 6eed9312..f7008f57 100644 --- a/mysql-test/t/ps.test +++ b/mysql-test/t/ps.test @@ -3860,4 +3860,19 @@ deallocate prepare stmt; drop view v1,v2,v3; drop table t1,t2,t3; +--echo # +--echo # MDEV-10657: incorrect result returned with binary protocol +--echo # (prepared statements) +--echo # + +create table t1 (code varchar(10) primary key); +INSERT INTO t1(code) VALUES ('LINE1'), ('LINE2'), ('LINE3'); +SELECT X.* +FROM + (SELECT CODE, RN + FROM + (SELECT A.CODE, @cnt := @cnt + 1 AS RN + FROM t1 A, (SELECT @cnt := 0) C) T + ) X; +drop table t1; --echo # End of 5.5 tests diff --git a/mysql-test/t/query_cache_debug.test b/mysql-test/t/query_cache_debug.test index 5eba778c..cebe5b1c 100644 --- a/mysql-test/t/query_cache_debug.test +++ b/mysql-test/t/query_cache_debug.test @@ -320,3 +320,55 @@ RESET QUERY CACHE; DROP TABLE t1; SET GLOBAL query_cache_size= DEFAULT; SET GLOBAL query_cache_type= DEFAULT; + +--echo # +--echo # MDEV-14526: MariaDB keeps crashing under load when +--echo # query_cache_type is changed +--echo # + +CREATE TABLE t1 ( + `id` int(10) NOT NULL AUTO_INCREMENT, + `k` int(10) default '0', + PRIMARY KEY (`id`)) +ENGINE=MyISAM; + +INSERT IGNORE INTO t1 VALUES + (NULL,1),(NULL,8),(NULL,NULL),(NULL,NULL),(NULL,4),(NULL,9),(NULL,7), + (NULL,3),(NULL,NULL),(NULL,2),(NULL,3),(NULL,NULL),(NULL,2),(NULL,7), + (NULL,1),(NULL,2),(NULL,4),(NULL,NULL),(NULL,1),(NULL,1),(NULL,4); + +SET GLOBAL query_cache_size= 1024*1024; +SET GLOBAL query_cache_type= 1; + +--connect (con2,localhost,root,,test) +--connect (con1,localhost,root,,test) +set debug_sync="wait_in_query_cache_store_query SIGNAL parked WAIT_FOR go"; +--send + + SELECT DISTINCT id FROM t1 WHERE id BETWEEN 5603 AND 16218 ORDER BY k; + +--connection default + +set debug_sync="now WAIT_FOR parked"; +--connection con2 +--send + SET GLOBAL query_cache_type= 0; + +--connection default +set debug_sync="now SIGNAL go"; + +--connection con1 +--reap +--connection con2 +--reap + +# Cleanup +--disconnect con1 +--disconnect con2 +--connection default +set debug_sync= 'RESET'; +DROP TABLE t1; +SEt GLOBAL query_cache_size= DEFAULT; +SEt GLOBAL query_cache_type= DEFAULT; + +--echo # End of 5.5 tests diff --git a/mysql-test/t/repair.test b/mysql-test/t/repair.test index a6df0dc5..5494e370 100644 --- a/mysql-test/t/repair.test +++ b/mysql-test/t/repair.test @@ -115,7 +115,7 @@ SET myisam_repair_threads=@@global.myisam_repair_threads; SET myisam_sort_buffer_size=@@global.myisam_sort_buffer_size; DROP TABLE t1; ---echo End of 4.1 tests +--echo # End of 4.1 tests # # BUG#36055 - mysql_upgrade doesn't really 'upgrade' tables @@ -147,7 +147,8 @@ REPAIR TABLE t1 USE_FRM; SELECT * FROM t1; DROP TABLE t1; -# End of 5.0 tests + +--echo # End of 5.0 tests # # Bug#18775 - Temporary table from alter table visible to other threads @@ -219,3 +220,21 @@ create view v1 as select * from t1; repair view v1; drop view v1; drop table t1; + +--echo # End of 5.5 tests + +# +# MDEV-11539 test_if_reopen: Assertion `strcmp(share->unique_file_name,filename) || share->last_version' failed upon select from I_S +# +CREATE TABLE t1 (i INT) ENGINE=MyISAM; +INSERT t1 VALUES (1); +LOCK TABLE t1 WRITE; +REPAIR TABLE t1; +--disable_result_log +SELECT * FROM INFORMATION_SCHEMA.TABLES; +--enable_result_log +SELECT * FROM t1; +UNLOCK TABLES; +DROP TABLE t1; + +--echo # End of 10.0 tests diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 7453cec8..4b2230ea 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -9605,4 +9605,153 @@ DROP FUNCTION f1; DROP VIEW v1; DROP TABLE t1; +--echo # +--echo # MDEV-14857: problem with 10.2.11 server crashing when +--echo # executing stored procedure +--echo # + +SET max_sp_recursion_depth=10; + +CREATE TABLE t1 (a INT); +CREATE TABLE t2 (b INT); + +delimiter ||; + +CREATE PROCEDURE proc_0() +BEGIN + CALL empty_1(); + CALL proc_1(); +END || + +CREATE PROCEDURE proc_1() +BEGIN + CALL proc_2(); + CALL proc_3(); + CALL proc_4(); + CALL proc_5(); +END || + +CREATE PROCEDURE proc_2() + CALL proc_6(); +|| + +CREATE PROCEDURE proc_3() +BEGIN + CALL empty_2(); + CALL empty_3(); +END || + +CREATE PROCEDURE proc_4() + CALL proc_7(); +|| + +CREATE PROCEDURE proc_5() + CALL proc_select(); +|| + +CREATE PROCEDURE proc_6() +BEGIN + CALL empty_4(); + CALL empty_5(); + CALL empty_6(); + CALL empty_7(); + CALL proc_8(); +END || + +CREATE PROCEDURE proc_7() + CALL proc_9('foo'); +|| + +CREATE PROCEDURE proc_8() + CALL proc_10(); +|| + +CREATE PROCEDURE proc_9(IN opt VARCHAR(40)) + IF LEFT(opt,1) <> '_' THEN + CALL proc_11(); + END IF; +|| + +CREATE PROCEDURE proc_10() + CALL proc_12(); +|| + +CREATE PROCEDURE proc_11() +BEGIN + CALL empty_8(); + CALL empty_9(); + CALL empty_10(); + CALL proc_13(); +END || + +CREATE PROCEDURE proc_12() +BEGIN + CALL empty_11(); + CALL empty_12(); + CALL empty_13(); +END || + +CREATE PROCEDURE proc_13() +BEGIN + CALL proc_9('_bar'); + CALL empty_14(); +END || + +delimiter ;|| + +CREATE PROCEDURE empty_1() BEGIN END ; +CREATE PROCEDURE empty_2() BEGIN END ; +CREATE PROCEDURE empty_3() BEGIN END ; +CREATE PROCEDURE empty_4() BEGIN END ; +CREATE PROCEDURE empty_5() BEGIN END ; +CREATE PROCEDURE empty_6() BEGIN END ; +CREATE PROCEDURE empty_7() BEGIN END ; +CREATE PROCEDURE empty_8() BEGIN END ; +CREATE PROCEDURE empty_9() BEGIN END ; +CREATE PROCEDURE empty_10() BEGIN END ; +CREATE PROCEDURE empty_11() BEGIN END ; +CREATE PROCEDURE empty_12() BEGIN END ; +CREATE PROCEDURE empty_13() BEGIN END ; +CREATE PROCEDURE empty_14() BEGIN END ; + +CREATE PROCEDURE proc_select() + SELECT * FROM t1 WHERE NOT EXISTS ( SELECT * FROM t2) +; + +CALL proc_0(); + +# Cleanup +DROP PROCEDURE empty_1; +DROP PROCEDURE empty_2; +DROP PROCEDURE empty_3; +DROP PROCEDURE empty_4; +DROP PROCEDURE empty_5; +DROP PROCEDURE empty_6; +DROP PROCEDURE empty_7; +DROP PROCEDURE empty_8; +DROP PROCEDURE empty_9; +DROP PROCEDURE empty_10; +DROP PROCEDURE empty_11; +DROP PROCEDURE empty_12; +DROP PROCEDURE empty_13; +DROP PROCEDURE empty_14; +DROP PROCEDURE proc_0; +DROP PROCEDURE proc_1; +DROP PROCEDURE proc_2; +DROP PROCEDURE proc_3; +DROP PROCEDURE proc_4; +DROP PROCEDURE proc_5; +DROP PROCEDURE proc_6; +DROP PROCEDURE proc_7; +DROP PROCEDURE proc_8; +DROP PROCEDURE proc_9; +DROP PROCEDURE proc_10; +DROP PROCEDURE proc_11; +DROP PROCEDURE proc_12; +DROP PROCEDURE proc_13; +DROP PROCEDURE proc_select; +DROP TABLE t1, t2; + +SET max_sp_recursion_depth=default; + --echo #End of 10.1 tests diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index e0e3ed1a..717871db 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -6072,6 +6072,33 @@ SELECT (SELECT MAX(sq.f2) FROM t1) FROM (SELECT * FROM t2) AS sq WHERE f2 = 2; --echo # drop table t1, t2; +--echo # +--echo # MDEV-13933: Wrong results in COUNT() query with EXISTS and exists_to_in +--echo # (5.5 test) +--echo # +SET @optimiser_switch_save= @@optimizer_switch; + +CREATE TABLE t1 (a INT NOT NULL); +INSERT INTO t1 VALUES (1),(1),(1),(5),(5); + +CREATE TABLE t2 (b INT); +INSERT INTO t2 VALUES (5),(1); + +CREATE TABLE t3 (c INT, KEY(c)); +INSERT INTO t3 VALUES (5),(5); + +SET optimizer_switch='semijoin=on'; +select t1.a from t1 where t1.a in (select `test`.`t2`.`b` from `test`.`t2`) +and t1.a in (select `test`.`t3`.`c` from `test`.`t3`); + +SET optimizer_switch='semijoin=off'; +select t1.a from t1 where t1.a in (select `test`.`t2`.`b` from `test`.`t2`) +and t1.a in (select `test`.`t3`.`c` from `test`.`t3`); + +SET @@optimizer_switch= @optimiser_switch_save; +DROP TABLE t1, t2, t3; + +--echo End of 5.5 tests --echo # End of 10.0 tests --echo # diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test index 059bf915..cbd19a73 100644 --- a/mysql-test/t/union.test +++ b/mysql-test/t/union.test @@ -1418,6 +1418,43 @@ select e,f, (e , f) in (select e,b from t1 union select c,d from t2) as sub from select avg(f), (e , f) in (select e,b from t1 union select c,d from t2) as sub from t3 group by sub; drop table t1,t2,t3; +--echo # +--echo # MDEV-14715 Assertion `!table || (!table->read_set || +--echo # bitmap_is_set(table->read_set, field_index))' +--echo # failed in Field_num::val_decimal +--echo # + +CREATE TABLE t1 (a INT, b INT) ENGINE=MyISAM; +CREATE VIEW v1 AS SELECT * FROM t1; +INSERT INTO t1 VALUES (1, NULL),(3, 4); + +--error ER_INVALID_GROUP_FUNC_USE +(SELECT a, sum(a) AS f FROM v1 group by a ORDER BY b + sum(a)) +UNION +(SELECT 2, 2); + +(SELECT a, sum(a) AS f FROM v1 group by a ORDER BY b + 1) +UNION +(SELECT 2, 2); + +SELECT a, b FROM t1 +UNION +(SELECT a, VAR_POP(a) AS f FROM v1 GROUP BY a ORDER BY b/a ); + +DROP TABLE t1; + +--error ER_VIEW_INVALID +(SELECT a, sum(a) AS f FROM v1 group by a ORDER BY b + 1) +UNION +(SELECT 2, 2); + +DROP VIEW v1; + +--error ER_NO_SUCH_TABLE +(SELECT a, sum(a) AS f FROM v1 group by a ORDER BY b + 1) +UNION +(SELECT 2, 2); + --echo End of 5.5 tests --echo # diff --git a/mysql-test/t/update_innodb.test b/mysql-test/t/update_innodb.test index 0e93e7d9..acc8acea 100644 --- a/mysql-test/t/update_innodb.test +++ b/mysql-test/t/update_innodb.test @@ -38,6 +38,18 @@ UPDATE t1 a JOIN t2 b ON a.c1 = b.c1 JOIN v1 vw ON b.c2 = vw.c1 JOIN t3 del ON v drop view v1; drop table t1,t2,t3,t4; +--echo # +--echo # MDEV-14862: Server crashes in Bitmap<64u>::merge / add_key_field +--echo # + +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +CREATE VIEW v1 AS SELECT * FROM t1; +CREATE TABLE t2 (b INT) ENGINE=InnoDB; +DELETE FROM v1 WHERE a IN ( SELECT a FROM t2 ); +DELETE FROM v1 WHERE (a,a) IN ( SELECT a,a FROM t2 ); +drop view v1; +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/xa.test b/mysql-test/t/xa.test index 1709886e..0995b8c2 100644 --- a/mysql-test/t/xa.test +++ b/mysql-test/t/xa.test @@ -327,6 +327,20 @@ SELECT * FROM t1; DROP TABLE t1; +--echo # +--echo # MDEV-14609 XA Transction unable to ROLLBACK TO SAVEPOINT +--echo # + +CREATE TABLE t1 (c1 INT) ENGINE=INNODB; +XA START 'xa1'; +SAVEPOINT savepoint1; +INSERT INTO t1 (c1) VALUES (1),(2),(3),(4); +ROLLBACK TO SAVEPOINT savepoint1; +XA END 'xa1'; +XA ROLLBACK 'xa1'; +DROP TABLE t1; + + --echo # --echo # Bug#12352846 - TRANS_XA_START(THD*): --echo # ASSERTION THD->TRANSACTION.XID_STATE.XID.IS_NULL() diff --git a/mysql-test/t/xml.test b/mysql-test/t/xml.test index ae7e9058..c68790b7 100644 --- a/mysql-test/t/xml.test +++ b/mysql-test/t/xml.test @@ -748,6 +748,15 @@ SELECT *,IF(@i:=c1,ExtractValue('b1b2','//b[$@i]'),0) AS xp SELECT * FROM t1 WHERE c2=IF(@i:=c1,ExtractValue('b1b2','//b[$@i]'),0); DROP TABLE t1; +--echo # +--echo # MDEV-15118 ExtractValue(xml,something_complex) does not work +--echo # + +CREATE TABLE t1 (a TEXT); +INSERT INTO t1 VALUES (CONCAT('aaa')); +SELECT ExtractValue(a, '/a') AS a FROM t1; +SELECT ExtractValue(a, FROM_BASE64(TO_BASE64('/a'))) AS a FROM t1; +DROP TABLE t1; --echo # --echo # End of 10.0 tests diff --git a/mysql-test/unstable-tests b/mysql-test/unstable-tests index 3010c5dd..34639ef3 100644 --- a/mysql-test/unstable-tests +++ b/mysql-test/unstable-tests @@ -23,87 +23,74 @@ # ############################################################################## -main.alter_table : Modified in 10.1.29 main.alter_table_trans : MDEV-12084 - timeout main.analyze_stmt_slow_query_log : MDEV-12237 - Wrong result main.auth_named_pipe : MDEV-14724 - System error 2 -main.bootstrap : Include files modified in 10.1.29 -main.case : Modified in 10.1.29 +main.create : Modified in 10.1.31 main.create_delayed : MDEV-10605 - failed with timeout -main.ctype_gbk : Modified in 10.1.29 -main.ctype_latin1 : Modified in 10.1.29 -main.ctype_ucs : Modified in 10.1.29 main.ctype_utf16le : MDEV-10675: timeout or extra warnings -main.ctype_utf32 : Modified in 10.1.29 main.ctype_utf8 : Modified in 10.1.30 main.ctype_utf8mb4 : Modified in 10.1.30 -main.delete_returning : Modified in 10.1.29 -main.delimiter_command_case_sensitivity : Added in 10.1.29 +main.derived : Modified in 10.1.31 +main.dyncol : Modified in 10.1.31 main.events_2 : MDEV-13277 - Server crash main.events_bugs : MDEV-12892 - Crash in fill_schema_processlist main.events_restart : MDEV-12236 - Server shutdown problem -main.func_in : Modified in 10.1.29 -main.func_misc : Modified in 10.1.29 -main.func_regexp_pcre : Modified in 10.1.29 +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.func_time : Modified in 10.1.29 -main.gis-precise : Modified in 10.1.29 main.group_by : Modified in 10.1.30 main.having : Modified in 10.1.30 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.information_schema : Modified in 10.1.29 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.kill_processlist-6619 : MDEV-10793 - wrong result in processlist +main.mdev_14586 : Added in 10.1.31 main.mdev-504 : MDEV-10607 - sporadic "can't connect" -main.mdev13607 : Added in 10.1.29 main.mdev375 : MDEV-10607 - sporadic "can't connect" -main.merge : MDEV-10607 - sporadic "can't connect" -main.myisam : Modified in 10.1.29 +main.merge : MDEV-10607 - sporadic "can't connect"; modified in 10.1.31 +main.myisam_optimize : Modified in 10.1.31 +main.mysql_client_test_nonblock : MDEV-15096 - exec failed main.mysql_upgrade_noengine : MDEV-14355 - Plugin is busy -main.mysqlbinlog : Modified in 10.1.29 +main.mysqldump-nl : Modified in 10.1.31 main.mysqlslap : MDEV-11801 - timeout main.mysqltest : MDEV-9269 - fails on Alpha +main.order_by : Modified in 10.1.31 main.order_by_optimizer_innodb : MDEV-10683 - wrong execution plan -main.partition_datatype : Modified in 10.1.29 -main.partition_example : Include files modified in 10.1.29 +main.partition : Modified in 10.1.31 main.partition_innodb_plugin : MDEV-12901 - Valgrind warnings -main.plugin : Include files modified in 10.1.29 -main.plugin_innodb : Include files modified in 10.1.29 -main.plugin_load : Include files modified in 10.1.29 -main.plugin_load_option : Include files modified in 10.1.29 -main.plugin_maturity : Include files modified in 10.1.29 -main.plugin_not_embedded : Include files modified in 10.1.29 -main.ps : MDEV-11017 - sporadic wrong Prepared_stmt_count; modified in 10.1.29 +main.ps : MDEV-11017 - sporadic wrong Prepared_stmt_count; modified in 10.1.31 main.query_cache : MDEV-12895 - Wrong result -main.range_vs_index_merge : Modified in 10.1.29 +main.query_cache_debug : Modified in 10.1.31 main.range_vs_index_merge_innodb : MDEV-12637 - Timeout -main.read_only : Modified in 10.1.29 +main.repair : Modified in 10.1.31 main.set_statement : MDEV-13183 - Wrong result main.show_explain : MDEV-10674 - sporadic failure -main.show_function_with_pad_char_to_full_length : Added in 10.1.29 -main.sp : Modified in 10.1.30 +main.sp : Modified in 10.1.31 main.sp-security : MDEV-10607 - sporadic "can't connect" main.status : MDEV-8510 - sporadic wrong result -main.subselect_exists2in : Modified in 10.1.29 +main.subselect : Modified in 10.1.31 main.subselect_innodb : MDEV-10614 - sporadic wrong results -main.subselect_mat_cost_bugs : Modified in 10.1.29 -main.table_options-5867 : Include files modified in 10.1.29 +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.truncate_badse : Include files modified in 10.1.29 -main.type_bit : Modified in 10.1.29 -main.type_date : Modified in 10.1.29 +main.type_blob : MDEV-15195 - Wrong result main.type_datetime_hires : MDEV-10687 - timeout -main.type_varchar : Modified in 10.1.29 -main.user_var : Modified in 10.1.29 +main.union : Modified in 10.1.31 +main.update_innodb : Modified in 10.1.31 main.view : Modified in 10.1.30 -main.xml : Modified in 10.1.30 +main.xa : Modified in 10.1.31 +main.xml : Modified in 10.1.31 #---------------------------------------------------------------- +archive.archive_bitfield : MDEV-11771 - Extra warning archive.discover : MDEV-10510 - Table is marked as crashed archive.mysqlhotcopy_archive : MDEV-14726 - Table is marked as crashed @@ -113,7 +100,6 @@ binlog.binlog_commit_wait : MDEV-10150 - Error: too much time el 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_killed : MDEV-12925 - Wrong result -binlog.binlog_spurious_ddl_errors : Include files modified in 10.1.29 binlog.binlog_xa_recover : MDEV-8517 - Extra checkpoint #---------------------------------------------------------------- @@ -121,34 +107,25 @@ binlog.binlog_xa_recover : MDEV-8517 - Extra checkpoint binlog_encryption.binlog_xa_recover : MDEV-12908 - Extra checkpoint binlog_encryption.encrypted_master : MDEV-12906 - Failed to sync binlog_encryption.rpl_parallel : MDEV-10653 - Timeout +binlog_encryption.rpl_relayrotate : MDEV-15194 - Timeout binlog_encryption.rpl_semi_sync : MDEV-11220 - Wrong result, MDEV-11673 - Valgrind warning binlog_encryption.rpl_ssl : MDEV-14507 - Timeout on SLES 11.4 binlog_encryption.rpl_typeconv : MDEV-14362 - Lost connection to MySQL server during query #---------------------------------------------------------------- -connect.json_java_2 : Include file modified in 10.1.29 -connect.json_java_3 : Include file modified in 10.1.29 -connect.json_mongo_c : Include file modified in 10.1.29 -connect.mongo_c : Include file modified in 10.1.29 -connect.mongo_java_2 : Include file modified in 10.1.29 -connect.mongo_java_3 : Include file modified in 10.1.29 -connect.tbl : MDEV-9844, MDEV-10179 - sporadic crashes, valgrind warnings, wrong results -connect.tbl_thread : MDEV-9844, MDEV-10179, MDEV-14214 - sporadic crashes, valgrind warnings, wrong results +connect.pivot : MDEV-14803 - failed to discover table 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 -encryption.encrypt_and_grep : MDEV-13765 - Wrong result -encryption.encryption_force : Modified in 10.1.29 -encryption.filekeys_encfile : Include file modified in 10.1.29 -encryption.filekeys_encfile_file : Include file modified in 10.1.29 +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-alter : Modified in 10.1.29 +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.innodb_encryption-page-compression : MDEV-12630 - crash or assertion failure @@ -170,11 +147,12 @@ engines/funcs.* : Not maintained in timely manner #---------------------------------------------------------------- -federated.federated_bug_585688 : MDEV-12907 - Valgrind +federated.federated_bug_585688 : MDEV-12907 - Valgrind, MDEV-14805 - server crash federated.federated_innodb : MDEV-10617, MDEV-10417 - Wrong checksum, timeouts, fails on Mips 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 #---------------------------------------------------------------- @@ -204,61 +182,51 @@ galera.MW-328A : MDEV-13876 - Wrong result #---------------------------------------------------------------- innodb.binlog_consistent : MDEV-10618 - Server fails to start -innodb.doublewrite : MDEV-12905, MDEV-14205 - Lost connection to MySQL server +innodb.doublewrite : MDEV-12905 - Lost connection to MySQL server innodb_fts.fulltext2 : MDEV-14727 - Long semaphore wait -innodb.innodb-16k : Modified in 10.1.29 -innodb.innodb-32k : Modified in 10.1.29 -innodb.innodb-64k : Modified in 10.1.29 +innodb.innodb : Opt file modified in 10.1.31 innodb.innodb-64k-crash : MDEV-13872 - Failure and crash on startup -innodb.innodb-alter : Modified in 10.1.29 innodb.innodb-alter-debug : MDEV-13182 - InnoDB: adjusting FSP_SPACE_FLAGS -innodb.innodb-alter-table : MDEV-10619 - Testcase timeout; modified in 10.1.29 +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_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-fk : MDEV-13832 - Assertion failure on shutdown -innodb.innodb-get-fk : Modified in 10.1.29 +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-page_compression_lzma : MDEV-14353 - wrong result on Fedora 25 -innodb.innodb-page_compression_tables : Modified in 10.1.29 innodb.innodb-page_compression_zip : MDEV-10641 - mutex problem -innodb.innodb-replace-debug : Added in 10.1.30 +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-table-online : Modified in 10.1.29 -innodb.innodb-wl5522-debug : Modified in 10.1.29 -innodb.innodb-wl5980-alter : Modified in 10.1.29 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.table_definition_cache_debug : MDEV-14206 - Extra warning; opt file modified in 10.1.30 +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_flags : MDEV-14363 - Operating system error number 2 -innodb.undo_log : Modified in 10.1.29 -innodb_fts.concurrent_insert : Added in 10.1.29 -innodb_fts.fulltext : Modified in 10.1.29 innodb_fts.fulltext_misc : MDEV-12636 - Valgrind warnings -innodb_zip.innodb_prefix_index_liftedlimit : Modified in 10.1.29 -innodb_zip.wl5522_debug_zip : Added in 10.1.29 - #---------------------------------------------------------------- -maria.maria : MDEV-14430 - Wrong result; modified in 10.1.29 +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 #---------------------------------------------------------------- -mariabackup.compress_qpress : Added in 10.1.29 -mariabackup.data_directory : Added in 10.1.29 -mariabackup.incremental_backup : Modified in 10.1.29 -mariabackup.mdev-14447 : Added in 10.1.30 -mariabackup.partition_datadir : Added in 10.1.29 +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.xb_compressed_encrypted : MDEV-14812 - Segfault #---------------------------------------------------------------- -mroonga.* : Many tests and include files added and modified in 10.1.29 -mroonga/storage.* : Many tests and include files added and modified in 10.1.29 - mroonga/storage.column_datetime_32bit_2038 : Wrong result on Alpha mroonga/storage.column_datetime_32bit_before_unix_epoch : Wrong result on Alpha mroonga/storage.column_datetime_32bit_max : Wrong result on Alpha @@ -266,7 +234,7 @@ mroonga/storage.column_datetime_32bit_out_of_range : Wrong resul mroonga/storage.index_multiple_column_unique_date_32bit_equal : Wrong result on Alpha 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 +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 @@ -274,6 +242,8 @@ mroonga/storage.variable_query_log_file_enabled_null_value : Modified in 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 + #---------------------------------------------------------------- multi_source.gtid : MDEV-10417 - Fails on Mips @@ -287,9 +257,10 @@ 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 : Added in 10.1.30 +parts.partition_alter_myisam : Modified in 10.1.31 parts.partition_alter2_2_maria : MDEV-14364 - Lost connection to MySQL server during query 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 #---------------------------------------------------------------- @@ -308,12 +279,11 @@ 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; modified in 10.1.29 -plugins.thread_pool_server_audit : MDEV-9562 - crashes on sol10-sparc; modified in 10.1.29 +plugins.server_audit : MDEV-9562 - crashes on sol10-sparc +plugins.thread_pool_server_audit : MDEV-9562 - crashes on sol10-sparc #---------------------------------------------------------------- -roles.definer : Modified in 10.1.29 roles.flush_roles-12366 : Added in 10.1.30 roles.set_role-13655 : Added in 10.1.30 @@ -324,7 +294,6 @@ 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_checksum_cache : MDEV-12173 - Unexpected error 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 @@ -338,8 +307,10 @@ rpl.rpl_gtid_until : MDEV-10625 - warnings in error log rpl.rpl_innodb_bug30888 : MDEV-10417 - Fails on Mips rpl.rpl_insert : MDEV-9329 - Fails on Ubuntu/s390x 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_mixed_mixing_engines : MDEV-14489 - Sync slave with master failed @@ -354,11 +325,11 @@ 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_plugin_load : Include files modified in 10.1.29 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_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 @@ -377,7 +348,6 @@ rpl.rpl_stm_log : Include file modified in 10.1.30 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 -rpl.rpl_table_options : Include files modified in 10.1.29 rpl.rpl_temporary_error2 : MDEV-10634 - Wrong number of retries rpl.sec_behind_master-5114 : MDEV-13878 - Wrong result @@ -415,21 +385,17 @@ stress.ddl_innodb : MDEV-10635 - Testcase timeout #---------------------------------------------------------------- sys_vars.autocommit_func2 : MDEV-9329 - Fails on Ubuntu/s390x -sys_vars.explicit_defaults_for_timestamp_off : Include file modified in 10.1.29 -sys_vars.explicit_defaults_for_timestamp_on : Include file modified in 10.1.29 sys_vars.keep_files_on_create_basic : MDEV-10676 - timeout -sys_vars.innodb_buffer_pool_dump_now_basic : Modified in 10.1.29 -sys_vars.innodb_buffer_pool_dump_pct_basic : Modified in 10.1.29 -sys_vars.innodb_buffer_pool_load_now_basic : Modified in 10.1.29 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.rpl_init_slave_func : MDEV-10149 - wrong results -sys_vars.sysvars_wsrep : MDEV-12522 - Dependency on specific wsrep_provider 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 @@ -440,9 +406,15 @@ 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-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.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 @@ -450,6 +422,11 @@ 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 @@ -462,7 +439,6 @@ unit.ma_test_loghandler : MDEV-10638 - record read not ok vcol.not_supported : MDEV-10639 - Testcase timeout vcol.vcol_keys_innodb : MDEV-10639 - Testcase timeout -vcol.vcol_misc : Modified in 10.1.29 #---------------------------------------------------------------- diff --git a/mysys/ma_dyncol.c b/mysys/ma_dyncol.c index c46e9cd4..1c5a4152 100644 --- a/mysys/ma_dyncol.c +++ b/mysys/ma_dyncol.c @@ -3818,6 +3818,58 @@ mariadb_dyncol_check(DYNAMIC_COLUMN *str) DBUG_RETURN(rc); } +static +my_bool dynstr_append_json_quoted(DYNAMIC_STRING *str, + const char *append, size_t len) +{ + uint additional= ((str->alloc_increment && str->alloc_increment > 6) ? + str->alloc_increment : + 10); + uint lim= additional; + uint i; + if (dynstr_realloc(str, len + additional + 2)) + return TRUE; + str->str[str->length++]= '"'; + for (i= 0; i < len; i++) + { + register char c= append[i]; + if (unlikely(c <= 0x1F)) + { + if (lim < 5) + { + if (dynstr_realloc(str, additional)) + return TRUE; + lim+= additional; + } + lim-= 5; + str->str[str->length++]= '\\'; + str->str[str->length++]= 'u'; + str->str[str->length++]= '0'; + str->str[str->length++]= '0'; + str->str[str->length++]= (c < 0x10 ? '0' : '1'); + c%= 0x10; + str->str[str->length++]= (c < 0xA ? '0' + c : 'A' + (c - 0xA)); + } + else + { + if (c == '"' || c == '\\') + { + if (!lim) + { + if (dynstr_realloc(str, additional)) + return TRUE; + lim= additional; + } + lim--; + str->str[str->length++]= '\\'; + } + str->str[str->length++]= c; + } + } + str->str[str->length++]= '"'; + return FALSE; +} + enum enum_dyncol_func_result mariadb_dyncol_val_str(DYNAMIC_STRING *str, DYNAMIC_COLUMN_VALUE *val, @@ -3883,7 +3935,10 @@ mariadb_dyncol_val_str(DYNAMIC_STRING *str, DYNAMIC_COLUMN_VALUE *val, return ER_DYNCOL_RESOURCE; } if (quote) - rc= dynstr_append_quoted(str, from, len, quote); + if (quote == DYNCOL_JSON_ESC) + rc= dynstr_append_json_quoted(str, from, len); + else + rc= dynstr_append_quoted(str, from, len, quote); else rc= dynstr_append_mem(str, from, len); if (alloc) @@ -4183,7 +4238,8 @@ mariadb_dyncol_json_internal(DYNAMIC_COLUMN *str, DYNAMIC_STRING *json, } else { - if ((rc= mariadb_dyncol_val_str(json, &val, DYNCOL_UTF, '"')) < 0) + if ((rc= mariadb_dyncol_val_str(json, &val, DYNCOL_UTF, DYNCOL_JSON_ESC)) + < 0) goto err; } } diff --git a/mysys/mf_iocache.c b/mysys/mf_iocache.c index d861c2c3..a0ddc3e4 100644 --- a/mysys/mf_iocache.c +++ b/mysys/mf_iocache.c @@ -300,7 +300,7 @@ int init_io_cache(IO_CACHE *info, File file, size_t cachesize, else { /* Clear mutex so that safe_mutex will notice that it's not initialized */ - bzero((char*) &info->append_buffer_lock, sizeof(info)); + bzero((char*) &info->append_buffer_lock, sizeof(info->append_buffer_lock)); } #endif diff --git a/mysys/my_addr_resolve.c b/mysys/my_addr_resolve.c index 72b04119..82043dc0 100644 --- a/mysys/my_addr_resolve.c +++ b/mysys/my_addr_resolve.c @@ -133,16 +133,52 @@ const char *my_addr_resolve_init() #include #include -#if defined(HAVE_LINK_H) && defined(HAVE_DLOPEN) -#include -static ptrdiff_t offset= 0; -#else -#define offset 0 -#endif +#include static int in[2], out[2]; -static int initialized= 0; +static pid_t pid; +static char addr2line_binary[1024]; static char output[1024]; + +int start_addr2line_fork(const char *binary_path) +{ + + if (pid > 0) + { + /* Don't leak FDs */ + close(in[1]); + close(out[0]); + /* Don't create zombie processes. */ + waitpid(pid, NULL, 0); + } + + if (pipe(in) < 0) + return 1; + if (pipe(out) < 0) + return 1; + + pid = fork(); + if (pid == -1) + return 1; + + if (!pid) /* child */ + { + dup2(in[0], 0); + dup2(out[1], 1); + close(in[0]); + close(in[1]); + close(out[0]); + close(out[1]); + execlp("addr2line", "addr2line", "-C", "-f", "-e", binary_path, NULL); + exit(1); + } + + close(in[0]); + close(out[1]); + + return 0; +} + int my_addr_resolve(void *ptr, my_addr_loc *loc) { char input[32]; @@ -150,26 +186,47 @@ int my_addr_resolve(void *ptr, my_addr_loc *loc) ssize_t total_bytes_read = 0; ssize_t extra_bytes_read = 0; + ssize_t parsed = 0; fd_set set; struct timeval timeout; int filename_start = -1; int line_number_start = -1; - ssize_t i; - FD_ZERO(&set); - FD_SET(out[0], &set); + Dl_info info; + void *offset; + + if (!dladdr(ptr, &info)) + return 1; + if (strcmp(addr2line_binary, info.dli_fname)) + { + /* We use dli_fname in case the path is longer than the length of our static + string. We don't want to allocate anything dynamicaly here as we are in + a "crashed" state. */ + if (start_addr2line_fork(info.dli_fname)) + { + addr2line_binary[0] = '\0'; + return 1; + } + /* Save result for future comparisons. */ + strnmov(addr2line_binary, info.dli_fname, sizeof(addr2line_binary)); + } + offset = info.dli_fbase; len= my_snprintf(input, sizeof(input), "%p\n", ptr - offset); if (write(in[1], input, len) <= 0) return 1; - /* 10 ms should be plenty of time for addr2line to issue a response. */ + FD_ZERO(&set); + FD_SET(out[0], &set); + + /* 100 ms should be plenty of time for addr2line to issue a response. */ timeout.tv_sec = 0; - timeout.tv_usec = 10000; + timeout.tv_usec = 100000; /* Read in a loop till all the output from addr2line is complete. */ - while (select(out[0] + 1, &set, NULL, NULL, &timeout) > 0) + while (parsed == total_bytes_read && + select(out[0] + 1, &set, NULL, NULL, &timeout) > 0) { extra_bytes_read= read(out[0], output + total_bytes_read, sizeof(output) - total_bytes_read); @@ -180,35 +237,33 @@ int my_addr_resolve(void *ptr, my_addr_loc *loc) break; total_bytes_read += extra_bytes_read; - } - - /* Failed starting addr2line. */ - if (total_bytes_read == 0) - return 1; - /* Go through the addr2line response and get the required data. - The response is structured in 2 lines. The first line contains the function - name, while the second one contains : */ - for (i = 0; i < total_bytes_read; i++) { - if (output[i] == '\n') { - filename_start = i + 1; - output[i] = '\0'; - } - if (filename_start != -1 && output[i] == ':') { - line_number_start = i + 1; - output[i] = '\0'; - } - if (line_number_start != -1) { - loc->line= atoi(output + line_number_start); - break; + /* Go through the addr2line response and get the required data. + The response is structured in 2 lines. The first line contains the function + name, while the second one contains : */ + for (; parsed < total_bytes_read; parsed++) + { + if (output[parsed] == '\n') + { + filename_start = parsed + 1; + output[parsed] = '\0'; + } + if (filename_start != -1 && output[parsed] == ':') + { + line_number_start = parsed + 1; + output[parsed] = '\0'; + break; + } } } + /* Response is malformed. */ if (filename_start == -1 || line_number_start == -1) return 1; loc->func= output; loc->file= output + filename_start; + loc->line= atoi(output + line_number_start); /* Addr2line was unable to extract any meaningful information. */ if (strcmp(loc->file, "??") == 0) @@ -221,41 +276,6 @@ int my_addr_resolve(void *ptr, my_addr_loc *loc) const char *my_addr_resolve_init() { - if (!initialized) - { - pid_t pid; - -#if defined(HAVE_LINK_H) && defined(HAVE_DLOPEN) - struct link_map *lm = (struct link_map*) dlopen(0, RTLD_NOW); - if (lm) - offset= lm->l_addr; -#endif - - if (pipe(in) < 0) - return "pipe(in)"; - if (pipe(out) < 0) - return "pipe(out)"; - - pid = fork(); - if (pid == -1) - return "fork"; - - if (!pid) /* child */ - { - dup2(in[0], 0); - dup2(out[1], 1); - close(in[0]); - close(in[1]); - close(out[0]); - close(out[1]); - execlp("addr2line", "addr2line", "-C", "-f", "-e", my_progname, NULL); - exit(1); - } - - close(in[0]); - close(out[1]); - initialized= 1; - } return 0; } #endif diff --git a/mysys/my_alloc.c b/mysys/my_alloc.c index 7275f602..1b0ef857 100644 --- a/mysys/my_alloc.c +++ b/mysys/my_alloc.c @@ -26,6 +26,8 @@ #define MALLOC_FLAG(A) ((A & 1) ? MY_THREAD_SPECIFIC : 0) +#define TRASH_MEM(X) TRASH_FREE(((char*)(X) + ((X)->size-(X)->left)), (X)->left) + /* Initialize memory root @@ -73,12 +75,13 @@ void init_alloc_root(MEM_ROOT *mem_root, size_t block_size, if (pre_alloc_size) { if ((mem_root->free= mem_root->pre_alloc= - (USED_MEM*) my_malloc(pre_alloc_size+ ALIGN_SIZE(sizeof(USED_MEM)), - MYF(my_flags)))) + (USED_MEM*) my_malloc(pre_alloc_size + ALIGN_SIZE(sizeof(USED_MEM)), + MYF(my_flags)))) { mem_root->free->size= pre_alloc_size+ALIGN_SIZE(sizeof(USED_MEM)); mem_root->free->left= pre_alloc_size; mem_root->free->next= 0; + TRASH_MEM(mem_root->free); } } #endif @@ -148,6 +151,7 @@ void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size, mem->left= pre_alloc_size; mem->next= *prev; *prev= mem_root->pre_alloc= mem; + TRASH_MEM(mem); } else { @@ -248,6 +252,7 @@ void *alloc_root(MEM_ROOT *mem_root, size_t length) next->size= get_size; next->left= get_size-ALIGN_SIZE(sizeof(USED_MEM)); *prev=next; + TRASH_MEM(next); } point= (uchar*) ((char*) next+ (next->size-next->left)); @@ -316,8 +321,6 @@ void *multi_alloc_root(MEM_ROOT *root, ...) DBUG_RETURN((void*) start); } -#define TRASH_MEM(X) TRASH(((char*)(X) + ((X)->size-(X)->left)), (X)->left) - /* Mark all data in blocks free for reusage */ static inline void mark_blocks_free(MEM_ROOT* root) diff --git a/mysys/my_default.c b/mysys/my_default.c index dba22c4e..2358aed8 100644 --- a/mysys/my_default.c +++ b/mysys/my_default.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. +/* Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. + Copyright (c) 2011, 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 @@ -233,7 +234,7 @@ int my_search_option_files(const char *conf_file, int *argc, char ***argv, (char **) &my_defaults_group_suffix); if (! my_defaults_group_suffix) - my_defaults_group_suffix= getenv(STRINGIFY_ARG(DEFAULT_GROUP_SUFFIX_ENV)); + my_defaults_group_suffix= getenv("MYSQL_GROUP_SUFFIX"); if (forced_extra_defaults && !defaults_already_read) { diff --git a/mysys/my_lib.c b/mysys/my_lib.c index abc7b8a3..8daed110 100644 --- a/mysys/my_lib.c +++ b/mysys/my_lib.c @@ -119,10 +119,6 @@ MY_DIR *my_dir(const char *path, myf MyFlags) DBUG_ENTER("my_dir"); DBUG_PRINT("my",("path: '%s' MyFlags: %lu",path,MyFlags)); -#if !defined(HAVE_READDIR_R) - mysql_mutex_lock(&THR_LOCK_open); -#endif - tmp_file= directory_file_name(tmp_path, path); if (!(dirp= opendir(tmp_path))) @@ -174,9 +170,6 @@ MY_DIR *my_dir(const char *path, myf MyFlags) } (void) closedir(dirp); -#if !defined(HAVE_READDIR_R) - mysql_mutex_unlock(&THR_LOCK_open); -#endif if (MyFlags & MY_WANT_SORT) sort_dynamic(&dirh->array, (qsort_cmp) comp_names); @@ -187,9 +180,6 @@ MY_DIR *my_dir(const char *path, myf MyFlags) DBUG_RETURN(&dirh->dir); error: -#if !defined(HAVE_READDIR_R) - mysql_mutex_unlock(&THR_LOCK_open); -#endif my_errno=errno; if (dirp) (void) closedir(dirp); diff --git a/mysys/my_thr_init.c b/mysys/my_thr_init.c index 1d3c3059..f827fb13 100644 --- a/mysys/my_thr_init.c +++ b/mysys/my_thr_init.c @@ -385,7 +385,6 @@ void my_thread_end(void) /* Trash variable so that we can detect false accesses to my_thread_var */ tmp->init= 2; - TRASH(tmp, sizeof(*tmp)); free(tmp); } } diff --git a/mysys_ssl/my_crypt.cc b/mysys_ssl/my_crypt.cc index a0937a83..43933942 100644 --- a/mysys_ssl/my_crypt.cc +++ b/mysys_ssl/my_crypt.cc @@ -26,6 +26,7 @@ #include #include #include +#include #ifdef HAVE_ERR_remove_thread_state #define ERR_remove_state(X) ERR_remove_thread_state(NULL) @@ -292,31 +293,11 @@ unsigned int my_aes_ctx_size(enum my_aes_mode) return MY_AES_CTX_SIZE; } -#ifdef HAVE_YASSL -#include -int my_random_bytes(uchar* buf, int num) -{ - TaoCrypt::RandomNumberGenerator rand; - rand.GenerateBlock((TaoCrypt::byte*) buf, num); - return MY_AES_OK; -} -#else -#include - int my_random_bytes(uchar *buf, int num) { - /* - Unfortunately RAND_bytes manual page does not provide any guarantees - in relation to blocking behavior. Here we explicitly use SSLeay random - instead of whatever random engine is currently set in OpenSSL. That way - we are guaranteed to have a non-blocking random. - */ - RAND_METHOD *rand = RAND_SSLeay(); - if (rand == NULL || rand->bytes(buf, num) != 1) + if (RAND_bytes(buf, num) != 1) return MY_AES_OPENSSL_ERROR; return MY_AES_OK; } -#endif } - diff --git a/mysys_ssl/yassl.cc b/mysys_ssl/yassl.cc index 9717870f..e9f8e650 100644 --- a/mysys_ssl/yassl.cc +++ b/mysys_ssl/yassl.cc @@ -26,6 +26,7 @@ #include "aes.hpp" using yaSSL::yaERR_remove_state; +using yaSSL::yaRAND_bytes; #define EVP_CIPH_ECB_MODE 0x1 #define EVP_CIPH_CBC_MODE 0x2 diff --git a/scripts/galera_recovery.sh b/scripts/galera_recovery.sh index de2e653c..09de6721 100644 --- a/scripts/galera_recovery.sh +++ b/scripts/galera_recovery.sh @@ -68,7 +68,7 @@ parse_arguments() { wsrep_recover_position() { # Redirect server's error log to the log file. - eval /usr/sbin/mysqld $cmdline_args --user=$user --wsrep_recover \ + eval @sbindir@/mysqld $cmdline_args --user=$user --wsrep_recover \ --disable-log-error 2> "$log_file" ret=$? if [ $ret -ne 0 ]; then diff --git a/scripts/mysql_install_db.sh b/scripts/mysql_install_db.sh index aad9ef5c..2768facc 100644 --- a/scripts/mysql_install_db.sh +++ b/scripts/mysql_install_db.sh @@ -27,6 +27,7 @@ srcdir="" args="" defaults="" +defaults_group_suffix="" mysqld_opt="" user="" @@ -64,6 +65,9 @@ Usage: $0 [OPTIONS] --defaults-extra-file=name Read this file after the global files are read. --defaults-file=name Only read default options from the given file name. + --defaults-group-suffix=name + In addition to the given groups, read also groups with + this suffix --force Causes mysql_install_db to run even if DNS does not work. In that case, grant table entries that normally use hostnames will use IP addresses. @@ -146,6 +150,8 @@ parse_arguments() --help) usage ;; --no-defaults|--defaults-file=*|--defaults-extra-file=*) defaults="$arg" ;; + --defaults-group-suffix=*) + defaults_group_suffix="$arg" ;; --cross-bootstrap|--windows) # Used when building the MariaDB system tables on a different host than @@ -287,7 +293,7 @@ fi # Now we can get arguments from the groups [mysqld] and [mysql_install_db] # in the my.cfg file, then re-run to merge with command line arguments. -parse_arguments `"$print_defaults" $defaults --mysqld mysql_install_db` +parse_arguments `"$print_defaults" $defaults $defaults_group_suffix --mysqld mysql_install_db` parse_arguments PICK-ARGS-FROM-ARGV "$@" # Configure paths to support files @@ -451,7 +457,7 @@ fi mysqld_bootstrap="${MYSQLD_BOOTSTRAP-$mysqld}" mysqld_install_cmd_line() { - "$mysqld_bootstrap" $defaults "$mysqld_opt" --bootstrap \ + "$mysqld_bootstrap" $defaults $defaults_group_suffix "$mysqld_opt" --bootstrap \ "--basedir=$basedir" "--datadir=$ldata" --log-warnings=0 --enforce-storage-engine="" \ $args --max_allowed_packet=8M \ --net_buffer_length=16K @@ -485,7 +491,7 @@ else echo echo "You can also try to start the mysqld daemon with:" echo - echo " shell> $mysqld --skip-grant --general-log &" + echo " shell> $mysqld --skip-grant-tables --general-log &" echo echo "and use the command line tool $bindir/mysql" echo "to connect to the mysql database and look at the grant tables:" @@ -496,8 +502,8 @@ else echo "Try 'mysqld --help' if you have problems with paths. Using" echo "--general-log gives you a log in $ldata that may be helpful." link_to_help - echo "MariaDB is hosted on launchpad; You can find the latest source and" - echo "email lists at http://launchpad.net/maria" + echo "You can find the latest source at https://downloads.mariadb.org and" + echo "the maria-discuss email list at https://launchpad.net/~maria-discuss" echo echo "Please check all of the above before submitting a bug report" echo "at http://mariadb.org/jira" diff --git a/scripts/wsrep_sst_common.sh b/scripts/wsrep_sst_common.sh index 788e1a12..a8f671de 100644 --- a/scripts/wsrep_sst_common.sh +++ b/scripts/wsrep_sst_common.sh @@ -20,13 +20,13 @@ set -u WSREP_SST_OPT_BYPASS=0 WSREP_SST_OPT_BINLOG="" -WSREP_SST_OPT_CONF_SUFFIX="" WSREP_SST_OPT_DATA="" WSREP_SST_OPT_AUTH=${WSREP_SST_OPT_AUTH:-} WSREP_SST_OPT_USER=${WSREP_SST_OPT_USER:-} WSREP_SST_OPT_PSWD=${WSREP_SST_OPT_PSWD:-} WSREP_SST_OPT_DEFAULT="" WSREP_SST_OPT_EXTRA_DEFAULT="" +WSREP_SST_OPT_SUFFIX_DEFAULT="" while [ $# -gt 0 ]; do case "$1" in @@ -35,19 +35,22 @@ case "$1" in # # Break address string into host:port/path parts # - if echo $WSREP_SST_OPT_ADDR | grep -qe '^\[.*\]' + readonly WSREP_SST_OPT_HOST=${WSREP_SST_OPT_ADDR%%[:/]*} + if [ ${WSREP_SST_OPT_HOST:0:1} = '[' ] then # IPv6 notation - readonly WSREP_SST_OPT_HOST=${WSREP_SST_OPT_ADDR/\]*/\]} - readonly WSREP_SST_OPT_HOST_UNESCAPED=$(echo $WSREP_SST_OPT_HOST | \ - cut -d '[' -f 2 | cut -d ']' -f 1) + readonly WSREP_SST_OPT_HOST_UNESCAPED=${WSREP_SST_OPT_HOST:1:-1} else - # "traditional" notation - readonly WSREP_SST_OPT_HOST=${WSREP_SST_OPT_ADDR%%[:/]*} + 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) 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#*/} + readonly WSREP_SST_OPT_SST_VER=${remain%%/*} shift ;; '--bypass') @@ -66,7 +69,7 @@ case "$1" in shift ;; '--defaults-group-suffix') - WSREP_SST_OPT_CONF_SUFFIX="$2" + readonly WSREP_SST_OPT_SUFFIX_DEFAULT="$1=$2" shift ;; '--host') @@ -122,7 +125,6 @@ shift done readonly WSREP_SST_OPT_BYPASS readonly WSREP_SST_OPT_BINLOG -readonly WSREP_SST_OPT_CONF_SUFFIX # try to use my_print_defaults, mysql and mysqldump that come with the sources # (for MTR suite) @@ -150,19 +152,18 @@ else MY_PRINT_DEFAULTS=$(which my_print_defaults) fi -readonly WSREP_SST_OPT_CONF="$WSREP_SST_OPT_DEFAULT $WSREP_SST_OPT_EXTRA_DEFAULT" -MY_PRINT_DEFAULTS="$MY_PRINT_DEFAULTS $WSREP_SST_OPT_CONF" +readonly WSREP_SST_OPT_CONF="$WSREP_SST_OPT_DEFAULT $WSREP_SST_OPT_EXTRA_DEFAULT $WSREP_SST_OPT_SUFFIX_DEFAULT" +readonly MY_PRINT_DEFAULTS="$MY_PRINT_DEFAULTS $WSREP_SST_OPT_CONF" + wsrep_auth_not_set() { [ -z "$WSREP_SST_OPT_AUTH" -o "$WSREP_SST_OPT_AUTH" = "(null)" ] } -# For Bug:1200727 -if $MY_PRINT_DEFAULTS sst | grep -q "wsrep_sst_auth" -then - if wsrep_auth_not_set - then - WSREP_SST_OPT_AUTH=$($MY_PRINT_DEFAULTS sst | grep -- "--wsrep_sst_auth" | cut -d= -f2) +# State Snapshot Transfer authentication password was displayed in the ps output. Bug fixed #1200727. +if $MY_PRINT_DEFAULTS sst | grep -q "wsrep_sst_auth"; then + if wsrep_auth_not_set; then + WSREP_SST_OPT_AUTH=$($MY_PRINT_DEFAULTS sst | grep -- "--wsrep_sst_auth" | cut -d= -f2) fi fi readonly WSREP_SST_OPT_AUTH @@ -241,7 +242,7 @@ wsrep_check_programs() # process like encryption, etc..... # parse such configuration option. (group for xb settings is [sst] in my.cnf # -# 1st param: group : name of the config file section, e.g. mysqld +# 1st param: group (config file section like sst) or my_print_defaults argument (like --mysqld) # 2nd param: var : name of the variable in the section, e.g. server-id # 3rd param: - : default value for the param parse_cnf() @@ -250,20 +251,11 @@ parse_cnf() local var=$2 local reval="" - # print the default settings for given group using my_print_default. # normalize the variable names specified in cnf file (user can use _ or - for example log-bin or log_bin) - # then grep for needed variable + # then search for needed variable # finally get the variable value (if variables has been specified multiple time use the last value only) - # look in group+suffix - if [ -n $WSREP_SST_OPT_CONF_SUFFIX ]; then - reval=$($MY_PRINT_DEFAULTS "${group}${WSREP_SST_OPT_CONF_SUFFIX}" | awk -F= '{if ($1 ~ /_/) { gsub(/_/,"-",$1); print $1"="$2 } else { print $0 }}' | grep -- "--$var=" | cut -d= -f2- | tail -1) - fi - - # look in group - if [ -z $reval ]; then - reval=$($MY_PRINT_DEFAULTS $group | awk -F= '{if ($1 ~ /_/) { gsub(/_/,"-",$1); print $1"="$2 } else { print $0 }}' | grep -- "--$var=" | cut -d= -f2- | tail -1) - fi + reval=$($MY_PRINT_DEFAULTS "${group}" | awk -v var="${var}" 'BEGIN { OFS=FS="=" } { gsub(/_/,"-",$1); if ( $1=="--"var) lastval=substr($0,length($1)+2) } END { print lastval}') # use default if we haven't found a value if [ -z $reval ]; then diff --git a/scripts/wsrep_sst_mysqldump.sh b/scripts/wsrep_sst_mysqldump.sh index f086d987..35824735 100644 --- a/scripts/wsrep_sst_mysqldump.sh +++ b/scripts/wsrep_sst_mysqldump.sh @@ -17,10 +17,6 @@ # This is a reference script for mysqldump-based state snapshot tansfer -# This variable is not used in mysqldump sst, so better initialize it -# to avoid shell's "parameter not set" message. -WSREP_SST_OPT_CONF="" - . $(dirname $0)/wsrep_sst_common PATH=$PATH:/usr/sbin:/usr/bin:/sbin:/bin @@ -57,10 +53,10 @@ then fi # Check client version -if ! $MYSQL_CLIENT --version | grep 'Distrib 10.1' >/dev/null +if ! $MYSQL_CLIENT --version | grep 'Distrib 10\.[1-9]' >/dev/null then $MYSQL_CLIENT --version >&2 - wsrep_log_error "this operation requires MySQL client version 10 or newer" + wsrep_log_error "this operation requires MySQL client version 10.1 or newer" exit $EINVAL fi @@ -118,7 +114,7 @@ $MYSQL_CLIENT $AUTH -S$WSREP_SST_OPT_SOCKET --disable-reconnect --connect_timeou tail -1 | awk -F ' ' '{ print $2 }') MYSQL="$MYSQL_CLIENT $WSREP_SST_OPT_CONF "\ -"$AUTH -h${WSREP_SST_OPT_HOST_UNESCAPED:-$WSREP_SST_OPT_HOST} "\ +"$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. diff --git a/scripts/wsrep_sst_rsync.sh b/scripts/wsrep_sst_rsync.sh index c6e8a7ef..3d76d178 100644 --- a/scripts/wsrep_sst_rsync.sh +++ b/scripts/wsrep_sst_rsync.sh @@ -102,19 +102,7 @@ fi WSREP_LOG_DIR=${WSREP_LOG_DIR:-""} # if WSREP_LOG_DIR env. variable is not set, try to get it from my.cnf if [ -z "$WSREP_LOG_DIR" ]; then - WSREP_LOG_DIR=$(parse_cnf mariadb-10.0 innodb_log_group_home_dir "") -fi -if [ -z "$WSREP_LOG_DIR" ]; then - WSREP_LOG_DIR=$(parse_cnf mysqld innodb_log_group_home_dir "") -fi -if [ -z "$WSREP_LOG_DIR" ]; then - WSREP_LOG_DIR=$(parse_cnf server innodb_log_group_home_dir "") -fi -if [ -z "$WSREP_LOG_DIR" ]; then - WSREP_LOG_DIR=$(parse_cnf mariadb innodb_log_group_home_dir "") -fi -if [ -z "$WSREP_LOG_DIR" ]; then - WSREP_LOG_DIR=$(parse_cnf mysqld-10.0 innodb_log_group_home_dir "") + WSREP_LOG_DIR=$(parse_cnf --mysqld innodb-log-group-home-dir '') fi if [ -n "$WSREP_LOG_DIR" ]; then diff --git a/scripts/wsrep_sst_xtrabackup-v2.sh b/scripts/wsrep_sst_xtrabackup-v2.sh index 9284bf78..64dd182e 100644 --- a/scripts/wsrep_sst_xtrabackup-v2.sh +++ b/scripts/wsrep_sst_xtrabackup-v2.sh @@ -32,9 +32,6 @@ ecode=0 ssyslog="" ssystag="" XTRABACKUP_PID="" -SST_PORT="" -REMOTEIP="" -REMOTEHOST="" tca="" tcert="" tkey="" @@ -42,7 +39,6 @@ sockopt="" progress="" ttime=0 totime=0 -lsn="" ecmd="" rlimit="" # Initially @@ -77,11 +73,6 @@ ssl_cert="" ssl_ca="" ssl_key="" -# Required for backup locks -# For backup locks it is 1 sent by joiner -# 5.6.21 PXC and later can't donate to an older joiner -sst_ver=1 - if which pv &>/dev/null && pv --help | grep -q FORMAT;then pvopts+=$pvformat fi @@ -97,6 +88,13 @@ MAGIC_FILE="${DATA}/${INFO_FILE}" # Setting the path for ss and ip export PATH="/usr/sbin:/sbin:$PATH" +OS=$(uname) + +if ! which lsof > /dev/null; then + wsrep_log_error "lsof tool not found in PATH! Make sure you have it installed." + exit 2 # ENOENT +fi + timeit(){ local stage=$1 shift @@ -251,11 +249,7 @@ verify_file_exists() get_transfer() { - if [[ -z $SST_PORT ]];then - TSST_PORT=4444 - else - TSST_PORT=$SST_PORT - fi + TSST_PORT=${WSREP_SST_OPT_PORT:-4444} if [[ $tfmt == 'nc' ]];then if [[ ! -x `which nc` ]];then @@ -280,7 +274,7 @@ get_transfer() fi else # netcat doesn't understand [] around IPv6 address - tcmd="nc ${REMOTEIP//[\[\]]/} ${TSST_PORT}" + tcmd="nc ${WSREP_SST_OPT_HOST_UNESCAPED} ${TSST_PORT}" fi else tfmt='socat' @@ -342,7 +336,7 @@ get_transfer() tcmd="socat -u openssl-listen:${TSST_PORT},reuseaddr,cert=${tcert},cafile=${tca}${joiner_extra}${sockopt} stdio" else wsrep_log_info "Encrypting with CERT: $tcert, CA: $tca" - tcmd="socat -u stdio openssl-connect:${REMOTEIP}:${TSST_PORT},cert=${tcert},cafile=${tca}${donor_extra}${sockopt}" + tcmd="socat -u stdio openssl-connect:${WSREP_SST_OPT_HOST}:${TSST_PORT},cert=${tcert},cafile=${tca}${donor_extra}${sockopt}" fi elif [[ $encrypt -eq 3 ]];then wsrep_log_warning "**** WARNING **** encrypt=3 is deprecated and will be removed in a future release" @@ -359,7 +353,7 @@ get_transfer() tcmd="socat -u openssl-listen:${TSST_PORT},reuseaddr,cert=${tcert},key=${tkey},verify=0${joiner_extra}${sockopt} stdio" else wsrep_log_info "Encrypting with CERT: $tcert, KEY: $tkey" - tcmd="socat -u stdio openssl-connect:${REMOTEIP}:${TSST_PORT},cert=${tcert},key=${tkey},verify=0${sockopt}" + tcmd="socat -u stdio openssl-connect:${WSREP_SST_OPT_HOST}:${TSST_PORT},cert=${tcert},key=${tkey},verify=0${sockopt}" fi elif [[ $encrypt -eq 4 ]]; then wsrep_log_info "Using openssl based encryption with socat: with key, crt, and ca" @@ -380,7 +374,7 @@ get_transfer() tcmd="socat -u openssl-listen:${TSST_PORT},reuseaddr,cert=${ssl_cert},key=${ssl_key},cafile=${ssl_ca},verify=1${joiner_extra}${sockopt} stdio" else wsrep_log_info "Encrypting with CERT: $ssl_cert, KEY: $ssl_key, CA: $ssl_ca" - tcmd="socat -u stdio openssl-connect:${REMOTEIP}:${TSST_PORT},cert=${ssl_cert},key=${ssl_key},cafile=${ssl_ca},verify=1${donor_extra}${sockopt}" + tcmd="socat -u stdio openssl-connect:${WSREP_SST_OPT_HOST}:${TSST_PORT},cert=${ssl_cert},key=${ssl_key},cafile=${ssl_ca},verify=1${donor_extra}${sockopt}" fi else @@ -391,7 +385,7 @@ get_transfer() if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]]; then tcmd="socat -u TCP-LISTEN:${TSST_PORT},reuseaddr${sockopt} stdio" else - tcmd="socat -u stdio TCP:${REMOTEIP}:${TSST_PORT}${sockopt}" + tcmd="socat -u stdio TCP:${WSREP_SST_OPT_HOST}:${TSST_PORT}${sockopt}" fi fi fi @@ -400,7 +394,7 @@ get_transfer() get_footprint() { pushd $WSREP_SST_OPT_DATA 1>/dev/null - payload=$(find . -regex '.*\.ibd$\|.*\.MYI$\|.*\.MYD$\|.*ibdata1$' -type f -print0 | du --files0-from=- --block-size=1 -c | awk 'END { print $1 }') + payload=$(find . -regex '.*\.ibd$\|.*\.MYI$\|.*\.MYD$\|.*ibdata1$' -type f -print0 | du --files0-from=- --block-size=1 -c -s | awk 'END { print $1 }') if $MY_PRINT_DEFAULTS xtrabackup | grep -q -- "--compress";then # QuickLZ has around 50% compression ratio # When compression/compaction used, the progress is only an approximate. @@ -452,7 +446,11 @@ read_cnf() progress=$(parse_cnf sst progress "") rebuild=$(parse_cnf sst rebuild 0) ttime=$(parse_cnf sst time 0) - cpat=$(parse_cnf sst cpat '.*\.pem$\|.*init\.ok$\|.*galera\.cache$\|.*sst_in_progress$\|.*\.sst$\|.*gvwstate\.dat$\|.*grastate\.dat$\|.*\.err$\|.*\.log$\|.*RPM_UPGRADE_MARKER$\|.*RPM_UPGRADE_HISTORY$') + if [ "${OS}" = "FreeBSD" ]; then + cpat=$(parse_cnf sst cpat '.*\.pem$|.*init\.ok$|.*galera\.cache$|.*sst_in_progress$|.*\.sst$|.*gvwstate\.dat$|.*grastate\.dat$|.*\.err$|.*\.log$|.*RPM_UPGRADE_MARKER$|.*RPM_UPGRADE_HISTORY$') + else + cpat=$(parse_cnf sst cpat '.*\.pem$\|.*init\.ok$\|.*galera\.cache$\|.*sst_in_progress$\|.*\.sst$\|.*gvwstate\.dat$\|.*grastate\.dat$\|.*\.err$\|.*\.log$\|.*RPM_UPGRADE_MARKER$\|.*RPM_UPGRADE_HISTORY$') + fi ealgo=$(parse_cnf xtrabackup encrypt "") ekey=$(parse_cnf xtrabackup encrypt-key "") ekeyfile=$(parse_cnf xtrabackup encrypt-key-file "") @@ -470,15 +468,15 @@ read_cnf() # Pull the parameters needed for encrypt=4 ssl_ca=$(parse_cnf sst ssl-ca "") if [[ -z "$ssl_ca" ]]; then - ssl_ca=$(parse_cnf mysqld ssl-ca "") + ssl_ca=$(parse_cnf --mysqld ssl-ca "") fi ssl_cert=$(parse_cnf sst ssl-cert "") if [[ -z "$ssl_cert" ]]; then - ssl_cert=$(parse_cnf mysqld ssl-cert "") + ssl_cert=$(parse_cnf --mysqld ssl-cert "") fi ssl_key=$(parse_cnf sst ssl-key "") if [[ -z "$ssl_key" ]]; then - ssl_key=$(parse_cnf mysqld ssl-key "") + ssl_key=$(parse_cnf --mysqld ssl-key "") fi rlimit=$(parse_cnf sst rlimit "") @@ -492,7 +490,7 @@ read_cnf() ssystag+="-" if [[ $ssyslog -ne -1 ]];then - if $MY_PRINT_DEFAULTS mysqld_safe | tr '_' '-' | grep -q -- "--syslog";then + if $MY_PRINT_DEFAULTS mysqld_safe | grep -q -- "--syslog";then ssyslog=1 fi fi @@ -635,18 +633,6 @@ kill_xtrabackup() rm -f "$XTRABACKUP_PID" || true } -setup_ports() -{ - if [[ "$WSREP_SST_OPT_ROLE" == "donor" ]];then - SST_PORT=$WSREP_SST_OPT_PORT - REMOTEIP=$WSREP_SST_OPT_HOST - lsn=$(echo $WSREP_SST_OPT_PATH | awk -F '[/]' '{ print $2 }') - sst_ver=$(echo $WSREP_SST_OPT_PATH | awk -F '[/]' '{ print $3 }') - else - SST_PORT=$WSREP_SST_OPT_PORT - fi -} - # waits ~1 minute for nc/socat to open the port and then reports ready # (regardless of timeout) wait_for_listen() @@ -654,22 +640,24 @@ wait_for_listen() local HOST=$1 local PORT=$2 local MODULE=$3 + local LSOF_OUT for i in {1..300} do - ss -p state listening "( sport = :$PORT )" | grep -qE 'socat|nc' && break + LSOF_OUT=$(lsof -sTCP:LISTEN -i TCP:${PORT} -a -c nc -c socat -F c) + [ -n "${LSOF_OUT}" ] && break sleep 0.2 done - echo "ready ${HOST}:${PORT}/${MODULE}//$sst_ver" + echo "ready ${HOST}:${PORT}/${MODULE}//${WSREP_SST_OPT_SST_VER:-1}" } check_extra() { local use_socket=1 if [[ $uextra -eq 1 ]];then - if $MY_PRINT_DEFAULTS --mysqld | tr '_' '-' | grep -- "--thread-handling=" | grep -q 'pool-of-threads';then - local eport=$($MY_PRINT_DEFAULTS mysqld | tr '_' '-' | grep -- "--extra-port=" | cut -d= -f2) + if [ $(parse_cnf --mysqld thread-handling) = 'pool-of-threads'];then + local eport=$(parse_cnf --mysqld extra-port) if [[ -n $eport ]];then # Xtrabackup works only locally. # Hence, setting host to 127.0.0.1 unconditionally. @@ -830,7 +818,6 @@ if [[ ! ${WSREP_SST_OPT_ROLE} == 'joiner' && ! ${WSREP_SST_OPT_ROLE} == 'donor' fi read_cnf -setup_ports if ${INNOBACKUPEX_BIN} /tmp --help 2>/dev/null | grep -q -- '--version-check'; then disver="--no-version-check" @@ -864,20 +851,24 @@ if [[ $ssyslog -eq 1 ]];then logger -p daemon.info -t ${ssystag}wsrep-sst-$WSREP_SST_OPT_ROLE "$@" } - INNOAPPLY="${INNOBACKUPEX_BIN} $disver $iapts --apply-log \$rebuildcmd \${DATA} 2>&1 | logger -p daemon.err -t ${ssystag}innobackupex-apply " - INNOMOVE="${INNOBACKUPEX_BIN} ${WSREP_SST_OPT_DEFAULT} $disver $impts --datadir=${DATA} --move-back --force-non-empty-directories \${DATA} 2>&1 | logger -p daemon.err -t ${ssystag}innobackupex-move " - INNOBACKUP="${INNOBACKUPEX_BIN} ${WSREP_SST_OPT_DEFAULT} $disver $iopts \$tmpopts \$INNOEXTRA --galera-info --stream=\$sfmt \$itmpdir 2> >(logger -p daemon.err -t ${ssystag}innobackupex-backup)" + INNOAPPLY="2>&1 | logger -p daemon.err -t ${ssystag}innobackupex-apply " + INNOMOVE="2>&1 | logger -p daemon.err -t ${ssystag}innobackupex-move " + INNOBACKUP="2> >(logger -p daemon.err -t ${ssystag}innobackupex-backup)" fi else - INNOAPPLY="${INNOBACKUPEX_BIN} $disver $iapts --apply-log \$rebuildcmd \${DATA} &>\${DATA}/innobackup.prepare.log" - INNOMOVE="${INNOBACKUPEX_BIN} ${WSREP_SST_OPT_DEFAULT} --defaults-group=mysqld${WSREP_SST_OPT_CONF_SUFFIX} $disver $impts --datadir=${DATA} --move-back --force-non-empty-directories \${DATA} &>\${DATA}/innobackup.move.log" - INNOBACKUP="${INNOBACKUPEX_BIN} ${WSREP_SST_OPT_DEFAULT} $disver $iopts \$tmpopts \$INNOEXTRA --galera-info --stream=\$sfmt \$itmpdir 2>\${DATA}/innobackup.backup.log" + INNOAPPLY="&>\${DATA}/innobackup.prepare.log" + INNOMOVE="&>\${DATA}/innobackup.move.log" + INNOBACKUP="2>\${DATA}/innobackup.backup.log" fi get_stream get_transfer +INNOAPPLY="${INNOBACKUPEX_BIN} $disver $iapts --apply-log \$rebuildcmd \${DATA} ${INNOAPPLY}" +INNOMOVE="${INNOBACKUPEX_BIN} ${WSREP_SST_OPT_CONF} $disver $impts --move-back --force-non-empty-directories \${DATA} ${INNOMOVE}" +INNOBACKUP="${INNOBACKUPEX_BIN} ${WSREP_SST_OPT_CONF} $disver $iopts \$tmpopts \$INNOEXTRA --galera-info --stream=\$sfmt \$itmpdir ${INNOBACKUP}" + if [ "$WSREP_SST_OPT_ROLE" = "donor" ] then trap cleanup_donor EXIT @@ -885,13 +876,13 @@ then if [ $WSREP_SST_OPT_BYPASS -eq 0 ] then usrst=0 - if [[ -z $sst_ver ]];then + if [[ -z $WSREP_SST_OPT_SST_VER ]];then wsrep_log_error "Upgrade joiner to 5.6.21 or higher for backup locks support" wsrep_log_error "The joiner is not supported for this version of donor" exit 93 fi - if [[ -z $(parse_cnf mysqld tmpdir "") && -z $(parse_cnf xtrabackup tmpdir "") ]];then + if [[ -z $(parse_cnf --mysqld tmpdir "") && -z $(parse_cnf xtrabackup tmpdir "") ]];then xtmpdir=$(mktemp -d) tmpopts=" --tmpdir=$xtmpdir " wsrep_log_info "Using $xtmpdir as xtrabackup temporary directory" @@ -948,7 +939,7 @@ then wsrep_log_info "Sleeping before data transfer for SST" sleep 10 - wsrep_log_info "Streaming the backup to joiner at ${REMOTEIP} ${SST_PORT:-4444}" + wsrep_log_info "Streaming the backup to joiner at ${WSREP_SST_OPT_HOST} ${WSREP_SST_OPT_PORT:-4444}" # Add compression to the head of the stream (if specified) if [[ -n $scomp ]]; then @@ -1010,9 +1001,9 @@ then [[ -e $SST_PROGRESS_FILE ]] && wsrep_log_info "Stale sst_in_progress file: $SST_PROGRESS_FILE" [[ -n $SST_PROGRESS_FILE ]] && touch $SST_PROGRESS_FILE - ib_home_dir=$(parse_cnf mysqld innodb-data-home-dir "") - ib_log_dir=$(parse_cnf mysqld innodb-log-group-home-dir "") - ib_undo_dir=$(parse_cnf mysqld innodb-undo-directory "") + ib_home_dir=$(parse_cnf --mysqld innodb-data-home-dir "") + ib_log_dir=$(parse_cnf --mysqld innodb-log-group-home-dir "") + ib_undo_dir=$(parse_cnf --mysqld innodb-undo-directory "") stagemsg="Joiner-Recv" @@ -1072,9 +1063,13 @@ then wsrep_log_info "Cleaning the existing datadir and innodb-data/log directories" - find $ib_home_dir $ib_log_dir $ib_undo_dir $DATA -mindepth 1 -prune -regex $cpat -o -exec rm -rfv {} 1>&2 \+ + if [ "${OS}" = "FreeBSD" ]; then + find -E $ib_home_dir $ib_log_dir $ib_undo_dir $DATA -mindepth 1 -prune -regex $cpat -o -exec rm -rfv {} 1>&2 \+ + else + find $ib_home_dir $ib_log_dir $ib_undo_dir $DATA -mindepth 1 -prune -regex $cpat -o -exec rm -rfv {} 1>&2 \+ + fi - tempdir=$(parse_cnf mysqld log-bin "") + tempdir=$(parse_cnf --mysqld log-bin "") if [[ -n ${tempdir:-} ]];then binlog_dir=$(dirname $tempdir) binlog_file=$(basename $tempdir) diff --git a/scripts/wsrep_sst_xtrabackup.sh b/scripts/wsrep_sst_xtrabackup.sh index ca3c0129..867aab62 100644 --- a/scripts/wsrep_sst_xtrabackup.sh +++ b/scripts/wsrep_sst_xtrabackup.sh @@ -30,15 +30,13 @@ encrypt=0 nproc=1 ecode=0 XTRABACKUP_PID="" -SST_PORT="" -REMOTEIP="" tcert="" tpem="" sockopt="" progress="" ttime=0 totime=0 -lsn="" +lsn="${WSREP_SST_OPT_LSN}" incremental=0 ecmd="" rlimit="" @@ -136,11 +134,7 @@ get_keys() get_transfer() { - if [[ -z $SST_PORT ]];then - TSST_PORT=4444 - else - TSST_PORT=$SST_PORT - fi + TSST_PORT=${WSREP_SST_OPT_PORT:-4444} if [[ $tfmt == 'nc' ]];then if [[ ! -x `which nc` ]];then @@ -155,7 +149,7 @@ get_transfer() tcmd="nc -dl ${TSST_PORT}" fi else - tcmd="nc ${REMOTEIP} ${TSST_PORT}" + tcmd="nc ${WSREP_SST_OPT_HOST_UNESCAPED} ${TSST_PORT}" fi else tfmt='socat' @@ -181,34 +175,23 @@ get_transfer() tcmd="socat -u openssl-listen:${TSST_PORT},reuseaddr,cert=$tpem,cafile=${tcert}${sockopt} stdio" else wsrep_log_info "Encrypting with PEM $tpem, CA: $tcert" - tcmd="socat -u stdio openssl-connect:${REMOTEIP}:${TSST_PORT},cert=$tpem,cafile=${tcert}${sockopt}" + tcmd="socat -u stdio openssl-connect:${WSREP_SST_OPT_HOST}:${TSST_PORT},cert=$tpem,cafile=${tcert}${sockopt}" fi else if [[ "$WSREP_SST_OPT_ROLE" == "joiner" ]];then tcmd="socat -u TCP-LISTEN:${TSST_PORT},reuseaddr${sockopt} stdio" else - tcmd="socat -u stdio TCP:${REMOTEIP}:${TSST_PORT}${sockopt}" + tcmd="socat -u stdio TCP:${WSREP_SST_OPT_HOST}:${TSST_PORT}${sockopt}" fi fi fi } -parse_cnf() -{ - local group=$1 - local var=$2 - reval=$($MY_PRINT_DEFAULTS $group | awk -F= '{if ($1 ~ /_/) { gsub(/_/,"-",$1); print $1"="$2 } else { print $0 }}' | grep -- "--$var=" | cut -d= -f2-) - if [[ -z $reval ]];then - [[ -n $3 ]] && reval=$3 - fi - echo $reval -} - get_footprint() { pushd $WSREP_SST_OPT_DATA 1>/dev/null - payload=$(find . -regex '.*\.ibd$\|.*\.MYI$\|.*\.MYD$\|.*ibdata1$' -type f -print0 | du --files0-from=- --block-size=1 -c | awk 'END { print $1 }') + payload=$(find . -regex '.*\.ibd$\|.*\.MYI$\|.*\.MYD$\|.*ibdata1$' -type f -print0 | du --files0-from=- --block-size=1 -c -s | awk 'END { print $1 }') if $MY_PRINT_DEFAULTS xtrabackup | grep -q -- "--compress";then # QuickLZ has around 50% compression ratio # When compression/compaction used, the progress is only an approximate. @@ -354,17 +337,6 @@ kill_xtrabackup() rm -f "$XTRABACKUP_PID" } -setup_ports() -{ - if [[ "$WSREP_SST_OPT_ROLE" == "donor" ]];then - SST_PORT=$(echo $WSREP_SST_OPT_ADDR | awk -F '[:/]' '{ print $2 }') - REMOTEIP=$(echo $WSREP_SST_OPT_ADDR | awk -F ':' '{ print $1 }') - lsn=$(echo $WSREP_SST_OPT_ADDR | awk -F '[:/]' '{ print $4 }') - else - SST_PORT=$(echo ${WSREP_SST_OPT_ADDR} | awk -F ':' '{ print $2 }') - fi -} - # waits ~10 seconds for nc to open the port and then reports ready # (regardless of timeout) wait_for_listen() @@ -388,8 +360,8 @@ check_extra() { local use_socket=1 if [[ $uextra -eq 1 ]];then - if $MY_PRINT_DEFAULTS --mysqld | tr '_' '-' | grep -- "--thread-handling=" | grep -q 'pool-of-threads';then - local eport=$($MY_PRINT_DEFAULTS --mysqld | tr '_' '-' | grep -- "--extra-port=" | cut -d= -f2) + if [ $(parse_cnf --mysqld thread-handling) = 'pool-of-threads'];then + local eport=$(parse_cnf --mysqld extra-port) if [[ -n $eport ]];then # Xtrabackup works only locally. # Hence, setting host to 127.0.0.1 unconditionally. @@ -466,7 +438,7 @@ then check_extra - wsrep_log_info "Streaming the backup to joiner at ${REMOTEIP} ${SST_PORT}" + wsrep_log_info "Streaming the backup to joiner at ${WSREP_SST_OPT_HOST} ${WSREP_SST_OPT_PORT}" if [[ -n $progress ]];then get_footprint @@ -547,14 +519,9 @@ then # May need xtrabackup_checkpoints later on rm -f ${DATA}/xtrabackup_binary ${DATA}/xtrabackup_galera_info ${DATA}/xtrabackup_logfile - ADDR=${WSREP_SST_OPT_ADDR} - if [ -z "${SST_PORT}" ] - then - SST_PORT=4444 - ADDR="$(echo ${WSREP_SST_OPT_ADDR} | awk -F ':' '{ print $1 }'):${SST_PORT}" - fi + ADDR="${WSREP_SST_OPT_HOST}:${WSREP_SST_OPT_PORT:-4444}" - wait_for_listen ${SST_PORT} ${ADDR} ${MODULE} & + wait_for_listen ${WSREP_SST_OPT_PORT:-4444} ${ADDR} ${MODULE} & trap sig_joiner_cleanup HUP PIPE INT TERM trap cleanup_joiner EXIT diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt index b4acac54..f6ee59a9 100644 --- a/sql/CMakeLists.txt +++ b/sql/CMakeLists.txt @@ -1,5 +1,5 @@ # Copyright (c) 2006, 2014, Oracle and/or its affiliates. -# Copyright (c) 2010, 2015, 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 diff --git a/sql/contributors.h b/sql/contributors.h index 88a4a088..7369dcd1 100644 --- a/sql/contributors.h +++ b/sql/contributors.h @@ -38,8 +38,9 @@ struct show_table_contributors_st { struct show_table_contributors_st show_table_contributors[]= { /* MariaDB foundation sponsors, in contribution, size , time order */ {"Booking.com", "https://www.booking.com", "Founding member, Platinum Sponsor of the MariaDB Foundation"}, - {"Alibaba Cloud", "https://intl.aliyun.com", "Platinum Sponsor of the MariaDB Foundation"}, + {"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"}, {"Visma", "https://visma.com", "Gold Sponsor of the MariaDB Foundation"}, {"DBS", "https://dbs.com", "Gold Sponsor of the MariaDB Foundation"}, diff --git a/sql/field.cc b/sql/field.cc index 141a7354..9bc1fcbf 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -2138,7 +2138,7 @@ uint Field::fill_cache_field(CACHE_FIELD *copy) { uint store_length; copy->str= ptr; - copy->length= pack_length(); + copy->length= pack_length_in_rec(); copy->field= this; if (flags & BLOB_FLAG) { @@ -9422,7 +9422,7 @@ int Field_bit::key_cmp(const uchar *str, uint length) str++; length--; } - return memcmp(ptr, str, length); + return memcmp(ptr, str, bytes_in_rec); } diff --git a/sql/field.h b/sql/field.h index 530f6d08..c21bba69 100644 --- a/sql/field.h +++ b/sql/field.h @@ -618,7 +618,7 @@ class Field: public Value_source { return alloc_root(mem_root, size); } static void *operator new(size_t size) throw () { return sql_alloc(size); } - static void operator delete(void *ptr_arg, size_t size) { TRASH(ptr_arg, size); } + static void operator delete(void *ptr_arg, size_t size) { TRASH_FREE(ptr_arg, size); } static void operator delete(void *ptr, MEM_ROOT *mem_root) { DBUG_ASSERT(0); } diff --git a/sql/field_conv.cc b/sql/field_conv.cc index 850403af..c4c843a3 100644 --- a/sql/field_conv.cc +++ b/sql/field_conv.cc @@ -607,7 +607,7 @@ void Copy_field::set(uchar *to,Field *from) { from_ptr=from->ptr; to_ptr=to; - from_length=from->pack_length(); + from_length=from->pack_length_in_rec(); if (from->maybe_null()) { from_null_ptr=from->null_ptr; @@ -655,9 +655,9 @@ void Copy_field::set(Field *to,Field *from,bool save) from_field=from; to_field=to; from_ptr=from->ptr; - from_length=from->pack_length(); + from_length=from->pack_length_in_rec(); to_ptr= to->ptr; - to_length=to_field->pack_length(); + to_length=to_field->pack_length_in_rec(); // set up null handling from_null_ptr=to_null_ptr=0; diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index 0649d5d4..34c253cc 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -2180,38 +2180,19 @@ void ha_partition::update_create_info(HA_CREATE_INFO *create_info) DBUG_ASSERT(sub_elem); part= i * num_subparts + j; DBUG_ASSERT(part < m_file_tot_parts && m_file[part]); - if (ha_legacy_type(m_file[part]->ht) == DB_TYPE_INNODB) - { - dummy_info.data_file_name= dummy_info.index_file_name = NULL; - m_file[part]->update_create_info(&dummy_info); - - if (dummy_info.data_file_name || sub_elem->data_file_name) - { - sub_elem->data_file_name = (char*) dummy_info.data_file_name; - } - if (dummy_info.index_file_name || sub_elem->index_file_name) - { - sub_elem->index_file_name = (char*) dummy_info.index_file_name; - } - } + dummy_info.data_file_name= dummy_info.index_file_name = NULL; + m_file[part]->update_create_info(&dummy_info); + sub_elem->data_file_name = (char*) dummy_info.data_file_name; + sub_elem->index_file_name = (char*) dummy_info.index_file_name; } } else { DBUG_ASSERT(m_file[i]); - if (ha_legacy_type(m_file[i]->ht) == DB_TYPE_INNODB) - { - dummy_info.data_file_name= dummy_info.index_file_name= NULL; - m_file[i]->update_create_info(&dummy_info); - if (dummy_info.data_file_name || part_elem->data_file_name) - { - part_elem->data_file_name = (char*) dummy_info.data_file_name; - } - if (dummy_info.index_file_name || part_elem->index_file_name) - { - part_elem->index_file_name = (char*) dummy_info.index_file_name; - } - } + dummy_info.data_file_name= dummy_info.index_file_name= NULL; + m_file[i]->update_create_info(&dummy_info); + part_elem->data_file_name = (char*) dummy_info.data_file_name; + part_elem->index_file_name = (char*) dummy_info.index_file_name; } } DBUG_VOID_RETURN; @@ -8152,20 +8133,36 @@ uint ha_partition::alter_table_flags(uint flags) bool ha_partition::check_if_incompatible_data(HA_CREATE_INFO *create_info, uint table_changes) { - handler **file; - bool ret= COMPATIBLE_DATA_YES; - /* The check for any partitioning related changes have already been done in mysql_alter_table (by fix_partition_func), so it is only up to the underlying handlers. */ - for (file= m_file; *file; file++) - if ((ret= (*file)->check_if_incompatible_data(create_info, - table_changes)) != - COMPATIBLE_DATA_YES) - break; - return ret; + List_iterator part_it(m_part_info->partitions); + HA_CREATE_INFO dummy_info= *create_info; + uint i=0; + while (partition_element *part_elem= part_it++) + { + if (m_is_sub_partitioned) + { + List_iterator subpart_it(part_elem->subpartitions); + while (partition_element *sub_elem= subpart_it++) + { + dummy_info.data_file_name= sub_elem->data_file_name; + dummy_info.index_file_name= sub_elem->index_file_name; + if (m_file[i++]->check_if_incompatible_data(&dummy_info, table_changes)) + return COMPATIBLE_DATA_NO; + } + } + else + { + dummy_info.data_file_name= part_elem->data_file_name; + dummy_info.index_file_name= part_elem->index_file_name; + if (m_file[i++]->check_if_incompatible_data(&dummy_info, table_changes)) + return COMPATIBLE_DATA_NO; + } + } + return COMPATIBLE_DATA_YES; } diff --git a/sql/handler.cc b/sql/handler.cc index a5a28ceb..b2a00e48 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -3325,9 +3325,11 @@ void print_keydup_error(TABLE *table, KEY *key, const char *msg, myf errflag) if (key == NULL) { - /* Key is unknown */ - str.copy("", 0, system_charset_info); - my_printf_error(ER_DUP_ENTRY, msg, errflag, str.c_ptr(), "*UNKNOWN*"); + /* + Key is unknown. Should only happen if storage engine reports wrong + duplicate key number. + */ + my_printf_error(ER_DUP_ENTRY, msg, errflag, "", "*UNKNOWN*"); } else { @@ -3421,11 +3423,9 @@ void handler::print_error(int error, myf errflag) if (table) { uint key_nr=get_dup_key(error); - if ((int) key_nr >= 0) + if ((int) key_nr >= 0 && key_nr < table->s->keys) { - print_keydup_error(table, - key_nr == MAX_KEY ? NULL : &table->key_info[key_nr], - errflag); + print_keydup_error(table, &table->key_info[key_nr], errflag); DBUG_VOID_RETURN; } } diff --git a/sql/item.cc b/sql/item.cc index 97bd15b6..2cc45dc6 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2016, Oracle and/or its affiliates. - Copyright (c) 2010, 2017, MariaDB Corporation + 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 @@ -8404,7 +8404,7 @@ Item *Item_default_value::transform(THD *thd, Item_transformer transformer, bool Item_insert_value::eq(const Item *item, bool binary_cmp) const { return item->type() == INSERT_VALUE_ITEM && - ((Item_default_value *)item)->arg->eq(arg, binary_cmp); + ((Item_insert_value *)item)->arg->eq(arg, binary_cmp); } @@ -9923,11 +9923,11 @@ const char *dbug_print_item(Item *item) ulonglong save_option_bits= thd->variables.option_bits; thd->variables.option_bits &= ~OPTION_QUOTE_SHOW_CREATE; - item->print(&str ,QT_EXPLAIN); + item->print(&str, QT_EXPLAIN); thd->variables.option_bits= save_option_bits; - if (str.c_ptr() == buf) + if (str.c_ptr_safe() == buf) return buf; else return "Couldn't fit into buffer"; diff --git a/sql/item.h b/sql/item.h index 921179ce..a9b8006c 100644 --- a/sql/item.h +++ b/sql/item.h @@ -2,7 +2,7 @@ #define SQL_ITEM_INCLUDED /* Copyright (c) 2000, 2017, Oracle and/or its affiliates. - Copyright (c) 2009, 2017, 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 @@ -54,6 +54,12 @@ bool trace_unsupported_by_check_vcol_func_processor(const char *where) return trace_unsupported_func(where, "check_vcol_func_processor"); } +#ifdef DBUG_OFF +static inline const char *dbug_print_item(Item *item) { return NULL; } +#else +extern const char *dbug_print_item(Item *item); +#endif + class Protocol; struct TABLE_LIST; void item_init(void); /* Init item functions */ @@ -623,7 +629,7 @@ class Item: public Value_source, public: static void *operator new(size_t size, MEM_ROOT *mem_root) throw () { return alloc_root(mem_root, size); } - static void operator delete(void *ptr,size_t size) { TRASH(ptr, size); } + static void operator delete(void *ptr,size_t size) { TRASH_FREE(ptr, size); } static void operator delete(void *ptr, MEM_ROOT *mem_root) {} enum Type {FIELD_ITEM= 0, FUNC_ITEM, SUM_FUNC_ITEM, STRING_ITEM, diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index c7e95773..4e2e5bd4 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -1232,6 +1232,7 @@ bool Item_in_optimizer::is_top_level_item() void Item_in_optimizer::fix_after_pullout(st_select_lex *new_parent, Item **ref, bool merge) { + DBUG_ASSERT(fixed); /* This will re-calculate attributes of our Item_in_subselect: */ Item_bool_func::fix_after_pullout(new_parent, ref, merge); @@ -1255,6 +1256,33 @@ bool Item_in_optimizer::eval_not_null_tables(uchar *opt_arg) } +void Item_in_optimizer::print(String *str, enum_query_type query_type) +{ + restore_first_argument(); + Item_func::print(str, query_type); +} + + +/** + "Restore" first argument before fix_fields() call (after it is harmless). + + @Note: Main pointer to left part of IN/ALL/ANY subselect is subselect's + lest_expr (see Item_in_optimizer::fix_left) so changes made during + fix_fields will be rolled back there which can make + Item_in_optimizer::args[0] unusable on second execution before fix_left() + call. This call fix the pointer. +*/ + +void Item_in_optimizer::restore_first_argument() +{ + if (args[1]->type() == Item::SUBSELECT_ITEM && + ((Item_subselect *)args[1])->is_in_predicate()) + { + args[0]= ((Item_in_subselect *)args[1])->left_expr; + } +} + + bool Item_in_optimizer::fix_left(THD *thd) { DBUG_ENTER("Item_in_optimizer::fix_left"); @@ -1429,6 +1457,7 @@ bool Item_in_optimizer::invisible_mode() Item *Item_in_optimizer::expr_cache_insert_transformer(THD *thd, uchar *unused) { DBUG_ENTER("Item_in_optimizer::expr_cache_insert_transformer"); + DBUG_ASSERT(fixed); if (invisible_mode()) DBUG_RETURN(this); @@ -1453,6 +1482,7 @@ Item *Item_in_optimizer::expr_cache_insert_transformer(THD *thd, uchar *unused) void Item_in_optimizer::get_cache_parameters(List ¶meters) { + DBUG_ASSERT(fixed); /* Add left expression to the list of the parameters of the subquery */ if (!invisible_mode()) { @@ -1690,6 +1720,7 @@ Item *Item_in_optimizer::transform(THD *thd, Item_transformer transformer, { Item *new_item; + DBUG_ASSERT(fixed); DBUG_ASSERT(!thd->stmt_arena->is_stmt_prepare()); DBUG_ASSERT(arg_count == 2); @@ -1741,6 +1772,7 @@ Item *Item_in_optimizer::transform(THD *thd, Item_transformer transformer, bool Item_in_optimizer::is_expensive_processor(uchar *arg) { + DBUG_ASSERT(fixed); return args[0]->is_expensive_processor(arg) || args[1]->is_expensive_processor(arg); } @@ -1748,6 +1780,7 @@ bool Item_in_optimizer::is_expensive_processor(uchar *arg) bool Item_in_optimizer::is_expensive() { + DBUG_ASSERT(fixed); return args[0]->is_expensive() || args[1]->is_expensive(); } @@ -2793,7 +2826,9 @@ void Item_func_nullif::print(String *str, enum_query_type query_type) Therefore, after equal field propagation args[0] and args[2] can point to different items. */ - if ((query_type & QT_ITEM_ORIGINAL_FUNC_NULLIF) || args[0] == args[2]) + if ((query_type & QT_ITEM_ORIGINAL_FUNC_NULLIF) || + (arg_count == 2) || + (args[0] == args[2])) { /* If QT_ITEM_ORIGINAL_FUNC_NULLIF is requested, @@ -2811,10 +2846,14 @@ void Item_func_nullif::print(String *str, enum_query_type query_type) - one "a" for comparison - another "a" for the returned value! */ - DBUG_ASSERT(args[0] == args[2] || current_thd->lex->context_analysis_only); + DBUG_ASSERT(arg_count == 2 || + args[0] == args[2] || current_thd->lex->context_analysis_only); str->append(func_name()); str->append('('); - args[2]->print(str, query_type); + if (arg_count == 2) + args[0]->print(str, query_type); + else + args[2]->print(str, query_type); str->append(','); args[1]->print(str, query_type); str->append(')'); diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 361e4b35..076e6da9 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -345,6 +345,8 @@ class Item_in_optimizer: public Item_bool_func void fix_after_pullout(st_select_lex *new_parent, Item **ref, bool merge); bool invisible_mode(); void reset_cache() { cache= NULL; } + virtual void print(String *str, enum_query_type query_type); + void restore_first_argument(); }; @@ -1677,9 +1679,9 @@ class Item_func_isnull :public Item_func_null_predicate bool arg_is_datetime_notnull_field() { Item **args= arguments(); - if (args[0]->type() == Item::FIELD_ITEM) + if (args[0]->real_item()->type() == Item::FIELD_ITEM) { - Field *field=((Item_field*) args[0])->field; + Field *field=((Item_field*) args[0]->real_item())->field; if (((field->type() == MYSQL_TYPE_DATE) || (field->type() == MYSQL_TYPE_DATETIME)) && diff --git a/sql/item_func.cc b/sql/item_func.cc index 6b444a7e..0700d71a 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -550,6 +550,7 @@ my_decimal *Item_real_func::val_decimal(my_decimal *decimal_value) } +#ifdef HAVE_DLOPEN void Item_udf_func::fix_num_length_and_dec() { uint fl_length= 0; @@ -566,6 +567,7 @@ void Item_udf_func::fix_num_length_and_dec() max_length= float_length(NOT_FIXED_DEC); } } +#endif /** diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 04927f88..cd47257a 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2017, Oracle and/or its affiliates. - Copyright (c) 2009, 2017, 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 @@ -203,9 +203,9 @@ String *Item_func_sha2::val_str_ascii(String *str) const char *input_ptr; size_t input_len; + input_string= args[0]->val_str(str); str->set_charset(&my_charset_bin); - input_string= args[0]->val_str(str); if (input_string == NULL) { null_value= TRUE; @@ -546,139 +546,84 @@ String *Item_func_decode_histogram::val_str(String *str) /////////////////////////////////////////////////////////////////////////////// +/* + Realloc the result buffer. + NOTE: We should be prudent in the initial allocation unit -- the + size of the arguments is a function of data distribution, which + can be any. Instead of overcommitting at the first row, we grow + the allocated amount by the factor of 2. This ensures that no + more than 25% of memory will be overcommitted on average. + + @param IN/OUT str - the result string + @param IN length - new total space required in "str" + @retval false - on success + @retval true - on error +*/ + +bool Item_func_concat::realloc_result(String *str, uint length) const +{ + if (str->alloced_length() >= length) + return false; // Alloced space is big enough, nothing to do. + + if (str->alloced_length() == 0) + return str->alloc(length); + + /* + Item_func_concat::val_str() makes sure the result length does not grow + higher than max_allowed_packet. So "length" is limited to 1G here. + We can't say anything about the current value of str->alloced_length(), + as str was initially set by args[0]->val_str(str). + So multiplication by 2 can overflow, if args[0] for some reasons + did not limit the result to max_alloced_packet. But it's not harmful, + "str" will be realloced exactly to "length" bytes in case of overflow. + */ + uint new_length= MY_MAX(str->alloced_length() * 2, length); + return str->realloc(new_length); +} + + /** Concatenate args with the following premises: If only one arg (which is ok), return value of arg; - Don't reallocate val_str() if not absolute necessary. */ String *Item_func_concat::val_str(String *str) { DBUG_ASSERT(fixed == 1); - String *res,*res2,*use_as_buff; - uint i; - bool is_const= 0; + THD *thd= current_thd; + String *res; null_value=0; - if (!(res=args[0]->val_str(str))) + if (!(res= args[0]->val_str(str))) goto null; - use_as_buff= &tmp_value; - is_const= args[0]->const_item(); - for (i=1 ; i < arg_count ; i++) - { - if (res->length() == 0) - { - if (!(res=args[i]->val_str(str))) - goto null; - /* - CONCAT accumulates its result in the result of its the first - non-empty argument. Because of this we need is_const to be - evaluated only for it. - */ - is_const= args[i]->const_item(); - } - else - { - if (!(res2=args[i]->val_str(use_as_buff))) - goto null; - if (res2->length() == 0) - continue; - if (res->length()+res2->length() > - current_thd->variables.max_allowed_packet) - { - THD *thd= current_thd; - push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - ER_WARN_ALLOWED_PACKET_OVERFLOWED, - ER_THD(thd, ER_WARN_ALLOWED_PACKET_OVERFLOWED), - func_name(), - thd->variables.max_allowed_packet); - goto null; - } - if (!is_const && res->alloced_length() >= res->length()+res2->length()) - { // Use old buffer - res->append(*res2); - } - else if (str->alloced_length() >= res->length()+res2->length()) - { - if (str->ptr() == res2->ptr()) - str->replace(0,0,*res); - else - { - str->copy(*res); - str->append(*res2); - } - res= str; - use_as_buff= &tmp_value; - } - else if (res == &tmp_value) - { - if (res->append(*res2)) // Must be a blob - goto null; - } - else if (res2 == &tmp_value) - { // This can happend only 1 time - if (tmp_value.replace(0,0,*res)) - goto null; - res= &tmp_value; - use_as_buff=str; // Put next arg here - } - else if (tmp_value.is_alloced() && res2->ptr() >= tmp_value.ptr() && - res2->ptr() <= tmp_value.ptr() + tmp_value.alloced_length()) - { - /* - This happens really seldom: - In this case res2 is sub string of tmp_value. We will - now work in place in tmp_value to set it to res | res2 - */ - /* Chop the last characters in tmp_value that isn't in res2 */ - tmp_value.length((uint32) (res2->ptr() - tmp_value.ptr()) + - res2->length()); - /* Place res2 at start of tmp_value, remove chars before res2 */ - if (tmp_value.replace(0,(uint32) (res2->ptr() - tmp_value.ptr()), - *res)) - goto null; - res= &tmp_value; - use_as_buff=str; // Put next arg here - } - else - { // Two big const strings - /* - NOTE: We should be prudent in the initial allocation unit -- the - size of the arguments is a function of data distribution, which - can be any. Instead of overcommitting at the first row, we grow - the allocated amount by the factor of 2. This ensures that no - more than 25% of memory will be overcommitted on average. - */ - - uint concat_len= res->length() + res2->length(); - - if (tmp_value.alloced_length() < concat_len) - { - if (tmp_value.alloced_length() == 0) - { - if (tmp_value.alloc(concat_len)) - goto null; - } - else - { - uint new_len = MY_MAX(tmp_value.alloced_length() * 2, concat_len); - if (tmp_value.realloc(new_len)) - goto null; - } - } + if (res != str) + str->copy(res->ptr(), res->length(), res->charset()); - if (tmp_value.copy(*res) || tmp_value.append(*res2)) - goto null; - - res= &tmp_value; - use_as_buff=str; - } - is_const= 0; + for (uint i= 1 ; i < arg_count ; i++) + { + uint concat_len; + if (!(res= args[i]->val_str(&tmp_value))) + goto null; + if (res->length() == 0) + continue; + if ((concat_len= str->length() + res->length()) > + thd->variables.max_allowed_packet) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_ALLOWED_PACKET_OVERFLOWED, + ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED), func_name(), + thd->variables.max_allowed_packet); + goto null; } + DBUG_ASSERT(!res->uses_buffer_owned_by(str)); + DBUG_ASSERT(!str->uses_buffer_owned_by(res)); + if (realloc_result(str, concat_len) || str->append(*res)) + goto null; } - res->set_charset(collation.collation); - return res; + + str->set_charset(collation.collation); + return str; null: null_value=1; diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 467e2bd5..e19efd31 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -230,6 +230,7 @@ class Item_func_aes_decrypt :public Item_aes_crypt class Item_func_concat :public Item_str_func { String tmp_value; + bool realloc_result(String *str, uint length) const; public: Item_func_concat(THD *thd, List &list): Item_str_func(thd, list) {} Item_func_concat(THD *thd, Item *a, Item *b): Item_str_func(thd, a, b) {} diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 1c1f09c4..7dbaf313 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -2128,7 +2128,10 @@ Item_in_subselect::create_single_in_to_exists_cond(JOIN *join, } else { - Item *item= (Item*) select_lex->item_list.head()->real_item(); + Item *item= (Item*) select_lex->item_list.head(); + if (item->type() != REF_ITEM || + ((Item_ref*)item)->ref_type() != Item_ref::VIEW_REF) + item= item->real_item(); if (select_lex->table_list.elements) { @@ -5487,7 +5490,7 @@ int subselect_hash_sj_engine::exec() if (has_covering_null_row) { - DBUG_ASSERT(count_partial_match_columns = field_count); + DBUG_ASSERT(count_partial_match_columns == field_count); count_pm_keys= 0; } else if (has_covering_null_columns) diff --git a/sql/item_xmlfunc.cc b/sql/item_xmlfunc.cc index 0741da15..c9e6df52 100644 --- a/sql/item_xmlfunc.cc +++ b/sql/item_xmlfunc.cc @@ -2702,7 +2702,7 @@ void Item_xml_str_func::fix_length_and_dec() bool Item_xml_str_func::fix_fields(THD *thd, Item **ref) { - String *xp, tmp; + String *xp; MY_XPATH xpath; int rc; @@ -2730,7 +2730,13 @@ bool Item_xml_str_func::fix_fields(THD *thd, Item **ref) return true; } - if (!(xp= args[1]->val_str(&tmp))) + /* + Get the XPath query text from args[1] and cache it in m_xpath_query. + Its fragments will be referenced by items created during my_xpath_parse(), + e.g. by Item_nodeset_func_axisbyname::node_name. + */ + if (!(xp= args[1]->val_str(&m_xpath_query)) || + (xp != &m_xpath_query && m_xpath_query.copy(*xp))) return false; // Will return NULL my_xpath_init(&xpath); xpath.thd= thd; diff --git a/sql/item_xmlfunc.h b/sql/item_xmlfunc.h index 3758025f..92a8f757 100644 --- a/sql/item_xmlfunc.h +++ b/sql/item_xmlfunc.h @@ -67,6 +67,7 @@ class Item_xml_str_func: public Item_str_func return parse(res, cache); } }; + String m_xpath_query; // XPath query text Item *nodeset_func; XML xml; bool get_xml(XML *xml_arg, bool cache= false) diff --git a/sql/key.cc b/sql/key.cc index 1b00e951..523ddf98 100644 --- a/sql/key.cc +++ b/sql/key.cc @@ -65,7 +65,8 @@ int find_ref_key(KEY *key, uint key_count, uchar *record, Field *field, i < (int) key_count ; i++, key_info++) { - if (key_info->key_part[0].offset == fieldpos) + if (key_info->key_part[0].offset == fieldpos && + key_info->key_part[0].field->type() != MYSQL_TYPE_BIT) { /* Found key. Calc keylength */ *key_length= *keypart= 0; return i; /* Use this key */ @@ -84,7 +85,8 @@ int find_ref_key(KEY *key, uint key_count, uchar *record, Field *field, j < key_info->user_defined_key_parts ; j++, key_part++) { - if (key_part->offset == fieldpos) + if (key_part->offset == fieldpos && + key_part->field->type() != MYSQL_TYPE_BIT) { *keypart= j; return i; /* Use this key */ diff --git a/sql/log.cc b/sql/log.cc index 07d4074c..29f8c563 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -4947,7 +4947,55 @@ MYSQL_BIN_LOG::is_xidlist_idle_nolock() return true; } +#ifdef WITH_WSREP +inline bool +is_gtid_cached_internal(IO_CACHE *file) +{ + uchar data[EVENT_TYPE_OFFSET+1]; + bool result= false; + my_off_t write_pos= my_b_tell(file); + if (reinit_io_cache(file, READ_CACHE, 0, 0, 0)) + return false; + /* + In the cache we have gtid event if , below condition is true, + */ + my_b_read(file, data, sizeof(data)); + uint event_type= (uchar)data[EVENT_TYPE_OFFSET]; + if (event_type == GTID_LOG_EVENT) + result= true; + /* + Cleanup , Why because we have not read the full buffer + and this will cause next to next reinit_io_cache(called in write_cache) + to make cache empty. + */ + file->read_pos= file->read_end; + if (reinit_io_cache(file, WRITE_CACHE, write_pos, 0, 0)) + return false; + return result; +} +#endif +#ifdef WITH_WSREP +inline bool +MYSQL_BIN_LOG::is_gtid_cached(THD *thd) +{ + binlog_cache_mngr *mngr= (binlog_cache_mngr *) thd_get_ha_data( + thd, binlog_hton); + if (!mngr) + return false; + binlog_cache_data *cache_trans= mngr->get_binlog_cache_data( + use_trans_cache(thd, true)); + binlog_cache_data *cache_stmt= mngr->get_binlog_cache_data( + use_trans_cache(thd, false)); + if (cache_trans && !cache_trans->empty() && + is_gtid_cached_internal(&cache_trans->cache_log)) + return true; + if (cache_stmt && !cache_stmt->empty() && + is_gtid_cached_internal(&cache_stmt->cache_log)) + return true; + return false; +} +#endif /** Create a new log file name. @@ -5544,7 +5592,37 @@ THD::binlog_start_trans_and_stmt() cache_mngr->trx_cache.get_prev_position() == MY_OFF_T_UNDEF) { this->binlog_set_stmt_begin(); - if (in_multi_stmt_transaction_mode()) + bool mstmt_mode= in_multi_stmt_transaction_mode(); +#ifdef WITH_WSREP + /* Write Gtid + Get domain id only when gtid mode is set + If this event is replicate through a master then , + we will forward the same gtid another nodes + We have to do this only one time in mysql transaction. + Since this function is called multiple times , We will check for + ha_info->is_started() + */ + Ha_trx_info *ha_info; + ha_info= this->ha_data[binlog_hton->slot].ha_info + (mstmt_mode ? 1 : 0); + + if (!ha_info->is_started() && wsrep_gtid_mode + && this->variables.gtid_seq_no) + { + binlog_cache_mngr *const cache_mngr= + (binlog_cache_mngr*) thd_get_ha_data(this, binlog_hton); + + IO_CACHE *file= + cache_mngr->get_binlog_cache_log(use_trans_cache(this, true)); + Log_event_writer writer(file); + Gtid_log_event gtid_event(this, this->variables.gtid_seq_no, + this->variables.gtid_domain_id, + true, LOG_EVENT_SUPPRESS_USE_F, + true, 0); + gtid_event.server_id= this->variables.server_id; + writer.write(>id_event); + } +#endif + if (mstmt_mode) trans_register_ha(this, TRUE, binlog_hton); trans_register_ha(this, FALSE, binlog_hton); /* @@ -5826,7 +5904,7 @@ MYSQL_BIN_LOG::write_gtid_event(THD *thd, bool standalone, DBUG_PRINT("enter", ("standalone: %d", standalone)); #ifdef WITH_WSREP - if (WSREP(thd) && thd->wsrep_trx_meta.gtid.seqno != -1 && wsrep_gtid_mode) + if (WSREP(thd) && thd->wsrep_trx_meta.gtid.seqno != -1 && wsrep_gtid_mode && !thd->variables.gtid_seq_no) { domain_id= wsrep_gtid_domain_id; } else { @@ -5878,6 +5956,12 @@ MYSQL_BIN_LOG::write_gtid_event(THD *thd, bool standalone, /* Write the event to the binary log. */ DBUG_ASSERT(this == &mysql_bin_log); + +#ifdef WITH_WSREP + if (wsrep_gtid_mode && is_gtid_cached(thd)) + DBUG_RETURN(false); +#endif + if (write_event(>id_event)) DBUG_RETURN(true); status_var_add(thd->status_var.binlog_bytes_written, gtid_event.data_written); diff --git a/sql/log.h b/sql/log.h index 3026ca11..2118bd7a 100644 --- a/sql/log.h +++ b/sql/log.h @@ -559,7 +559,13 @@ class MYSQL_BIN_LOG: public TC_LOG, private MYSQL_LOG bool write_transaction_to_binlog_events(group_commit_entry *entry); void trx_group_commit_leader(group_commit_entry *leader); bool is_xidlist_idle_nolock(); - +#ifdef WITH_WSREP + /* + When this mariadb node is slave and galera enabled. So in this case + we write the gtid in wsrep_run_commit itself. + */ + inline bool is_gtid_cached(THD *thd); +#endif public: /* A list of struct xid_count_per_binlog is used to keep track of how many diff --git a/sql/log_event.cc b/sql/log_event.cc index f2f7b877..81bc6836 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -4184,8 +4184,13 @@ bool test_if_equal_repl_errors(int expected_error, int actual_error) return 1; switch (expected_error) { case ER_DUP_ENTRY: + case ER_DUP_ENTRY_WITH_KEY_NAME: + case ER_DUP_KEY: case ER_AUTOINC_READ_FAILED: - return (actual_error == ER_AUTOINC_READ_FAILED || + return (actual_error == ER_DUP_ENTRY || + actual_error == ER_DUP_ENTRY_WITH_KEY_NAME || + actual_error == ER_DUP_KEY || + actual_error == ER_AUTOINC_READ_FAILED || actual_error == HA_ERR_AUTOINC_ERANGE); case ER_UNKNOWN_TABLE: return actual_error == ER_IT_IS_A_VIEW; diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 227c3eb6..0de9d7a9 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -4096,7 +4096,7 @@ static int init_common_variables() /* TODO: remove this when my_time_t is 64 bit compatible */ if (!IS_TIME_T_VALID_FOR_TIMESTAMP(server_start_time)) { - sql_print_error("This MySQL server doesn't support dates later then 2038"); + sql_print_error("This MySQL server doesn't support dates later than 2038"); return 1; } diff --git a/sql/net_serv.cc b/sql/net_serv.cc index ed283863..6d200f55 100644 --- a/sql/net_serv.cc +++ b/sql/net_serv.cc @@ -58,9 +58,11 @@ #ifdef EXTRA_DEBUG #define EXTRA_DEBUG_fprintf fprintf #define EXTRA_DEBUG_fflush fflush +#define EXTRA_DEBUG_ASSERT DBUG_ASSERT #else static void inline EXTRA_DEBUG_fprintf(...) {} static int inline EXTRA_DEBUG_fflush(...) { return 0; } +#define EXTRA_DEBUG_ASSERT(X) do {} while(0) #endif #ifdef MYSQL_SERVER #define MYSQL_SERVER_my_error my_error @@ -1072,7 +1074,7 @@ my_real_read(NET *net, size_t *complen, ("Packets out of order (Found: %d, expected %u)", (int) net->buff[net->where_b + 3], net->pkt_nr)); - DBUG_ASSERT(0); + EXTRA_DEBUG_ASSERT(0); /* We don't make noise server side, since the client is expected to break the protocol for e.g. --send LOAD DATA .. LOCAL where diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 5377e4e4..0315b91b 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -2081,7 +2081,7 @@ class TABLE_READ_PLAN /* Table read plans are allocated on MEM_ROOT and are never deleted */ static void *operator new(size_t size, MEM_ROOT *mem_root) { return (void*) alloc_root(mem_root, (uint) size); } - static void operator delete(void *ptr,size_t size) { TRASH(ptr, size); } + static void operator delete(void *ptr,size_t size) { TRASH_FREE(ptr, size); } static void operator delete(void *ptr, MEM_ROOT *mem_root) { /* Never called */ } virtual ~TABLE_READ_PLAN() {} /* Remove gcc warning */ diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc index 138af3f1..d7371fa7 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -2704,7 +2704,8 @@ void advance_sj_state(JOIN *join, table_map remaining_tables, uint idx, LooseScan detector in best_access_path) */ remaining_tables &= ~new_join_tab->table->map; - table_map dups_producing_tables; + table_map dups_producing_tables, prev_dups_producing_tables, + prev_sjm_lookup_tables; if (idx == join->const_tables) dups_producing_tables= 0; @@ -2715,7 +2716,7 @@ void advance_sj_state(JOIN *join, table_map remaining_tables, uint idx, if ((emb_sj_nest= new_join_tab->emb_sj_nest)) dups_producing_tables |= emb_sj_nest->sj_inner_tables; - Semi_join_strategy_picker **strategy; + Semi_join_strategy_picker **strategy, **prev_strategy; if (idx == join->const_tables) { /* First table, initialize pickers */ @@ -2767,23 +2768,54 @@ void advance_sj_state(JOIN *join, table_map remaining_tables, uint idx, 3. We have no clue what to do about fanount of semi-join Y. */ if ((dups_producing_tables & handled_fanout) || - (read_time < *current_read_time && + (read_time < *current_read_time && !(handled_fanout & pos->inner_tables_handled_with_other_sjs))) { - /* Mark strategy as used */ - (*strategy)->mark_used(); - pos->sj_strategy= sj_strategy; - if (sj_strategy == SJ_OPT_MATERIALIZE) - join->sjm_lookup_tables |= handled_fanout; + DBUG_ASSERT(pos->sj_strategy != sj_strategy); + /* + If the strategy choosen first time or + the strategy replace strategy which was used to exectly the same + tables + */ + if (pos->sj_strategy == SJ_OPT_NONE || + handled_fanout == + (prev_dups_producing_tables ^ dups_producing_tables)) + { + prev_strategy= strategy; + if (pos->sj_strategy == SJ_OPT_NONE) + { + prev_dups_producing_tables= dups_producing_tables; + prev_sjm_lookup_tables= join->sjm_lookup_tables; + } + /* Mark strategy as used */ + (*strategy)->mark_used(); + pos->sj_strategy= sj_strategy; + if (sj_strategy == SJ_OPT_MATERIALIZE) + join->sjm_lookup_tables |= handled_fanout; + else + join->sjm_lookup_tables &= ~handled_fanout; + *current_read_time= read_time; + *current_record_count= rec_count; + dups_producing_tables &= ~handled_fanout; + //TODO: update bitmap of semi-joins that were handled together with + // others. + if (is_multiple_semi_joins(join, join->positions, idx, + handled_fanout)) + pos->inner_tables_handled_with_other_sjs |= handled_fanout; + } else - join->sjm_lookup_tables &= ~handled_fanout; - *current_read_time= read_time; - *current_record_count= rec_count; - dups_producing_tables &= ~handled_fanout; - //TODO: update bitmap of semi-joins that were handled together with - // others. - if (is_multiple_semi_joins(join, join->positions, idx, handled_fanout)) - pos->inner_tables_handled_with_other_sjs |= handled_fanout; + { + /* Conflict fall to most general variant */ + (*prev_strategy)->set_empty(); + dups_producing_tables= prev_dups_producing_tables; + join->sjm_lookup_tables= prev_sjm_lookup_tables; + // mark it 'none' to avpoid loops + pos->sj_strategy= SJ_OPT_NONE; + // next skip to last; + strategy= pickers + + (sizeof(pickers)/sizeof(Semi_join_strategy_picker*) - 3); + continue; + } } else { diff --git a/sql/sp.cc b/sql/sp.cc index 5a64c288..2e268e48 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -760,7 +760,6 @@ static sp_head *sp_compile(THD *thd, String *defstr, ulonglong sql_mode, else { sp= thd->lex->sphead; - sp->set_select_number(thd->select_number); } thd->pop_internal_handler(); diff --git a/sql/sp_head.cc b/sql/sp_head.cc index eceebd1d..8bf78d97 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -597,7 +597,7 @@ sp_head::sp_head() m_flags(0), m_sp_cache_version(0), m_creation_ctx(0), - unsafe_flags(0), m_select_number(1), + unsafe_flags(0), m_recursion_level(0), m_next_cached_sp(0), m_cont_level(0) @@ -840,7 +840,7 @@ sp_head::~sp_head() thd->lex->sphead= NULL; lex_end(thd->lex); delete thd->lex; - thd->lex= lex; + thd->lex= thd->stmt_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; + LEX *old_lex, *old_stmt_lex; Item_change_list old_change_list; String old_packet; uint old_server_status; @@ -1136,19 +1136,6 @@ sp_head::execute(THD *thd, bool merge_da_on_success) if (check_stack_overrun(thd, 7 * STACK_MIN_SIZE, (uchar*)&old_packet)) DBUG_RETURN(TRUE); - /* - Normally the counter is not reset between parsing and first execution, - but it is possible in case of error to have parsing on one CALL and - first execution (where VIEW will be parsed and added). So we store the - counter after parsing and restore it before execution just to avoid - repeating SELECT numbers. - - Other problem is that it can be more SELECTs parsed in case of fixing - error causes previous interruption of the SP. So it is save not just - assign old value but add it. - */ - thd->select_number+= m_select_number; - /* init per-instruction memroot */ init_sql_alloc(&execute_mem_root, MEM_ROOT_BLOCK_SIZE, 0, MYF(0)); @@ -1237,6 +1224,7 @@ 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. @@ -1384,6 +1372,7 @@ 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; @@ -1482,16 +1471,6 @@ sp_head::execute(THD *thd, bool merge_da_on_success) m_recursion_level + 1)); m_first_instance->m_first_free_instance= this; - /* - This execution of the SP was aborted with an error (e.g. "Table not - found"). However it might still have consumed some numbers from the - thd->select_number counter. The next sp->exec() call must not use the - consumed numbers, so we remember the first free number (We know that - nobody will use it as this execution has stopped with an error). - */ - if (err_status) - set_select_number(thd->select_number); - DBUG_RETURN(err_status); } @@ -2228,7 +2207,7 @@ sp_head::reset_lex(THD *thd) if (sublex == 0) DBUG_RETURN(TRUE); - thd->lex= sublex; + thd->lex= thd->stmt_lex= sublex; (void)m_lex.push_front(oldlex); /* Reset most stuff. */ @@ -2974,7 +2953,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= m_lex; + thd->lex= thd->stmt_lex= m_lex; thd->set_query_id(next_query_id()); diff --git a/sql/sp_head.h b/sql/sp_head.h index 5d3697da..60419007 100644 --- a/sql/sp_head.h +++ b/sql/sp_head.h @@ -232,7 +232,6 @@ class sp_head :private Query_arena */ uint32 unsafe_flags; - uint m_select_number; public: inline Stored_program_creation_ctx *get_creation_ctx() { @@ -522,8 +521,6 @@ class sp_head :private Query_arena sp_pcontext *get_parse_context() { return m_pcont; } - void set_select_number(uint num) { m_select_number= num; } - private: MEM_ROOT *m_thd_root; ///< Temp. store for thd's mem_root diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 503b65f2..07b0715d 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -5672,6 +5672,8 @@ static int merge_role_privileges(ACL_ROLE *role __attribute__((unused)), if (--grantee->counter) return 1; // don't recurse into grantee just yet + grantee->counter= 1; // Mark the grantee as merged. + /* if we'll do db/table/routine privileges, create a hash of role names */ role_hash_t role_hash(role_key); if (data->what != PRIVS_TO_MERGE::GLOBAL) @@ -6761,14 +6763,16 @@ static bool grant_load(THD *thd, TABLE_LIST *tables) DBUG_RETURN(return_val); } -static my_bool collect_leaf_roles(void *role_ptr, - void *roles_array) +static my_bool propagate_role_grants_action(void *role_ptr, + void *ptr __attribute__((unused))) { ACL_ROLE *role= static_cast(role_ptr); - Dynamic_array *array= - static_cast *>(roles_array); - if (!role->counter) - array->push(role); + if (role->counter) + return 0; + + mysql_mutex_assert_owner(&acl_cache->lock); + PRIVS_TO_MERGE data= { PRIVS_TO_MERGE::ALL, 0, 0 }; + traverse_role_graph_up(role, &data, NULL, merge_role_privileges); return 0; } @@ -6835,15 +6839,7 @@ bool grant_reload(THD *thd) } mysql_mutex_lock(&acl_cache->lock); - Dynamic_array leaf_roles; - my_hash_iterate(&acl_roles, collect_leaf_roles, &leaf_roles); - PRIVS_TO_MERGE data= { PRIVS_TO_MERGE::ALL, 0, 0 }; - for (size_t i= 0; i < leaf_roles.elements(); i++) - { - traverse_role_graph_up(leaf_roles.at(i), &data, NULL, - merge_role_privileges); - } - + my_hash_iterate(&acl_roles, propagate_role_grants_action, NULL); mysql_mutex_unlock(&acl_cache->lock); mysql_rwlock_unlock(&LOCK_grant); diff --git a/sql/sql_admin.cc b/sql/sql_admin.cc index 0888f012..98584ec4 100644 --- a/sql/sql_admin.cc +++ b/sql/sql_admin.cc @@ -663,8 +663,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, if (lock_type == TL_WRITE && !table->table->s->tmp_table && table->mdl_request.type > MDL_SHARED_WRITE) { - if (wait_while_table_is_used(thd, table->table, - HA_EXTRA_PREPARE_FOR_RENAME)) + if (wait_while_table_is_used(thd, table->table, HA_EXTRA_NOT_USED)) goto err; DEBUG_SYNC(thd, "after_admin_flush"); /* Flush entries in the query cache involving this table. */ diff --git a/sql/sql_base.cc b/sql/sql_base.cc index d3d33e04..01f40bb2 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -9215,7 +9215,16 @@ int init_ftfuncs(THD *thd, SELECT_LEX *select_lex, bool no_order) DBUG_PRINT("info",("Performing FULLTEXT search")); while ((ifm=li++)) - ifm->init_search(thd, no_order); +#if MYSQL_VERSION_ID < 100213 + if (unlikely(!ifm->fixed)) + /* + it mean that clause where was FT function was removed, so we have + to remove the function from the list. + */ + li.remove(); + else +#endif + ifm->init_search(thd, no_order); } return 0; } diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index 66ac2449..df6c7c35 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -1187,7 +1187,11 @@ void Query_cache::end_of_result(THD *thd) #endif if (try_lock(thd, Query_cache::WAIT)) + { + if (is_disabled()) + query_cache_tls->first_query_block= NULL; // do not try again with QC DBUG_VOID_RETURN; + } query_block= query_cache_tls->first_query_block; if (query_block) @@ -1552,6 +1556,8 @@ def_week_frmt: %lu, in_trans: %d, autocommit: %d", unlock(); + DEBUG_SYNC(thd, "wait_in_query_cache_store_query"); + // init_n_lock make query block locked BLOCK_UNLOCK_WR(query_block); } @@ -1788,7 +1794,7 @@ Query_cache::send_result_to_client(THD *thd, char *org_sql, uint query_length) sql++; continue; } - /* fall trough */ + /* fall through */ default: break; } @@ -2541,6 +2547,7 @@ void Query_cache::init() */ if (global_system_variables.query_cache_type == 0) { + m_cache_status= DISABLE_REQUEST; free_cache(); m_cache_status= DISABLED; } @@ -2749,13 +2756,17 @@ void Query_cache::make_disabled() This function frees all resources allocated by the cache. You have to call init_cache() before using the cache again. This function - requires the structure_guard_mutex to be locked. + requires the cache to be locked (LOCKED_NO_WAIT, lock_and_suspend) or + disabling. */ void Query_cache::free_cache() { DBUG_ENTER("Query_cache::free_cache"); + DBUG_ASSERT(m_cache_lock_status == LOCKED_NO_WAIT || + m_cache_status == DISABLE_REQUEST); + /* Destroy locks */ Query_cache_block *block= queries_blocks; if (block) @@ -2763,6 +2774,13 @@ void Query_cache::free_cache() do { Query_cache_query *query= block->query(); + /* + There will not be new requests but some maybe not finished yet, + so wait for them by trying lock/unlock + */ + BLOCK_LOCK_WR(block); + BLOCK_UNLOCK_WR(block); + mysql_rwlock_destroy(&query->lock); block= block->next; } while (block != queries_blocks); diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 2ebcea2d..e3b7b31b 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -2657,6 +2657,8 @@ void THD::nocheck_register_item_tree_change(Item **place, Item *old_value, MEM_ROOT *runtime_memroot) { Item_change_record *change; + DBUG_ENTER("THD::nocheck_register_item_tree_change"); + DBUG_PRINT("enter", ("Register %p <- %p", old_value, (*place))); /* Now we use one node per change, which adds some memory overhead, but still is rather fast as we use alloc_root for allocations. @@ -2669,12 +2671,13 @@ void THD::nocheck_register_item_tree_change(Item **place, Item *old_value, OOM, thd->fatal_error() is called by the error handler of the memroot. Just return. */ - return; + DBUG_VOID_RETURN; } change= new (change_mem) Item_change_record; change->place= place; change->old_value= old_value; change_list.append(change); + DBUG_VOID_RETURN; } /** @@ -2696,6 +2699,9 @@ void THD::check_and_register_item_tree_change(Item **place, Item **new_value, MEM_ROOT *runtime_memroot) { Item_change_record *change; + DBUG_ENTER("THD::check_and_register_item_tree_change"); + DBUG_PRINT("enter", ("Register: %p (%p) <- %p (%p)", + *place, place, *new_value, new_value)); I_List_iterator it(change_list); while ((change= it++)) { @@ -2705,6 +2711,7 @@ void THD::check_and_register_item_tree_change(Item **place, Item **new_value, if (change) nocheck_register_item_tree_change(place, change->old_value, runtime_memroot); + DBUG_VOID_RETURN; } @@ -2712,13 +2719,13 @@ void THD::rollback_item_tree_changes() { I_List_iterator it(change_list); Item_change_record *change; - DBUG_ENTER("rollback_item_tree_changes"); while ((change= it++)) + { *change->place= change->old_value; + } /* We can forget about changes memory: it's allocated in runtime memroot */ change_list.empty(); - DBUG_VOID_RETURN; } @@ -3647,7 +3654,7 @@ void Statement::set_statement(Statement *stmt) { id= stmt->id; mark_used_columns= stmt->mark_used_columns; - lex= stmt->lex; + stmt_lex= lex= stmt->lex; query_string= stmt->query_string; } diff --git a/sql/sql_class.h b/sql/sql_class.h index 4556487b..91030145 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -1027,6 +1027,21 @@ 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 @@ -1177,6 +1192,29 @@ typedef struct st_xid_state { /* Error reported by the Resource Manager (RM) to the Transaction Manager. */ uint rm_error; XID_cache_element *xid_cache_element; + + /** + Check that XA transaction has an uncommitted work. Report an error + to the user in case when there is an uncommitted work for XA transaction. + + @return result of check + @retval false XA transaction is NOT in state IDLE, PREPARED + or ROLLBACK_ONLY. + @retval true XA transaction is in state IDLE or PREPARED + or ROLLBACK_ONLY. + */ + + bool check_has_uncommitted_xa() const + { + if (xa_state == XA_IDLE || + xa_state == XA_PREPARED || + xa_state == XA_ROLLBACK_ONLY) + { + my_error(ER_XAER_RMFAIL, MYF(0), xa_state_names[xa_state]); + return true; + } + return false; + } } XID_STATE; void xid_cache_init(void); @@ -2690,7 +2728,6 @@ class THD :public Statement, uint tmp_table, global_disable_checkpoint; uint server_status,open_options; enum enum_thread_type system_thread; - uint select_number; //number of select (used for EXPLAIN) /* Current or next transaction isolation level. When a connection is established, the value is taken from @@ -3399,10 +3436,14 @@ class THD :public Statement, void change_item_tree(Item **place, Item *new_value) { + DBUG_ENTER("THD::change_item_tree"); + DBUG_PRINT("enter", ("Register: %p (%p) <- %p", + *place, place, new_value)); /* TODO: check for OOM condition here */ if (!stmt_arena->is_conventional()) nocheck_register_item_tree_change(place, *place, mem_root); *place= new_value; + DBUG_VOID_RETURN; } /** Make change in item tree after checking whether it needs registering diff --git a/sql/sql_cursor.cc b/sql/sql_cursor.cc index a8c5569b..69781b5d 100644 --- a/sql/sql_cursor.cc +++ b/sql/sql_cursor.cc @@ -211,7 +211,7 @@ void Server_side_cursor::operator delete(void *ptr, size_t size) MEM_ROOT own_root= *cursor->mem_root; DBUG_ENTER("Server_side_cursor::operator delete"); - TRASH(ptr, size); + TRASH_FREE(ptr, size); /* If this cursor has never been opened mem_root is empty. Otherwise mem_root points to the memory the cursor object was allocated in. diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index 5a0879c2..b29e676b 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -362,9 +362,16 @@ bool mysql_derived_merge(THD *thd, LEX *lex, TABLE_LIST *derived) SELECT_LEX *parent_lex= derived->select_lex; Query_arena *arena, backup; DBUG_ENTER("mysql_derived_merge"); + DBUG_PRINT("enter", ("Alias: '%s' Unit: %p", + (derived->alias ? derived->alias : ""), + derived->get_unit())); if (derived->merged) + { + + DBUG_PRINT("info", ("Irreversibly merged: exit")); DBUG_RETURN(FALSE); + } if (dt_select->uncacheable & UNCACHEABLE_RAND) { @@ -510,7 +517,9 @@ bool mysql_derived_merge(THD *thd, LEX *lex, TABLE_LIST *derived) bool mysql_derived_merge_for_insert(THD *thd, LEX *lex, TABLE_LIST *derived) { DBUG_ENTER("mysql_derived_merge_for_insert"); - DBUG_PRINT("enter", ("derived: %p", derived)); + DBUG_PRINT("enter", ("Alias: '%s' Unit: %p", + (derived->alias ? derived->alias : ""), + derived->get_unit())); DBUG_PRINT("info", ("merged_for_insert: %d is_materialized_derived: %d " "is_multitable: %d single_table_updatable: %d " "merge_underlying_list: %d", @@ -566,7 +575,9 @@ bool mysql_derived_init(THD *thd, LEX *lex, TABLE_LIST *derived) { SELECT_LEX_UNIT *unit= derived->get_unit(); DBUG_ENTER("mysql_derived_init"); - DBUG_PRINT("enter", ("derived: %p", derived)); + DBUG_PRINT("enter", ("Alias: '%s' Unit: %p", + (derived->alias ? derived->alias : ""), + derived->get_unit())); // Skip already prepared views/DT if (!unit || unit->prepared) @@ -637,8 +648,9 @@ bool mysql_derived_prepare(THD *thd, LEX *lex, TABLE_LIST *derived) SELECT_LEX_UNIT *unit= derived->get_unit(); DBUG_ENTER("mysql_derived_prepare"); bool res= FALSE; - DBUG_PRINT("enter", ("unit: %p table_list: %p Alias '%s'", - unit, derived, derived->alias)); + DBUG_PRINT("enter", ("Alias: '%s' Unit: %p", + (derived->alias ? derived->alias : ""), + unit)); // Skip already prepared views/DT if (!unit || unit->prepared || @@ -669,6 +681,17 @@ bool mysql_derived_prepare(THD *thd, LEX *lex, TABLE_LIST *derived) } unit->derived= derived; + + /* + Above cascade call of prepare is important for PS protocol, but after it + is called we can check if we really need prepare for this derived + */ + if (derived->merged) + { + DBUG_PRINT("info", ("Irreversibly merged: exit")); + DBUG_RETURN(FALSE); + } + derived->fill_me= FALSE; if (!(derived->derived_result= new (thd->mem_root) select_union(thd))) @@ -795,6 +818,14 @@ bool mysql_derived_optimize(THD *thd, LEX *lex, TABLE_LIST *derived) bool res= FALSE; DBUG_ENTER("mysql_derived_optimize"); + DBUG_PRINT("enter", ("Alias: '%s' Unit: %p", + (derived->alias ? derived->alias : ""), + derived->get_unit())); + if (derived->merged) + { + DBUG_PRINT("info", ("Irreversibly merged: exit")); + DBUG_RETURN(FALSE); + } if (unit->optimized) DBUG_RETURN(FALSE); @@ -860,6 +891,9 @@ bool mysql_derived_optimize(THD *thd, LEX *lex, TABLE_LIST *derived) bool mysql_derived_create(THD *thd, LEX *lex, TABLE_LIST *derived) { DBUG_ENTER("mysql_derived_create"); + DBUG_PRINT("enter", ("Alias: '%s' Unit: %p", + (derived->alias ? derived->alias : ""), + derived->get_unit())); TABLE *table= derived->table; SELECT_LEX_UNIT *unit= derived->get_unit(); @@ -909,9 +943,13 @@ bool mysql_derived_create(THD *thd, LEX *lex, TABLE_LIST *derived) bool mysql_derived_fill(THD *thd, LEX *lex, TABLE_LIST *derived) { - DBUG_ENTER("mysql_derived_fill"); + Field_iterator_table field_iterator; SELECT_LEX_UNIT *unit= derived->get_unit(); bool res= FALSE; + DBUG_ENTER("mysql_derived_fill"); + DBUG_PRINT("enter", ("Alias: '%s' Unit: %p", + (derived->alias ? derived->alias : ""), + derived->get_unit())); if (unit->executed && !unit->uncacheable && !unit->describe) DBUG_RETURN(FALSE); @@ -951,7 +989,27 @@ bool mysql_derived_fill(THD *thd, LEX *lex, TABLE_LIST *derived) if (derived_result->flush()) res= TRUE; unit->executed= TRUE; + + if (derived->field_translation) + { + /* reset translation table to materialized table */ + field_iterator.set_table(derived->table); + for (uint i= 0; + !field_iterator.end_of_fields(); + field_iterator.next(), i= i + 1) + { + Item *item; + + if (!(item= field_iterator.create_item(thd))) + { + res= TRUE; + break; + } + thd->change_item_tree(&derived->field_translation[i].item, item); + } + } } + if (res || !lex->describe) unit->cleanup(); lex->current_select= save_current_select; @@ -980,6 +1038,9 @@ bool mysql_derived_fill(THD *thd, LEX *lex, TABLE_LIST *derived) bool mysql_derived_reinit(THD *thd, LEX *lex, TABLE_LIST *derived) { DBUG_ENTER("mysql_derived_reinit"); + DBUG_PRINT("enter", ("Alias: '%s' Unit: %p", + (derived->alias ? derived->alias : ""), + derived->get_unit())); st_select_lex_unit *unit= derived->get_unit(); derived->merged_for_insert= FALSE; diff --git a/sql/sql_explain.h b/sql/sql_explain.h index 4d0ba38d..caacf6b3 100644 --- a/sql/sql_explain.h +++ b/sql/sql_explain.h @@ -208,6 +208,9 @@ class Explain_select : public Explain_basic_join Explain_select(MEM_ROOT *root, bool is_analyze) : Explain_basic_join(root), +#ifndef DBUG_OFF + select_lex(NULL), +#endif message(NULL), having(NULL), having_value(Item::COND_UNDEF), using_temporary(false), using_filesort(false), @@ -222,6 +225,9 @@ class Explain_select : public Explain_basic_join void replace_table(uint idx, Explain_table_access *new_tab); public: +#ifndef DBUG_OFF + SELECT_LEX *select_lex; +#endif const char *select_type; /* diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index c3986059..0a9ce00c 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2016, Oracle and/or its affiliates. - Copyright (c) 2010, 2016, MariaDB + 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 diff --git a/sql/sql_join_cache.cc b/sql/sql_join_cache.cc index 75e69298..4b7667f1 100644 --- a/sql/sql_join_cache.cc +++ b/sql/sql_join_cache.cc @@ -394,7 +394,7 @@ void JOIN_CACHE::create_flag_fields() TABLE *table= tab->table; /* Create a field for the null bitmap from table if needed */ - if (tab->used_null_fields || tab->used_uneven_bit_fields) + if (tab->used_null_fields || tab->used_uneven_bit_fields) length+= add_flag_field_to_join_cache(table->null_flags, table->s->null_bytes, ©); diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 63ab6b5d..3fa5ec71 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2014, Oracle and/or its affiliates. - Copyright (c) 2009, 2017, 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 @@ -657,6 +657,7 @@ 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)); lex->thd= lex->unit.thd= thd; @@ -668,6 +669,7 @@ void lex_start(THD *thd) /* 'parent_lex' is used in init_query() so it must be before it. */ lex->select_lex.parent_lex= lex; lex->select_lex.init_query(); + lex->current_select_number= 1; lex->value_list.empty(); lex->update_list.empty(); lex->set_var_list.empty(); diff --git a/sql/sql_lex.h b/sql/sql_lex.h index b57fba08..4fcd090e 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2015, Oracle and/or its affiliates. - Copyright (c) 2010, 2016, MariaDB + 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 @@ -502,7 +502,7 @@ class st_select_lex_node { } static void *operator new(size_t size, MEM_ROOT *mem_root) throw () { return (void*) alloc_root(mem_root, (uint) size); } - static void operator delete(void *ptr,size_t size) { TRASH(ptr, size); } + static void operator delete(void *ptr,size_t size) { TRASH_FREE(ptr, size); } static void operator delete(void *ptr, MEM_ROOT *mem_root) {} // Ensures that at least all members used during cleanup() are initialized. @@ -727,7 +727,13 @@ class st_select_lex: public st_select_lex_node Item *prep_having;/* saved HAVING clause for prepared statement processing */ /* Saved values of the WHERE and HAVING clauses*/ Item::cond_result cond_value, having_value; - /* point on lex in which it was created, used in view subquery detection */ + /* + 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) + and use st_select_lex::parent_lex & st_select_lex::parent_stmt_lex + instead of global (from THD) references where it is possible. + */ LEX *parent_lex; enum olap_type olap; /* FROM clause - points to the beginning of the TABLE_LIST::next_local list. */ @@ -2452,7 +2458,7 @@ struct LEX: public Query_tables_list /** SELECT of CREATE VIEW statement */ LEX_STRING create_view_select; - uint number_of_selects; // valid only for view + uint current_select_number; // valid for statment LEX (not view) /** Start of 'ON table', in trigger statements. */ const char* raw_trg_on_table_name_begin; diff --git a/sql/sql_lifo_buffer.h b/sql/sql_lifo_buffer.h index 8fa13c66..17024d15 100644 --- a/sql/sql_lifo_buffer.h +++ b/sql/sql_lifo_buffer.h @@ -84,7 +84,7 @@ class Lifo_buffer start= start_arg; end= end_arg; if (end != start) - TRASH(start, end - start); + TRASH_ALLOC(start, end - start); reset(); } @@ -224,7 +224,7 @@ class Forward_lifo_buffer: public Lifo_buffer { DBUG_ASSERT(unused_end >= unused_start); DBUG_ASSERT(end == unused_start); - TRASH(unused_start, unused_end - unused_start); + TRASH_ALLOC(unused_start, unused_end - unused_start); end= unused_end; } /* Return pointer to start of the memory area that is occupied by the data */ diff --git a/sql/sql_list.h b/sql/sql_list.h index 6f01b64d..7fb9c19d 100644 --- a/sql/sql_list.h +++ b/sql/sql_list.h @@ -41,12 +41,12 @@ class Sql_alloc { return alloc_root(mem_root, size); } static void *operator new(size_t size, MEM_ROOT *mem_root) throw () { return alloc_root(mem_root, size); } - static void operator delete(void *ptr, size_t size) { TRASH(ptr, size); } + static void operator delete(void *ptr, size_t size) { TRASH_FREE(ptr, size); } static void operator delete(void *ptr, MEM_ROOT *mem_root) { /* never called */ } static void operator delete[](void *ptr, MEM_ROOT *mem_root) { /* never called */ } - static void operator delete[](void *ptr, size_t size) { TRASH(ptr, size); } + static void operator delete[](void *ptr, size_t size) { TRASH_FREE(ptr, size); } #ifdef HAVE_valgrind bool dummy_for_valgrind; inline Sql_alloc() :dummy_for_valgrind(0) {} diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 6084c59a..4dd8d9e1 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -6903,7 +6903,12 @@ void THD::reset_for_next_command(bool do_clear_error) clear_error(1); thd->free_list= 0; - thd->select_number= 1; + /* + 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)); /* Those two lines below are theoretically unneeded as THD::cleanup_after_query() should take care of this already. @@ -7021,7 +7026,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->select_number; + select_lex->select_number= ++thd->stmt_lex->current_select_number; select_lex->parent_lex= lex; /* Used in init_query. */ select_lex->init_query(); select_lex->init_select(); diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 941182dd..13e5f166 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -4709,7 +4709,12 @@ uint prep_alter_part_table(THD *thd, TABLE *table, Alter_info *alter_info, DBUG_RETURN(TRUE); } - thd->work_part_info= thd->lex->part_info; + /* + One of these is done in handle_if_exists_option(): + thd->work_part_info= thd->lex->part_info; + or + thd->work_part_info= NULL; + */ if (thd->work_part_info && !(thd->work_part_info= thd->work_part_info->get_clone(thd))) diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index 3a409773..d57137b3 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -487,6 +487,11 @@ static st_plugin_dl *plugin_dl_insert_or_reuse(struct st_plugin_dl *plugin_dl) sizeof(struct st_plugin_dl)); DBUG_RETURN(tmp); } +#else +static struct st_plugin_dl *plugin_dl_find(const LEX_STRING *) +{ + return 0; +} #endif /* HAVE_DLOPEN */ diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index e5b85c3b..b515578e 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -164,20 +164,6 @@ class Prepared_statement: public Statement uint param_count; uint last_errno; uint flags; - /* - The value of thd->select_number at the end of the PREPARE phase. - - The issue is: each statement execution opens VIEWs, which may cause - select_lex objects to be created, and select_number values to be assigned. - - On the other hand, PREPARE assigns select_number values for triggers and - subqueries. - - In order for select_number values from EXECUTE not to conflict with - select_number values from PREPARE, we keep the number and set it at each - execution. - */ - uint select_number_after_prepare; char last_error[MYSQL_ERRMSG_SIZE]; #ifndef EMBEDDED_LIBRARY bool (*set_params)(Prepared_statement *st, uchar *data, uchar *data_end, @@ -3563,9 +3549,9 @@ void Prepared_statement::cleanup_stmt() DBUG_ENTER("Prepared_statement::cleanup_stmt"); DBUG_PRINT("enter",("stmt: 0x%lx", (long) this)); thd->restore_set_statement_var(); + thd->rollback_item_tree_changes(); cleanup_items(free_list); thd->cleanup_after_query(); - thd->rollback_item_tree_changes(); DBUG_VOID_RETURN; } @@ -3649,6 +3635,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; if (set_db(thd->db, thd->db_length)) DBUG_RETURN(TRUE); @@ -3754,8 +3741,6 @@ bool Prepared_statement::prepare(const char *packet, uint packet_len) trans_rollback_implicit(thd); thd->mdl_context.release_transactional_locks(); } - - select_number_after_prepare= thd->select_number; /* Preserve CHANGE MASTER attributes */ lex_end_stage1(lex); @@ -3891,7 +3876,6 @@ Prepared_statement::execute_loop(String *expanded_query, */ DBUG_ASSERT(thd->free_list == NULL); - thd->select_number= select_number_after_prepare; /* Check if we got an error when sending long data */ if (state == Query_arena::STMT_ERROR) { diff --git a/sql/sql_select.cc b/sql/sql_select.cc index b9fe8f31..067c7120 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.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 @@ -291,6 +291,11 @@ JOIN_TAB *next_depth_first_tab(JOIN* join, JOIN_TAB* tab); static JOIN_TAB *next_breadth_first_tab(JOIN_TAB *first_top_tab, uint n_top_tabs_count, JOIN_TAB *tab); +static bool +find_order_in_list(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables, + ORDER *order, List &fields, List &all_fields, + bool is_group_field, bool add_to_all_fields); + static double table_cond_selectivity(JOIN *join, uint idx, JOIN_TAB *s, table_map rem_tables); @@ -344,7 +349,6 @@ bool dbug_user_var_equals_int(THD *thd, const char *name, int value) } #endif - /** This handles SELECT with and without UNION. */ @@ -708,6 +712,9 @@ JOIN::prepare(Item ***rref_pointer_array, join_list= &select_lex->top_join_list; union_part= unit_arg->is_union(); + // simple check that we got usable conds + dbug_print_item(conds); + if (select_lex->handle_derived(thd->lex, DT_PREPARE)) DBUG_RETURN(1); @@ -810,9 +817,15 @@ JOIN::prepare(Item ***rref_pointer_array, if (skip_order_by && select_lex != select_lex->master_unit()->global_parameters()) { - if (setup_order(thd, (*rref_pointer_array), tables_list, fields_list, - all_fields, select_lex->order_list.first)) - DBUG_RETURN(-1); + thd->where= "order clause"; + for (ORDER *order= select_lex->order_list.first; order; order= order->next) + { + /* Don't add the order items to all fields. Just resolve them to ensure + the query is valid, we'll drop them immediately after. */ + if (find_order_in_list(thd, *rref_pointer_array, tables_list, order, + fields_list, all_fields, false, false)) + DBUG_RETURN(-1); + } select_lex->order_list.empty(); } @@ -2323,8 +2336,11 @@ bool JOIN::shrink_join_buffers(JOIN_TAB *jt, ulonglong curr_space, ulonglong needed_space) { + JOIN_TAB *tab; JOIN_CACHE *cache; - for (JOIN_TAB *tab= join_tab+const_tables; tab < jt; tab++) + for (tab= first_linear_tab(this, WITHOUT_BUSH_ROOTS, WITHOUT_CONST_TABLES); + tab != jt; + tab= next_linear_tab(this, tab, WITHOUT_BUSH_ROOTS)) { cache= tab->cache; if (cache) @@ -2462,6 +2478,17 @@ void JOIN::save_explain_data(Explain_query *output, bool can_overwrite, bool need_tmp_table, bool need_order, bool distinct) { + /* + If there is SELECT in this statemet with the same number it must be the + same SELECT + */ + DBUG_ASSERT(select_lex->select_number == UINT_MAX || + select_lex->select_number == INT_MAX || + !output || + !output->get_select(select_lex->select_number) || + output->get_select(select_lex->select_number)->select_lex == + select_lex); + if (select_lex->select_number != UINT_MAX && select_lex->select_number != INT_MAX /* this is not a UNION's "fake select */ && have_query_plan != JOIN::QEP_NOT_PRESENT_YET && @@ -10439,7 +10466,7 @@ void JOIN::drop_unused_derived_keys() tmp_tbl->use_index(tab->ref.key); if (tmp_tbl->s->keys) { - if (tab->ref.key >= 0) + if (tab->ref.key >= 0 && tab->ref.key < MAX_KEY) tab->ref.key= 0; else tmp_tbl->s->keys= 0; @@ -12258,8 +12285,8 @@ static void update_depend_map(JOIN *join) uint i; for (i=0 ; i < ref->key_parts ; i++,item++) depend_map|=(*item)->used_tables(); - ref->depend_map=depend_map & ~OUTER_REF_TABLE_BIT; depend_map&= ~OUTER_REF_TABLE_BIT; + ref->depend_map= depend_map; for (JOIN_TAB **tab=join->map2table; depend_map ; tab++,depend_map>>=1 ) @@ -12634,7 +12661,7 @@ class COND_CMP :public ilink { } static void operator delete(void *ptr __attribute__((unused)), size_t size __attribute__((unused))) - { TRASH(ptr, size); } + { TRASH_FREE(ptr, size); } Item *and_level; Item_bool_func2 *cmp_func; @@ -15633,9 +15660,10 @@ COND * Item_func_isnull::remove_eq_conds(THD *thd, Item::cond_result *cond_value, bool top_level_arg) { - if (args[0]->type() == Item::FIELD_ITEM) + Item *real_item= args[0]->real_item(); + if (real_item->type() == Item::FIELD_ITEM) { - Field *field= ((Item_field*) args[0])->field; + Field *field= ((Item_field*) real_item)->field; if (((field->type() == MYSQL_TYPE_DATE) || (field->type() == MYSQL_TYPE_DATETIME)) && @@ -16841,7 +16869,7 @@ create_tmp_table(THD *thd, TMP_TABLE_PARAM *param, List &fields, field->set_notnull(); memcpy(field->ptr, orig_field->ptr_in_record(orig_field->table->s->default_values), - field->pack_length()); + field->pack_length_in_rec()); } } @@ -22133,7 +22161,10 @@ cp_buffer_from_ref(THD *thd, TABLE *table, TABLE_REF *ref) SELECT list) @param[in,out] all_fields All select, group and order by fields @param[in] is_group_field True if order is a GROUP field, false if - ORDER by field + ORDER by field + @param[in] add_to_all_fields If the item is to be added to all_fields and + ref_pointer_array, this flag can be set to + false to stop the automatic insertion. @retval FALSE if OK @@ -22144,7 +22175,7 @@ cp_buffer_from_ref(THD *thd, TABLE *table, TABLE_REF *ref) static bool find_order_in_list(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables, ORDER *order, List &fields, List &all_fields, - bool is_group_field) + bool is_group_field, bool add_to_all_fields) { Item *order_item= *order->item; /* The item from the GROUP/ORDER caluse. */ Item::Type order_item_type; @@ -22268,6 +22299,9 @@ find_order_in_list(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables, thd->is_error())) return TRUE; /* Wrong field. */ + if (!add_to_all_fields) + return FALSE; + uint el= all_fields.elements; DBUG_ASSERT(all_fields.elements <= thd->lex->current_select->ref_pointer_array_size); @@ -22298,13 +22332,13 @@ find_order_in_list(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables, */ int setup_order(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables, - List &fields, List &all_fields, ORDER *order) + List &fields, List &all_fields, ORDER *order) { thd->where="order clause"; for (; order; order=order->next) { if (find_order_in_list(thd, ref_pointer_array, tables, order, fields, - all_fields, FALSE)) + all_fields, FALSE, true)) return 1; } return 0; @@ -22356,7 +22390,7 @@ setup_group(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables, for (ord= order; ord; ord= ord->next) { if (find_order_in_list(thd, ref_pointer_array, tables, ord, fields, - all_fields, TRUE)) + all_fields, TRUE, true)) return 1; (*ord->item)->marker= UNDEF_POS; /* Mark found */ if ((*ord->item)->with_sum_func) @@ -22675,6 +22709,7 @@ get_sort_by_table(ORDER *a,ORDER *b, List &tables, if (!map || (map & (RAND_TABLE_BIT | OUTER_REF_TABLE_BIT))) DBUG_RETURN(0); + map&= ~const_tables; while ((table= ti++) && !(map & table->table->map)) ; if (map != table->table->map) DBUG_RETURN(0); // More than one table @@ -24601,6 +24636,11 @@ int JOIN::save_explain_data_intern(Explain_query *output, bool need_tmp_table, { explain= new (output->mem_root) Explain_select(output->mem_root, thd->lex->analyze_stmt); + if (!explain) + DBUG_RETURN(1); // EoM +#ifndef DBUG_OFF + explain->select_lex= select_lex; +#endif join->select_lex->set_explain_type(true); explain->select_id= join->select_lex->select_number; diff --git a/sql/sql_select.h b/sql/sql_select.h index 7b9c0382..8c55528e 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -1839,7 +1839,7 @@ SORT_FIELD *make_unireg_sortorder(THD *thd, JOIN *join, ORDER *order, uint *length, SORT_FIELD *sortorder); int setup_order(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables, - List &fields, List &all_fields, ORDER *order); + List &fields, List &all_fields, ORDER *order); int setup_group(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables, List &fields, List &all_fields, ORDER *order, bool *hidden_group_fields); diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 2c02f932..5a78a27a 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -2414,7 +2414,7 @@ class thread_info :public ilink { { return alloc_root(mem_root, size); } static void operator delete(void *ptr __attribute__((unused)), size_t size __attribute__((unused))) - { TRASH(ptr, size); } + { TRASH_FREE(ptr, size); } ulong thread_id; uint32 os_thread_id; diff --git a/sql/sql_string.h b/sql/sql_string.h index 51a11c7a..b8979d39 100644 --- a/sql/sql_string.h +++ b/sql/sql_string.h @@ -149,7 +149,7 @@ class String { (void) ptr_arg; (void) size; - TRASH(ptr_arg, size); + TRASH_FREE(ptr_arg, size); } static void operator delete(void *, MEM_ROOT *) { /* never called */ } diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 277d8370..44df4bba 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -1829,7 +1829,8 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) #endif /* Write shadow frm file */ lpt->create_info->table_options= lpt->db_options; - LEX_CUSTRING frm= build_frm_image(lpt->thd, lpt->table_name, + LEX_CUSTRING frm= build_frm_image(lpt->thd, + lpt->table_name, lpt->create_info, lpt->alter_info->create_list, lpt->key_count, lpt->key_info_buffer, @@ -6037,6 +6038,7 @@ handle_if_exists_options(THD *thd, TABLE *table, Alter_info *alter_info) #ifdef WITH_PARTITION_STORAGE_ENGINE partition_info *tab_part_info= table->part_info; + thd->work_part_info= thd->lex->part_info; if (tab_part_info) { /* ALTER TABLE ADD PARTITION IF NOT EXISTS */ @@ -6057,7 +6059,7 @@ handle_if_exists_options(THD *thd, TABLE *table, Alter_info *alter_info) ER_THD(thd, ER_SAME_NAME_PARTITION), pe->partition_name); alter_info->flags&= ~Alter_info::ALTER_ADD_PARTITION; - thd->lex->part_info= NULL; + thd->work_part_info= NULL; break; } } @@ -9679,11 +9681,12 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, if ((int) key_nr >= 0) { const char *err_msg= ER_THD(thd, ER_DUP_ENTRY_WITH_KEY_NAME); - if (key_nr == 0 && + if (key_nr == 0 && to->s->keys > 0 && (to->key_info[0].key_part[0].field->flags & AUTO_INCREMENT_FLAG)) err_msg= ER_THD(thd, ER_DUP_ENTRY_AUTOINCREMENT_CASE); - print_keydup_error(to, key_nr == MAX_KEY ? NULL : + print_keydup_error(to, + key_nr >= to->s->keys ? NULL : &to->key_info[key_nr], err_msg, MYF(0)); } diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index 0b4978b2..70e9b36c 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -1373,12 +1373,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, lex; + LEX *old_lex= thd->lex, *old_stmt_lex= thd->stmt_lex; + LEX lex; sp_rcontext *save_spcont= thd->spcont; ulonglong save_sql_mode= thd->variables.sql_mode; LEX_STRING *on_table_name; - thd->lex= &lex; + thd->lex= thd->stmt_lex= &lex; save_db.str= thd->db; save_db.length= thd->db_length; @@ -1577,6 +1578,7 @@ 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; @@ -1589,6 +1591,7 @@ 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_union.cc b/sql/sql_union.cc index 9d825f55..e12cae0f 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -1093,22 +1093,6 @@ bool st_select_lex_unit::cleanup() void st_select_lex_unit::reinit_exec_mechanism() { prepared= optimized= executed= 0; -#ifndef DBUG_OFF - if (is_union()) - { - List_iterator_fast it(item_list); - Item *field; - while ((field= it++)) - { - /* - we can't cleanup here, because it broke link to temporary table field, - but have to drop fixed flag to allow next fix_field of this field - during re-executing - */ - field->fixed= 0; - } - } -#endif } diff --git a/sql/sql_update.cc b/sql/sql_update.cc index e1d22e6a..db9f9013 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -701,6 +701,8 @@ int mysql_update(THD *thd, if (reinit_io_cache(&tempfile,READ_CACHE,0L,0,0)) error=1; /* purecov: inspected */ select->file=tempfile; // Read row ptrs from this file + // select->file was copied, update self-references. + setup_io_cache(&select->file); if (error >= 0) goto err; } diff --git a/sql/sql_view.cc b/sql/sql_view.cc index 0f088836..1bdc76a6 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -1187,8 +1187,6 @@ bool mysql_make_view(THD *thd, TABLE_SHARE *share, TABLE_LIST *table, */ mysql_derived_reinit(thd, NULL, table); - thd->select_number+= table->view->number_of_selects; - DEBUG_SYNC(thd, "after_cached_view_opened"); DBUG_RETURN(0); } @@ -1343,7 +1341,7 @@ bool mysql_make_view(THD *thd, TABLE_SHARE *share, TABLE_LIST *table, lex_start(thd); view_select= &lex->select_lex; - view_select->select_number= ++thd->select_number; + view_select->select_number= ++thd->stmt_lex->current_select_number; ulonglong saved_mode= thd->variables.sql_mode; /* switch off modes which can prevent normal parsing of VIEW @@ -1377,9 +1375,6 @@ bool mysql_make_view(THD *thd, TABLE_SHARE *share, TABLE_LIST *table, parse_status= parse_sql(thd, & parser_state, table->view_creation_ctx); - lex->number_of_selects= - (thd->select_number - view_select->select_number) + 1; - /* Restore environment. */ if ((old_lex->sql_command == SQLCOM_SHOW_FIELDS) || diff --git a/sql/table.cc b/sql/table.cc index 6b1ae3d0..ea0bc8f5 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1340,9 +1340,10 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, extra_rec_buf_length= uint2korr(frm_image+59); rec_buff_length= ALIGN_SIZE(share->reclength + 1 + extra_rec_buf_length); share->rec_buff_length= rec_buff_length; - if (!(record= (uchar *) alloc_root(&share->mem_root, - rec_buff_length))) + if (!(record= (uchar *) alloc_root(&share->mem_root, rec_buff_length))) goto err; /* purecov: inspected */ + MEM_NOACCESS(record, rec_buff_length); + MEM_UNDEFINED(record, share->reclength); share->default_values= record; memcpy(record, frm_image + record_offset, share->reclength); @@ -2685,6 +2686,7 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share, if (!(record= (uchar*) alloc_root(&outparam->mem_root, share->rec_buff_length * records))) goto err; /* purecov: inspected */ + MEM_NOACCESS(record, share->rec_buff_length * records); if (records == 0) { @@ -2699,6 +2701,8 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share, else outparam->record[1]= outparam->record[0]; // Safety } + MEM_UNDEFINED(outparam->record[0], share->reclength); + MEM_UNDEFINED(outparam->record[1], share->reclength); if (!(field_ptr = (Field **) alloc_root(&outparam->mem_root, (uint) ((share->fields+1)* @@ -4260,6 +4264,9 @@ bool TABLE_LIST::create_field_translation(THD *thd) Query_arena *arena, backup; bool res= FALSE; DBUG_ENTER("TABLE_LIST::create_field_translation"); + DBUG_PRINT("enter", ("Alias: '%s' Unit: %p", + (alias ? alias : ""), + get_unit())); if (thd->stmt_arena->is_conventional() || thd->stmt_arena->is_stmt_prepare_or_first_sp_execute()) diff --git a/sql/table.h b/sql/table.h index 7d9b5292..5abb99cd 100644 --- a/sql/table.h +++ b/sql/table.h @@ -2287,6 +2287,9 @@ struct TABLE_LIST inline void set_merged_derived() { DBUG_ENTER("set_merged_derived"); + DBUG_PRINT("enter", ("Alias: '%s' Unit: %p", + (alias ? alias : ""), + get_unit())); derived_type= ((derived_type & DTYPE_MASK) | DTYPE_TABLE | DTYPE_MERGE); set_check_merged(); @@ -2299,6 +2302,9 @@ struct TABLE_LIST void set_materialized_derived() { DBUG_ENTER("set_materialized_derived"); + DBUG_PRINT("enter", ("Alias: '%s' Unit: %p", + (alias ? alias : ""), + get_unit())); derived_type= ((derived_type & (derived ? DTYPE_MASK : DTYPE_VIEW)) | DTYPE_TABLE | DTYPE_MATERIALIZE); set_check_materialized(); diff --git a/sql/transaction.cc b/sql/transaction.cc index f03cced7..1744feea 100644 --- a/sql/transaction.cc +++ b/sql/transaction.cc @@ -536,12 +536,8 @@ bool trans_savepoint(THD *thd, LEX_STRING name) !opt_using_transactions) DBUG_RETURN(FALSE); - enum xa_states xa_state= thd->transaction.xid_state.xa_state; - if (xa_state != XA_NOTR && xa_state != XA_ACTIVE) - { - my_error(ER_XAER_RMFAIL, MYF(0), xa_state_names[xa_state]); + if (thd->transaction.xid_state.check_has_uncommitted_xa()) DBUG_RETURN(TRUE); - } sv= find_savepoint(thd, name); @@ -616,12 +612,8 @@ bool trans_rollback_to_savepoint(THD *thd, LEX_STRING name) DBUG_RETURN(TRUE); } - enum xa_states xa_state= thd->transaction.xid_state.xa_state; - if (xa_state != XA_NOTR) - { - my_error(ER_XAER_RMFAIL, MYF(0), xa_state_names[xa_state]); + if (thd->transaction.xid_state.check_has_uncommitted_xa()) DBUG_RETURN(TRUE); - } /** Checking whether it is safe to release metadata locks acquired after diff --git a/sql/unireg.cc b/sql/unireg.cc index 66959f40..e41cca2d 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2011, Oracle and/or its affiliates. - Copyright (c) 2009, 2013, Monty Program Ab. + 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 @@ -83,7 +83,7 @@ static uchar *extra2_write(uchar *pos, enum extra2_frm_value_type type, return extra2_write(pos, type, reinterpret_cast(str)); } -/** +/* Create a frm (table definition) file @param thd Thread handler @@ -160,7 +160,8 @@ LEX_CUSTRING build_frm_image(THD *thd, const char *table, DBUG_PRINT("info", ("Options length: %u", options_len)); if (validate_comment_length(thd, &create_info->comment, TABLE_COMMENT_MAXLEN, - ER_TOO_LONG_TABLE_COMMENT, table)) + ER_TOO_LONG_TABLE_COMMENT, + table)) DBUG_RETURN(frm); /* If table comment is longer than TABLE_COMMENT_INLINE_MAXLEN bytes, @@ -263,6 +264,14 @@ LEX_CUSTRING build_frm_image(THD *thd, const char *table, DBUG_ASSERT(pos == frm_ptr + uint2korr(fileinfo+6)); key_info_length= pack_keys(pos, keys, key_info, data_offset); + if (key_info_length > UINT_MAX16) + { + my_printf_error(ER_CANT_CREATE_TABLE, + "Cannot create table %`s: index information is too long. " + "Decrease number of indexes or use shorter index names or shorter comments.", + MYF(0), table); + goto err; + } int2store(forminfo+2, frm.length - filepos); int4store(fileinfo+10, frm.length); diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index bdc84910..285bb520 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -1227,6 +1227,16 @@ int wsrep_to_buf_helper( if (!ret && writer.write(>id_ev)) ret= 1; } #endif /* GTID_SUPPORT */ + if (wsrep_gtid_mode && thd->variables.gtid_seq_no) + { + Gtid_log_event gtid_event(thd, thd->variables.gtid_seq_no, + thd->variables.gtid_domain_id, + true, LOG_EVENT_SUPPRESS_USE_F, + true, 0); + gtid_event.server_id= thd->variables.server_id; + if (!gtid_event.is_valid()) ret= 0; + ret= writer.write(>id_event); + } /* if there is prepare query, add event for it */ if (!ret && thd->wsrep_TOI_pre_query) diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc index 35f218e4..94804a6d 100644 --- a/sql/wsrep_sst.cc +++ b/sql/wsrep_sst.cc @@ -30,9 +30,10 @@ #include #include -char wsrep_defaults_file[FN_REFLEN * 2 + 10 + - sizeof(WSREP_SST_OPT_CONF) + - sizeof(WSREP_SST_OPT_EXTRA_CONF)] = {0}; +static char wsrep_defaults_file[FN_REFLEN * 2 + 10 + 30 + + sizeof(WSREP_SST_OPT_CONF) + + sizeof(WSREP_SST_OPT_CONF_SUFFIX) + + sizeof(WSREP_SST_OPT_CONF_EXTRA)] = {0}; const char* wsrep_sst_method = WSREP_SST_DEFAULT; const char* wsrep_sst_receive_address = WSREP_SST_ADDRESS_AUTO; @@ -75,7 +76,11 @@ static void make_wsrep_defaults_file() if (my_defaults_extra_file) ptr= strxnmov(ptr, end - ptr, - WSREP_SST_OPT_EXTRA_CONF, " '", my_defaults_extra_file, "' ", NULL); + WSREP_SST_OPT_CONF_EXTRA, " '", my_defaults_extra_file, "' ", NULL); + + if (my_defaults_group_suffix) + ptr= strxnmov(ptr, end - ptr, + WSREP_SST_OPT_CONF_SUFFIX, " '", my_defaults_group_suffix, "' ", NULL); } } @@ -581,8 +586,8 @@ static ssize_t sst_prepare_other (const char* method, WSREP_SST_OPT_PARENT" '%d'" " %s '%s' ", method, addr_in, mysql_real_data_home, - wsrep_defaults_file, (int)getpid(), - binlog_opt, binlog_opt_val); + wsrep_defaults_file, + (int)getpid(), binlog_opt, binlog_opt_val); my_free(binlog_opt_val); if (ret < 0 || ret >= cmd_len) @@ -864,7 +869,7 @@ static int sst_donate_mysqldump (const char* addr, WSREP_SST_OPT_PORT" '%d' " WSREP_SST_OPT_LPORT" '%u' " WSREP_SST_OPT_SOCKET" '%s' " - " %s " + " '%s' " WSREP_SST_OPT_GTID" '%s:%lld' " WSREP_SST_OPT_GTID_DOMAIN_ID" '%d'" "%s", diff --git a/sql/wsrep_sst.h b/sql/wsrep_sst.h index 49dd5b39..dcf0ff22 100644 --- a/sql/wsrep_sst.h +++ b/sql/wsrep_sst.h @@ -27,7 +27,8 @@ #define WSREP_SST_OPT_AUTH "--auth" #define WSREP_SST_OPT_DATA "--datadir" #define WSREP_SST_OPT_CONF "--defaults-file" -#define WSREP_SST_OPT_EXTRA_CONF "--defaults-extra-file" +#define WSREP_SST_OPT_CONF_SUFFIX "--defaults-group-suffix" +#define WSREP_SST_OPT_CONF_EXTRA "--defaults-extra-file" #define WSREP_SST_OPT_PARENT "--parent" #define WSREP_SST_OPT_BINLOG "--binlog" diff --git a/storage/connect/CMakeLists.txt b/storage/connect/CMakeLists.txt index 69b2ef78..e283da97 100644 --- a/storage/connect/CMakeLists.txt +++ b/storage/connect/CMakeLists.txt @@ -61,7 +61,7 @@ IF(UNIX) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive -fexceptions -fPIC ") get_property(inc_dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES) - SET(CONNECT_SOURCES ${CONNECT_SOURCES} inihandl.c) + SET(CONNECT_SOURCES ${CONNECT_SOURCES} inihandl.cpp) SET(IPHLPAPI_LIBRARY "") ELSE(NOT UNIX) SET(CONNECT_SOURCES ${CONNECT_SOURCES} @@ -228,7 +228,7 @@ int main() { ENDIF(CONNECT_WITH_ODBC) # -# JDBC with MongoDB Java Driver included but disabled +# 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_JDBC "Compile CONNECT storage engine with JDBC support" ON) diff --git a/storage/connect/fmdlex.c b/storage/connect/fmdlex.c index 64429d9b..a8d48a5d 100644 --- a/storage/connect/fmdlex.c +++ b/storage/connect/fmdlex.c @@ -529,7 +529,7 @@ YY_DECL pp->Num = 0; if (pp->InFmt) {*pp->InFmt = '\0'; pp->InFmt[pp->Outsize -1] = '\0'; } if (pp->OutFmt) {*pp->OutFmt = '\0'; pp->OutFmt[pp->Outsize -1] = '\0'; } - pp->Curp = pp->Format; + pp->Curp = (char*) pp->Format; yy_init = 1; /* This is a new input */ diff --git a/storage/connect/global.h b/storage/connect/global.h index de7a9fb3..e4b00786 100644 --- a/storage/connect/global.h +++ b/storage/connect/global.h @@ -217,7 +217,8 @@ DllExport int PlugExit(PGLOBAL); // Plug global termination DllExport LPSTR PlugRemoveType(LPSTR, LPCSTR); DllExport LPCSTR PlugSetPath(LPSTR to, LPCSTR prefix, LPCSTR name, LPCSTR dir); DllExport BOOL PlugIsAbsolutePath(LPCSTR path); -DllExport void *PlugAllocMem(PGLOBAL, uint); +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); diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 787ec2af..5964b1d0 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -215,9 +215,9 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char *tab, char *db, bool info); PQRYRES VirColumns(PGLOBAL g, bool info); PQRYRES JSONColumns(PGLOBAL g, PCSZ db, PCSZ dsn, PTOS topt, bool info); PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info); -#if defined(MONGO_SUPPORT) +#if defined(JAVA_SUPPORT) PQRYRES MGOColumns(PGLOBAL g, PCSZ db, PCSZ url, PTOS topt, bool info); -#endif // MONGO_SUPPORT +#endif // JAVA_SUPPORT int TranslateJDBCType(int stp, char *tn, int prec, int& len, char& v); void PushWarning(PGLOBAL g, THD *thd, int level); bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, PCSZ host, PCSZ db, @@ -371,13 +371,6 @@ static MYSQL_THDVAR_BOOL(enable_mongo, PLUGIN_VAR_RQCMDARG, NULL, NULL, MONGO_ENABLED); #endif // 0 -#if defined(MONGO_SUPPORT) -// Enabling MONGO table type -static MYSQL_THDVAR_BOOL(enable_mongo, PLUGIN_VAR_RQCMDARG, - "Enabling the MongoDB access", - NULL, NULL, MONGO_ENABLED); -#endif // MONGO_SUPPORT - #if defined(XMSG) || defined(NEWMSG) const char *language_names[]= { @@ -442,10 +435,6 @@ char *GetJavaWrapper(void) //bool MongoEnabled(void) { return THDVAR(current_thd, enable_mongo); } #endif // JAVA_SUPPORT -#if defined(MONGO_SUPPORT) -bool MongoEnabled(void) { return THDVAR(current_thd, enable_mongo); } -#endif // MONGO_SUPPORT - extern "C" const char *msglang(void) { #if defined(FRENCH) @@ -3020,7 +3009,9 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond) return NULL; if (!x) { + const char *p; char *s = (ishav) ? havg : body; + uint j, k, n; // Append the value to the filter switch (args[i]->field_type()) { @@ -3076,16 +3067,38 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond) strcat(s, "'}"); break; default: - strcat(s, "'"); - strncat(s, res->ptr(), res->length()); - strcat(s, "'"); - } // endswitch field type + j = strlen(s); + s[j++] = '\''; + p = res->ptr(); + n = res->length(); + + for (k = 0; k < n; k++) { + if (p[k] == '\'') + s[j++] = '\''; + + s[j++] = p[k]; + } // endfor k + + s[j++] = '\''; + s[j] = 0; + } // endswitch field type } else { - strcat(s, "'"); - strncat(s, res->ptr(), res->length()); - strcat(s, "'"); - } // endif tty + j = strlen(s); + s[j++] = '\''; + p = res->ptr(); + n = res->length(); + + for (k = 0; k < n; k++) { + if (p[k] == '\'') + s[j++] = '\''; + + s[j++] = p[k]; + } // endfor k + + s[j++] = '\''; + s[j] = 0; + } // endif tty break; default: diff --git a/storage/connect/inihandl.c b/storage/connect/inihandl.cpp similarity index 97% rename from storage/connect/inihandl.c rename to storage/connect/inihandl.cpp index 0ce0eb9f..96ae0a67 100644 --- a/storage/connect/inihandl.c +++ b/storage/connect/inihandl.cpp @@ -37,7 +37,7 @@ // The types and variables used locally //typedef int bool; typedef unsigned int uint; -#define SVP(S) ((S) ? S : "") +//#define SVP(S) ((S) ? S : "") #define _strlwr(P) strlwr(P) //OB: changed this line #define MAX_PATHNAME_LEN 256 #define N_CACHED_PROFILES 10 @@ -61,8 +61,8 @@ void htrc(char const *fmt, ...) } /* end of htrc */ #else // !TEST_MODULE // Normal included functions -extern int trace; -void htrc(char const *fmt, ...); +//extern int trace; +//void htrc(char const *fmt, ...); #endif // !TEST MODULE @@ -112,10 +112,11 @@ static PROFILE *MRUProfile[N_CACHED_PROFILES] = {NULL}; //static CRITICAL_SECTION PROFILE_CritSect = CRITICAL_SECTION_INIT("PROFILE_CritSect"); -static const char hex[16] = "0123456789ABCDEF"; +static const char hex[17] = "0123456789ABCDEF"; BOOL WritePrivateProfileString(LPCSTR section, LPCSTR entry, - LPCSTR string, LPCSTR filename ); + LPCSTR string, LPCSTR filename); + /*********************************************************************** * PROFILE_CopyEntry * @@ -254,7 +255,7 @@ static PROFILESECTION *PROFILE_Load( FILE *file ) PROFILESECTION* *next_section; PROFILEKEY *key, *prev_key, **next_key; - first_section = malloc(sizeof(*section)); + first_section = (PROFILESECTION*)malloc(sizeof(*section)); if (first_section == NULL) return NULL; @@ -281,7 +282,7 @@ static PROFILESECTION *PROFILE_Load( FILE *file ) *p2 = '\0'; p++; - if (!(section = malloc(sizeof(*section) + strlen(p)))) + if (!(section = (PROFILESECTION*)malloc(sizeof(*section) + strlen(p)))) break; strcpy(section->name, p); @@ -319,13 +320,13 @@ static PROFILESECTION *PROFILE_Load( FILE *file ) } // endif p2 if (*p || !prev_key || *prev_key->name) { - if (!(key = malloc(sizeof(*key) + strlen(p)))) + if (!(key = (PROFILEKEY*)malloc(sizeof(*key) + strlen(p)))) break; strcpy(key->name, p); if (p2) { - key->value = malloc(strlen(p2)+1); + key->value = (char*)malloc(strlen(p2)+1); strcpy(key->value, p2); } else key->value = NULL; @@ -452,7 +453,7 @@ static BOOL PROFILE_Open(LPCSTR filename) /* First time around */ if (!CurProfile) for (i = 0; i < N_CACHED_PROFILES; i++) { - MRUProfile[i] = malloc(sizeof(PROFILE)); + MRUProfile[i] = (PROFILE*)malloc(sizeof(PROFILE)); if (MRUProfile[i] == NULL) break; @@ -520,7 +521,7 @@ static BOOL PROFILE_Open(LPCSTR filename) // strcpy(newdos_name, filename); // CurProfile->dos_name = newdos_name; - CurProfile->filename = malloc(strlen(filename) + 1); + CurProfile->filename = (char*)malloc(strlen(filename) + 1); strcpy(CurProfile->filename, filename); /* Try to open the profile file, first in $HOME/.wine */ @@ -783,7 +784,7 @@ static PROFILEKEY *PROFILE_Find(PROFILESECTION* *section, if (!create) return NULL; - if (!(*key = malloc(sizeof(PROFILEKEY) + strlen(key_name)))) + if (!(*key = (PROFILEKEY*)malloc(sizeof(PROFILEKEY) + strlen(key_name)))) return NULL; strcpy((*key)->name, key_name); @@ -798,7 +799,7 @@ static PROFILEKEY *PROFILE_Find(PROFILESECTION* *section, if (!create) return NULL; - *section = malloc(sizeof(PROFILESECTION) + strlen(section_name)); + *section = (PROFILESECTION*)malloc(sizeof(PROFILESECTION) + strlen(section_name)); if (*section == NULL) return NULL; @@ -806,7 +807,7 @@ static PROFILEKEY *PROFILE_Find(PROFILESECTION* *section, strcpy((*section)->name, section_name); (*section)->next = NULL; - if (!((*section)->key = malloc(sizeof(PROFILEKEY) + strlen(key_name)))) { + if (!((*section)->key = (tagPROFILEKEY*)malloc(sizeof(PROFILEKEY) + strlen(key_name)))) { free(*section); return NULL; } // endif malloc @@ -1052,7 +1053,7 @@ static BOOL PROFILE_SetString(LPCSTR section_name, LPCSTR key_name, } else if (trace > 1) htrc(" creating key\n" ); - key->value = malloc(strlen(value) + 1); + key->value = (char*)malloc(strlen(value) + 1); strcpy(key->value, value); CurProfile->changed = TRUE; } // endelse @@ -1125,7 +1126,7 @@ static int PROFILE_GetPrivateProfileString(LPCSTR section, LPCSTR entry, if (*p == ' ') { /* ouch, contained trailing ' ' */ int len = p - (LPSTR)def_val; - pDefVal = malloc(len + 1); + pDefVal = (LPSTR)malloc(len + 1); strncpy(pDefVal, def_val, len); pDefVal[len] = '\0'; } // endif *p @@ -1277,7 +1278,7 @@ BOOL WritePrivateProfileSection(LPCSTR section, ret = TRUE; while (*string) { - LPSTR buf = malloc(strlen(string) + 1); + LPSTR buf = (LPSTR)malloc(strlen(string) + 1); strcpy(buf, string); if ((p = strchr(buf, '='))) { diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 504ea837..33af95a2 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -1505,23 +1505,16 @@ static my_bool CheckMemory(PGLOBAL g, UDF_INIT *initid, UDF_ARGS *args, uint n, ml += g->More; if (ml > g->Sarea_Size) { -#if !defined(DEVELOPMENT) - if (trace) -#endif - htrc("Freeing Sarea at %p size=%d\n", g->Sarea, g->Sarea_Size); - - free(g->Sarea); + FreeSarea(g); - if (!(g->Sarea = PlugAllocMem(g, ml))) { + if (AllocSarea(g, ml)) { char errmsg[MAX_STR]; snprintf(errmsg, sizeof(errmsg)-1, MSG(WORK_AREA), g->Message); strcpy(g->Message, errmsg); - g->Sarea_Size = 0; return true; - } // endif Alloc + } // endif SareaAlloc - g->Sarea_Size = ml; g->Createas = 0; g->Xchk = NULL; initid->max_length = rl; diff --git a/storage/connect/myconn.cpp b/storage/connect/myconn.cpp index 08bb24e1..fe00f6a1 100644 --- a/storage/connect/myconn.cpp +++ b/storage/connect/myconn.cpp @@ -933,8 +933,9 @@ PQRYRES MYSQLC::GetResult(PGLOBAL g, bool pdb) crp->Prec = (crp->Type == TYPE_DOUBLE || crp->Type == TYPE_DECIM) ? fld->decimals : 0; - crp->Length = MY_MAX(fld->length, fld->max_length); - crp->Clen = GetTypeSize(crp->Type, crp->Length); + CHARSET_INFO *cs= get_charset(fld->charsetnr, MYF(0)); + crp->Clen = GetTypeSize(crp->Type, fld->length); + crp->Length = fld->length / (cs ? cs->mbmaxlen : 1); uns = (fld->flags & (UNSIGNED_FLAG | ZEROFILL_FLAG)) ? true : false; if (!(crp->Kdata = AllocValBlock(g, NULL, crp->Type, m_Rows, diff --git a/storage/connect/mysql-test/connect/disabled.def b/storage/connect/mysql-test/connect/disabled.def index 6d59369a..0dcf0306 100644 --- a/storage/connect/mysql-test/connect/disabled.def +++ b/storage/connect/mysql-test/connect/disabled.def @@ -19,3 +19,4 @@ json_java_3 : Need MongoDB running and its Java Driver installed mongo_c : Need MongoDB running and its C Driver installed mongo_java_2 : Need MongoDB running and its Java Driver installed mongo_java_3 : Need MongoDB running and its Java Driver installed +tbl_thread : Bug MDEV-9844,10179,14214 03/01/2018 OB Option THREAD removed diff --git a/storage/connect/plgdbutl.cpp b/storage/connect/plgdbutl.cpp index 0a650731..f669d644 100644 --- a/storage/connect/plgdbutl.cpp +++ b/storage/connect/plgdbutl.cpp @@ -334,7 +334,7 @@ PDBUSER PlgMakeUser(PGLOBAL g) { PDBUSER dbuserp; - if (!(dbuserp = (PDBUSER)PlugAllocMem(g, (uint)sizeof(DBUSERBLK)))) { + if (!(dbuserp = (PDBUSER)malloc(sizeof(DBUSERBLK)))) { sprintf(g->Message, MSG(MALLOC_ERROR), "PlgMakeUser"); return NULL; } // endif dbuserp diff --git a/storage/connect/plugutil.cpp b/storage/connect/plugutil.cpp index 0855e265..7b408870 100644 --- a/storage/connect/plugutil.cpp +++ b/storage/connect/plugutil.cpp @@ -138,7 +138,7 @@ PGLOBAL PlugInit(LPCSTR Language, uint worksize) if (trace > 1) htrc("PlugInit: Language='%s'\n", - ((!Language) ? "Null" : (char*)Language)); + ((!Language) ? "Null" : (char*)Language)); try { g = new GLOBAL; @@ -160,13 +160,11 @@ PGLOBAL PlugInit(LPCSTR Language, uint worksize) /*******************************************************************/ /* Allocate the main work segment. */ /*******************************************************************/ - if (worksize && !(g->Sarea = PlugAllocMem(g, worksize))) { + if (worksize && AllocSarea(g, worksize)) { char errmsg[MAX_STR]; snprintf(errmsg, sizeof(errmsg) - 1, MSG(WORK_AREA), g->Message); strcpy(g->Message, errmsg); - g->Sarea_Size = 0; - } else - g->Sarea_Size = worksize; + } // endif Sarea g->jump_level = -1; /* New setting to allow recursive call of Plug */ return(g); @@ -183,15 +181,7 @@ int PlugExit(PGLOBAL g) if (dup) free(dup); - if (g->Sarea) { -#if !defined(DEVELOPMENT) - if (trace) -#endif - htrc("Freeing Sarea at %p size=%d\n", g->Sarea, g->Sarea_Size); - - free(g->Sarea); - } // endif Sarea - + FreeSarea(g); delete g; } // endif g @@ -459,30 +449,65 @@ short GetLineLength(PGLOBAL g) /***********************************************************************/ /* Program for memory allocation of work and language areas. */ /***********************************************************************/ -void *PlugAllocMem(PGLOBAL g, uint size) +bool AllocSarea(PGLOBAL g, uint size) { - void *areap; /* Pointer to allocated area */ - /*********************************************************************/ /* This is the allocation routine for the WIN32/UNIX/AIX version. */ /*********************************************************************/ - if (!(areap = malloc(size))) - sprintf(g->Message, MSG(MALLOC_ERROR), "malloc"); +#if defined(__WIN__) + if (size >= 1048576) // 1M + g->Sarea = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); + else +#endif + g->Sarea = malloc(size); + + if (!g->Sarea) { + sprintf(g->Message, MSG(MALLOC_ERROR), "malloc"); + g->Sarea_Size = 0; + } else + g->Sarea_Size = size; #if defined(DEVELOPMENT) if (true) { #else if (trace) { #endif - if (areap) - htrc("Memory of %u allocated at %p\n", size, areap); + if (g->Sarea) + htrc("Work area of %u allocated at %p\n", size, g->Sarea); else - htrc("PlugAllocMem: %s\n", g->Message); + htrc("SareaAlloc: %s\n", g->Message); } // endif trace - return (areap); -} // end of PlugAllocMem + return (!g->Sarea); +} // end of AllocSarea + +/***********************************************************************/ +/* Program for memory freeing the work area. */ +/***********************************************************************/ +void FreeSarea(PGLOBAL g) +{ + if (g->Sarea) { +#if defined(__WIN__) + if (g->Sarea_Size >= 1048576) // 1M + VirtualFree(g->Sarea, 0, MEM_RELEASE); + else +#endif + free(g->Sarea); + +#if defined(DEVELOPMENT) + if (true) +#else + if (trace) +#endif + htrc("Freeing Sarea at %p size = %d\n", g->Sarea, g->Sarea_Size); + + g->Sarea = NULL; + g->Sarea_Size = 0; + } // endif Sarea + + return; +} // end of FreeSarea /***********************************************************************/ /* Program for SubSet initialization of memory pools. */ diff --git a/storage/connect/tabtbl.cpp b/storage/connect/tabtbl.cpp index d3fb31fb..7925e8f2 100644 --- a/storage/connect/tabtbl.cpp +++ b/storage/connect/tabtbl.cpp @@ -1,12 +1,9 @@ /************* TabTbl C++ Program Source Code File (.CPP) **************/ /* PROGRAM NAME: TABTBL */ /* ------------- */ -/* Version 1.8 */ +/* Version 1.9 */ /* */ -/* COPYRIGHT: */ -/* ---------- */ -/* (C) Copyright to PlugDB Software Development 2008-2017 */ -/* Author: Olivier BERTRAND */ +/* Author: Olivier BERTRAND 2008-2018 */ /* */ /* WHAT THIS PROGRAM DOES: */ /* ----------------------- */ @@ -168,9 +165,14 @@ PTDB TBLDEF::GetTable(PGLOBAL g, MODE) { if (Catfunc == FNC_COL) return new(g) TDBTBC(this); - else if (Thread) - return new(g) TDBTBM(this); - else + else if (Thread) { +#if defined(DEVELOPMENT) + return new(g) TDBTBM(this); +#else + strcpy(g->Message, "Option THREAD is no more supported"); + return NULL; +#endif // DEVELOPMENT + } else return new(g) TDBTBL(this); } // end of GetTable @@ -560,6 +562,7 @@ void TBTBLK::ReadColumn(PGLOBAL) } // end of ReadColumn +#if defined(DEVELOPMENT) /* ------------------------- Class TDBTBM ---------------------------- */ /***********************************************************************/ @@ -650,7 +653,7 @@ bool TDBTBM::IsLocal(PTABLE tbp) return ((!stricmp(tdbp->Host, "localhost") || !strcmp(tdbp->Host, "127.0.0.1")) && - tdbp->Port == (int)GetDefaultPort()); + (int) tdbp->Port == (int)GetDefaultPort()); } // end of IsLocal /***********************************************************************/ @@ -865,5 +868,6 @@ int TDBTBM::ReadNextRemote(PGLOBAL g) return RC_OK; } // end of ReadNextRemote +#endif // DEVELOPMENT /* ------------------------------------------------------------------- */ diff --git a/storage/connect/tabtbl.h b/storage/connect/tabtbl.h index f02bf620..e7a84395 100644 --- a/storage/connect/tabtbl.h +++ b/storage/connect/tabtbl.h @@ -11,29 +11,8 @@ typedef class TBLDEF *PTBLDEF; typedef class TDBTBL *PTDBTBL; -typedef class TDBTBM *PTDBTBM; typedef class MYSQLC *PMYC; -/***********************************************************************/ -/* Defines the structures used for distributed TBM tables. */ -/***********************************************************************/ -typedef struct _TBMtable *PTBMT; - -typedef struct _TBMtable { - PTBMT Next; // Points to next data table struct - PTABLE Tap; // Points to the sub table - PGLOBAL G; // Needed in thread routine - bool Complete; // TRUE when all results are read - bool Ready; // TRUE when results are there - int Rows; // Total number of rows read so far - int ProgCur; // Current pos - int ProgMax; // Max pos - int Rc; // Return code - THD *Thd; - pthread_attr_t attr; // ??? - pthread_t Tid; // CheckOpen thread ID - } TBMT; - /***********************************************************************/ /* TBL table. */ /***********************************************************************/ @@ -123,7 +102,33 @@ class TBTBLK : public TIDBLK { protected: // Must not have additional members - }; // end of class TBTBLK +}; // end of class TBTBLK + +#if defined(DEVELOPMENT) +/***********************************************************************/ +/* This table type is buggy and removed until a fix is found. */ +/***********************************************************************/ +typedef class TDBTBM *PTDBTBM; + +/***********************************************************************/ +/* Defines the structures used for distributed TBM tables. */ +/***********************************************************************/ +typedef struct _TBMtable *PTBMT; + +typedef struct _TBMtable { + PTBMT Next; // Points to next data table struct + PTABLE Tap; // Points to the sub table + PGLOBAL G; // Needed in thread routine + bool Complete; // TRUE when all results are read + bool Ready; // TRUE when results are there + int Rows; // Total number of rows read so far + int ProgCur; // Current pos + int ProgMax; // Max pos + int Rc; // Return code + THD *Thd; + pthread_attr_t attr; // ??? + pthread_t Tid; // CheckOpen thread ID +} TBMT; /***********************************************************************/ /* This is the TBM Access Method class declaration. */ @@ -160,3 +165,4 @@ class DllExport TDBTBM : public TDBTBL { }; // end of class TDBTBM pthread_handler_t ThreadOpen(void *p); +#endif // DEVELOPMENT diff --git a/storage/connect/user_connect.cc b/storage/connect/user_connect.cc index 94d2c8ad..cb62667c 100644 --- a/storage/connect/user_connect.cc +++ b/storage/connect/user_connect.cc @@ -156,29 +156,20 @@ void user_connect::SetHandler(ha_connect *hc) bool user_connect::CheckCleanup(bool force) { if (thdp->query_id > last_query_id || force) { - uint worksize= GetWorkSize(); + uint worksize= GetWorkSize(), size = g->Sarea_Size; PlugCleanup(g, true); - if (g->Sarea_Size != worksize) { - if (g->Sarea) { -#if !defined(DEVELOPMENT) - if (trace) -#endif - htrc("CheckCleanup: Free Sarea at %p size=%d\n", - g->Sarea, g->Sarea_Size); - - free(g->Sarea); - } // endif Size + if (size != worksize) { + FreeSarea(g); // Check whether the work area could be allocated - if (!(g->Sarea = PlugAllocMem(g, worksize))) { - g->Sarea = PlugAllocMem(g, g->Sarea_Size); + if (AllocSarea(g, worksize)) { + AllocSarea(g, size); SetWorkSize(g->Sarea_Size); // Was too big - } else - g->Sarea_Size = worksize; // Ok + } // endif sarea - } // endif worksize + } // endif worksize PlugSubSet(g, g->Sarea, g->Sarea_Size); g->Xchk = NULL; diff --git a/storage/federated/ha_federated.cc b/storage/federated/ha_federated.cc index 85e41554..0e845467 100644 --- a/storage/federated/ha_federated.cc +++ b/storage/federated/ha_federated.cc @@ -2982,6 +2982,9 @@ int ha_federated::reset(void) } reset_dynamic(&results); + if (mysql) + mysql->net.thd= NULL; + return 0; } @@ -3202,12 +3205,14 @@ int ha_federated::real_query(const char *query, size_t length) int rc= 0; DBUG_ENTER("ha_federated::real_query"); - if (!mysql && (rc= real_connect())) + if (!query || !length) goto end; - if (!query || !length) + if (!mysql && (rc= real_connect())) goto end; + mysql->net.thd= table->in_use; + rc= mysql_real_query(mysql, query, (uint) length); end: diff --git a/storage/federatedx/ha_federatedx.h b/storage/federatedx/ha_federatedx.h index abf25abe..f3af7258 100644 --- a/storage/federatedx/ha_federatedx.h +++ b/storage/federatedx/ha_federatedx.h @@ -169,7 +169,7 @@ class federatedx_io static void *operator new(size_t size, MEM_ROOT *mem_root) throw () { return alloc_root(mem_root, size); } static void operator delete(void *ptr, size_t size) - { TRASH(ptr, size); } + { TRASH_FREE(ptr, size); } virtual int query(const char *buffer, uint length)=0; virtual FEDERATEDX_IO_RESULT *store_result()=0; diff --git a/storage/heap/ha_heap.cc b/storage/heap/ha_heap.cc index 970c5034..3513ddb4 100644 --- a/storage/heap/ha_heap.cc +++ b/storage/heap/ha_heap.cc @@ -91,6 +91,15 @@ 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)) { diff --git a/storage/innobase/CMakeLists.txt b/storage/innobase/CMakeLists.txt index ad231236..7eecefc9 100644 --- a/storage/innobase/CMakeLists.txt +++ b/storage/innobase/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 @@ -520,3 +520,4 @@ MYSQL_ADD_PLUGIN(innobase ${INNOBASE_SOURCES} STORAGE_ENGINE MODULE_OUTPUT_NAME ha_innodb LINK_LIBRARIES ${ZLIB_LIBRARY} ${LIBSYSTEMD} ${LINKER_SCRIPT}) +ADD_DEPENDENCIES(innobase GenError) diff --git a/storage/innobase/api/api0api.cc b/storage/innobase/api/api0api.cc index bc83e983..fd14fdef 100644 --- a/storage/innobase/api/api0api.cc +++ b/storage/innobase/api/api0api.cc @@ -398,7 +398,7 @@ ib_read_tuple( data = btr_rec_copy_externally_stored_field( copy, offsets, zip_size, i, &len, - tuple->heap, NULL); + tuple->heap); ut_a(len != UNIV_SQL_NULL); } diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc index bb010190..09d84d1e 100644 --- a/storage/innobase/btr/btr0cur.cc +++ b/storage/innobase/btr/btr0cur.cc @@ -3792,8 +3792,7 @@ btr_estimate_n_rows_in_range( const dtuple_t* tuple1, /*!< in: range start, may also be empty tuple */ ulint mode1, /*!< in: search mode for range start */ const dtuple_t* tuple2, /*!< in: range end, may also be empty tuple */ - ulint mode2, /*!< in: search mode for range end */ - trx_t* trx) /*!< in: trx */ + ulint mode2) /*!< in: search mode for range end */ { btr_path_t path1[BTR_PATH_ARRAY_N_SLOTS]; btr_path_t path2[BTR_PATH_ARRAY_N_SLOTS]; @@ -3811,7 +3810,7 @@ btr_estimate_n_rows_in_range( table_n_rows = dict_table_get_n_rows(index->table); - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); cursor.path_arr = path1; @@ -3833,7 +3832,7 @@ btr_estimate_n_rows_in_range( return (0); } - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); cursor.path_arr = path2; @@ -5466,8 +5465,7 @@ btr_copy_blob_prefix( ulint len, /*!< in: length of buf, in bytes */ ulint space_id,/*!< in: space id of the BLOB pages */ ulint page_no,/*!< in: page number of the first BLOB page */ - ulint offset, /*!< in: offset on the first BLOB page */ - trx_t* trx) /*!< in: transaction handle */ + ulint offset) /*!< in: offset on the first BLOB page */ { ulint copied_len = 0; @@ -5479,7 +5477,7 @@ btr_copy_blob_prefix( ulint part_len; ulint copy_len; - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); block = buf_page_get(space_id, 0, page_no, RW_S_LATCH, &mtr); buf_block_dbg_add_level(block, SYNC_EXTERN_STORAGE); @@ -5682,8 +5680,7 @@ btr_copy_externally_stored_field_prefix_low( zero for uncompressed BLOBs */ ulint space_id,/*!< in: space id of the first BLOB page */ ulint page_no,/*!< in: page number of the first BLOB page */ - ulint offset, /*!< in: offset on the first BLOB page */ - trx_t* trx) /*!< in: transaction handle */ + ulint offset) /*!< in: offset on the first BLOB page */ { if (UNIV_UNLIKELY(len == 0)) { return(0); @@ -5694,7 +5691,7 @@ btr_copy_externally_stored_field_prefix_low( space_id, page_no, offset)); } else { return(btr_copy_blob_prefix(buf, len, space_id, - page_no, offset, trx)); + page_no, offset)); } } @@ -5715,8 +5712,7 @@ btr_copy_externally_stored_field_prefix( field containing also the reference to the external part; must be protected by a lock or a page latch */ - ulint local_len,/*!< in: length of data, in bytes */ - trx_t* trx) /*!< in: transaction handle */ + ulint local_len)/*!< in: length of data, in bytes */ { ulint space_id; ulint page_no; @@ -5755,7 +5751,7 @@ btr_copy_externally_stored_field_prefix( len - local_len, zip_size, space_id, page_no, - offset, trx)); + offset)); } /*******************************************************************//** @@ -5774,8 +5770,7 @@ btr_copy_externally_stored_field( ulint zip_size,/*!< in: nonzero=compressed BLOB page size, zero for uncompressed BLOBs */ ulint local_len,/*!< in: length of data */ - mem_heap_t* heap, /*!< in: mem heap */ - trx_t* trx) /*!< in: transaction handle */ + mem_heap_t* heap) /*!< in: mem heap */ { ulint space_id; ulint page_no; @@ -5806,8 +5801,7 @@ btr_copy_externally_stored_field( extern_len, zip_size, space_id, - page_no, offset, - trx); + page_no, offset); return(buf); } @@ -5826,8 +5820,7 @@ btr_rec_copy_externally_stored_field( zero for uncompressed BLOBs */ ulint no, /*!< in: field number */ ulint* len, /*!< out: length of the field */ - mem_heap_t* heap, /*!< in: mem heap */ - trx_t* trx) /*!< in: transaction handle */ + mem_heap_t* heap) /*!< in: mem heap */ { ulint local_len; const byte* data; @@ -5858,7 +5851,6 @@ btr_rec_copy_externally_stored_field( } return(btr_copy_externally_stored_field(len, data, - zip_size, local_len, heap, - trx)); + zip_size, local_len, heap)); } #endif /* !UNIV_HOTBACKUP */ diff --git a/storage/innobase/btr/btr0pcur.cc b/storage/innobase/btr/btr0pcur.cc index ff80cfb2..5ba9409a 100644 --- a/storage/innobase/btr/btr0pcur.cc +++ b/storage/innobase/btr/btr0pcur.cc @@ -496,7 +496,7 @@ btr_pcur_move_backward_from_page( mtr_commit(mtr); - mtr_start_trx(mtr, mtr->trx); + mtr_start(mtr); btr_pcur_restore_position(latch_mode2, cursor, mtr); diff --git a/storage/innobase/buf/buf0buddy.cc b/storage/innobase/buf/buf0buddy.cc index f2ab7321..7a441b42 100644 --- a/storage/innobase/buf/buf0buddy.cc +++ b/storage/innobase/buf/buf0buddy.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 2006, 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 @@ -649,7 +650,7 @@ buf_buddy_free_low( buf_pool->buddy_stat[i].used--; recombine: - UNIV_MEM_ASSERT_AND_ALLOC(buf, BUF_BUDDY_LOW << i); + UNIV_MEM_ALLOC(buf, BUF_BUDDY_LOW << i); if (i == BUF_BUDDY_SIZES) { buf_buddy_block_free(buf_pool, buf); diff --git a/storage/innobase/buf/buf0dump.cc b/storage/innobase/buf/buf0dump.cc index 703c425e..793d6cdd 100644 --- a/storage/innobase/buf/buf0dump.cc +++ b/storage/innobase/buf/buf0dump.cc @@ -613,6 +613,7 @@ buf_load() if (dump_n == 0) { ut_free(dump); + ut_free(dump_tmp); ut_sprintf_timestamp(now); buf_load_status(STATUS_NOTICE, "Buffer pool(s) load completed at %s " diff --git a/storage/innobase/buf/buf0lru.cc b/storage/innobase/buf/buf0lru.cc index a047b28f..9e89a291 100644 --- a/storage/innobase/buf/buf0lru.cc +++ b/storage/innobase/buf/buf0lru.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 @@ -90,6 +90,10 @@ during LRU eviction. */ frames in the buffer pool, we set this to TRUE */ static ibool buf_lru_switched_on_innodb_mon = FALSE; +/** True if diagnostic message about difficult to find free blocks +in the buffer bool has already printed. */ +static bool buf_lru_free_blocks_error_printed; + /******************************************************************//** These statistics are not 'of' LRU but 'for' LRU. We keep count of I/O and page_zip_decompress() operations. Based on the statistics, @@ -1045,8 +1049,6 @@ buf_LRU_get_free_block( ibool freed = FALSE; ulint n_iterations = 0; ulint flush_failures = 0; - ibool mon_value_was = FALSE; - ibool started_monitor = FALSE; MONITOR_INC(MONITOR_LRU_GET_FREE_SEARCH); loop: @@ -1054,6 +1056,11 @@ buf_LRU_get_free_block( buf_LRU_check_size_of_non_data_objects(buf_pool); + DBUG_EXECUTE_IF("ib_lru_force_no_free_page", + if (!buf_lru_free_blocks_error_printed) { + n_iterations = 21; + goto not_found;}); + /* If there is a block in the free list, take it */ block = buf_LRU_get_free_only(buf_pool); @@ -1062,16 +1069,11 @@ buf_LRU_get_free_block( buf_pool_mutex_exit(buf_pool); ut_ad(buf_pool_from_block(block) == buf_pool); memset(&block->page.zip, 0, sizeof block->page.zip); - - if (started_monitor) { - srv_print_innodb_monitor = - static_cast(mon_value_was); - } - return(block); } freed = FALSE; + if (buf_pool->try_LRU_scan || n_iterations > 0) { /* If no block was in the free list, search from the end of the LRU list and try to free a block there. @@ -1094,6 +1096,10 @@ buf_LRU_get_free_block( } } +#ifndef DBUG_OFF +not_found: +#endif + buf_pool_mutex_exit(buf_pool); if (freed) { @@ -1101,40 +1107,26 @@ buf_LRU_get_free_block( } - if (n_iterations > 20) { - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Warning: difficult to find free blocks in\n" - "InnoDB: the buffer pool (%lu search iterations)!\n" - "InnoDB: %lu failed attempts to flush a page!" - " Consider\n" - "InnoDB: increasing the buffer pool size.\n" - "InnoDB: It is also possible that" - " in your Unix version\n" - "InnoDB: fsync is very slow, or" - " completely frozen inside\n" - "InnoDB: the OS kernel. Then upgrading to" - " a newer version\n" - "InnoDB: of your operating system may help." - " Look at the\n" - "InnoDB: number of fsyncs in diagnostic info below.\n" - "InnoDB: Pending flushes (fsync) log: %lu;" - " buffer pool: %lu\n" - "InnoDB: %lu OS file reads, %lu OS file writes," - " %lu OS fsyncs\n" - "InnoDB: Starting InnoDB Monitor to print further\n" - "InnoDB: diagnostics to the standard output.\n", - (ulong) n_iterations, - (ulong) flush_failures, - (ulong) fil_n_pending_log_flushes, - (ulong) fil_n_pending_tablespace_flushes, - (ulong) os_n_file_reads, (ulong) os_n_file_writes, - (ulong) os_n_fsyncs); - - mon_value_was = srv_print_innodb_monitor; - started_monitor = TRUE; - srv_print_innodb_monitor = TRUE; - os_event_set(srv_monitor_event); + if (n_iterations > 20 && !buf_lru_free_blocks_error_printed) { + ib_logf(IB_LOG_LEVEL_WARN, + "Difficult to find free blocks in" + " the buffer pool (" ULINTPF " search iterations)! " + ULINTPF " failed attempts to flush a page!", + n_iterations, flush_failures); + ib_logf(IB_LOG_LEVEL_INFO, + "Consider increasing the buffer pool size."); + ib_logf(IB_LOG_LEVEL_INFO, + "Pending flushes (fsync) log: " ULINTPF + " buffer pool: " ULINTPF + " OS file reads: " ULINTPF " OS file writes: " + ULINTPF " OS fsyncs: " ULINTPF "", + fil_n_pending_log_flushes, + fil_n_pending_tablespace_flushes, + os_n_file_reads, + os_n_file_writes, + os_n_fsyncs); + + buf_lru_free_blocks_error_printed = true; } /* If we have scanned the whole LRU and still are unable to @@ -1916,8 +1908,7 @@ buf_LRU_block_free_non_file_page( UT_LIST_ADD_FIRST(list, buf_pool->free, (&block->page)); ut_d(block->page.in_free_list = TRUE); - - UNIV_MEM_ASSERT_AND_FREE(block->frame, UNIV_PAGE_SIZE); + UNIV_MEM_FREE(block->frame, UNIV_PAGE_SIZE); } /******************************************************************//** diff --git a/storage/innobase/data/data0type.cc b/storage/innobase/data/data0type.cc index 0b9e0854..34ca399f 100644 --- a/storage/innobase/data/data0type.cc +++ b/storage/innobase/data/data0type.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2011, 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 @@ -49,8 +50,10 @@ ulint dtype_get_at_most_n_mbchars( /*========================*/ ulint prtype, /*!< in: precise type */ - ulint mbminmaxlen, /*!< in: minimum and maximum length of - a multi-byte character */ + ulint mbminlen, /*!< in: minimum length of + a multi-byte character, in bytes */ + ulint mbmaxlen, /*!< in: maximum length of + a multi-byte character, in bytes */ ulint prefix_len, /*!< in: length of the requested prefix, in characters, multiplied by dtype_get_mbmaxlen(dtype) */ @@ -58,9 +61,6 @@ dtype_get_at_most_n_mbchars( const char* str) /*!< in: the string whose prefix length is being determined */ { - ulint mbminlen = DATA_MBMINLEN(mbminmaxlen); - ulint mbmaxlen = DATA_MBMAXLEN(mbminmaxlen); - ut_a(data_len != UNIV_SQL_NULL); ut_ad(!mbmaxlen || !(prefix_len % mbmaxlen)); diff --git a/storage/innobase/dict/dict0dict.cc b/storage/innobase/dict/dict0dict.cc index 8d7c1275..7ec4364b 100644 --- a/storage/innobase/dict/dict0dict.cc +++ b/storage/innobase/dict/dict0dict.cc @@ -3398,6 +3398,7 @@ dict_foreign_find_index( if (types_idx != index && !(index->type & DICT_FTS) && !index->to_be_dropped + && !dict_index_is_online_ddl(index) && dict_foreign_qualify_index( table, col_names, columns, n_cols, index, types_idx, diff --git a/storage/innobase/dict/dict0mem.cc b/storage/innobase/dict/dict0mem.cc index 0e5e9f65..dd8155c0 100644 --- a/storage/innobase/dict/dict0mem.cc +++ b/storage/innobase/dict/dict0mem.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 @@ -319,8 +319,8 @@ dict_mem_table_col_rename_low( ut_ad(from_len <= NAME_LEN); ut_ad(to_len <= NAME_LEN); - char from[NAME_LEN]; - strncpy(from, s, NAME_LEN); + char from[NAME_LEN + 1]; + strncpy(from, s, NAME_LEN + 1); if (from_len == to_len) { /* The easy case: simply replace the column name in @@ -532,7 +532,8 @@ dict_mem_fill_column_struct( column->len = (unsigned int) col_len; #ifndef UNIV_HOTBACKUP dtype_get_mblen(mtype, prtype, &mbminlen, &mbmaxlen); - dict_col_set_mbminmaxlen(column, mbminlen, mbmaxlen); + column->mbminlen = mbminlen; + column->mbmaxlen = mbmaxlen; #endif /* !UNIV_HOTBACKUP */ } diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index c9ecf3da..b4102e48 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -2074,7 +2074,7 @@ fil_write_flushed_lsn( { byte* buf1; byte* buf; - dberr_t err; + dberr_t err = DB_TABLESPACE_NOT_FOUND; buf1 = static_cast(ut_malloc(2 * UNIV_PAGE_SIZE)); buf = static_cast(ut_align(buf1, UNIV_PAGE_SIZE)); diff --git a/storage/innobase/fts/fts0fts.cc b/storage/innobase/fts/fts0fts.cc index 2ba58c9a..dc121083 100644 --- a/storage/innobase/fts/fts0fts.cc +++ b/storage/innobase/fts/fts0fts.cc @@ -2001,7 +2001,7 @@ fts_create_one_index_table( ? DATA_VARCHAR : DATA_VARMYSQL, field->col->prtype, FTS_MAX_WORD_LEN_IN_CHAR - * DATA_MBMAXLEN(field->col->mbminmaxlen)); + * field->col->mbmaxlen); dict_mem_table_add_col(new_table, heap, "first_doc_id", DATA_INT, DATA_NOT_NULL | DATA_UNSIGNED, @@ -3362,8 +3362,7 @@ fts_fetch_doc_from_rec( dict_table_zip_size(table), clust_pos, &doc->text.f_len, static_cast( - doc->self_heap->arg), - NULL); + doc->self_heap->arg)); } else { doc->text.f_str = (byte*) rec_get_nth_field( clust_rec, offsets, clust_pos, @@ -4762,9 +4761,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; @@ -7592,8 +7599,7 @@ fts_init_recover_doc( &doc.text.f_len, static_cast(dfield_get_data(dfield)), zip_size, len, - static_cast(doc.self_heap->arg), - NULL); + static_cast(doc.self_heap->arg)); } else { doc.text.f_str = static_cast( dfield_get_data(dfield)); diff --git a/storage/innobase/fts/fts0que.cc b/storage/innobase/fts/fts0que.cc index b8743099..3a543836 100644 --- a/storage/innobase/fts/fts0que.cc +++ b/storage/innobase/fts/fts0que.cc @@ -1917,8 +1917,7 @@ fts_query_fetch_document( if (dfield_is_ext(dfield)) { data = btr_copy_externally_stored_field( &cur_len, data, phrase->zip_size, - dfield_get_len(dfield), phrase->heap, - NULL); + dfield_get_len(dfield), phrase->heap); } else { cur_len = dfield_get_len(dfield); } @@ -3763,10 +3762,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/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index a45b63d0..b66f7487 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -3094,13 +3094,13 @@ innobase_convert_identifier( ibool file_id)/*!< in: TRUE=id is a table or database name; FALSE=id is an UTF-8 string */ { + char nz2[MAX_TABLE_NAME_LEN + 1]; const char* s = id; int q; if (file_id) { char nz[MAX_TABLE_NAME_LEN + 1]; - char nz2[MAX_TABLE_NAME_LEN + 1]; /* Decode the table name. The MySQL function expects a NUL-terminated string. The input and output strings @@ -13109,7 +13109,7 @@ ha_innobase::records_in_range( n_rows = btr_estimate_n_rows_in_range(index, range_start, mode1, range_end, - mode2, prebuilt->trx); + mode2); } else { n_rows = HA_POS_ERROR; diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index bdc4987b..f8e61631 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2005, 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 @@ -1197,8 +1197,7 @@ innobase_col_to_mysql( #ifdef UNIV_DEBUG case DATA_MYSQL: ut_ad(flen >= len); - ut_ad(DATA_MBMAXLEN(col->mbminmaxlen) - >= DATA_MBMINLEN(col->mbminmaxlen)); + ut_ad(col->mbmaxlen >= col->mbminlen); memcpy(dest, data, len); break; diff --git a/storage/innobase/ibuf/ibuf0ibuf.cc b/storage/innobase/ibuf/ibuf0ibuf.cc index c621ed5f..2b406e11 100644 --- a/storage/innobase/ibuf/ibuf0ibuf.cc +++ b/storage/innobase/ibuf/ibuf0ibuf.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 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 @@ -4603,7 +4603,7 @@ ibuf_merge_or_delete_for_page( function. When the counter is > 0, that prevents tablespace from being dropped. */ - space = fil_space_acquire(space_id); + space = fil_space_acquire_silent(space_id); if (UNIV_UNLIKELY(!space)) { /* Do not try to read the bitmap page from space; diff --git a/storage/innobase/include/btr0cur.h b/storage/innobase/include/btr0cur.h index 30010da9..51ff300f 100644 --- a/storage/innobase/include/btr0cur.h +++ b/storage/innobase/include/btr0cur.h @@ -566,8 +566,7 @@ btr_estimate_n_rows_in_range( const dtuple_t* tuple1, /*!< in: range start, may also be empty tuple */ ulint mode1, /*!< in: search mode for range start */ const dtuple_t* tuple2, /*!< in: range end, may also be empty tuple */ - ulint mode2, /*!< in: search mode for range end */ - trx_t* trx); /*!< in: trx */ + ulint mode2); /*!< in: search mode for range end */ /*******************************************************************//** Estimates the number of different key values in a given index, for each n-column prefix of the index where 1 <= n <= dict_index_get_n_unique(index). @@ -703,8 +702,7 @@ btr_copy_externally_stored_field_prefix( field containing also the reference to the external part; must be protected by a lock or a page latch */ - ulint local_len,/*!< in: length of data, in bytes */ - trx_t* trx); /*!< in: transaction handle */ + ulint local_len);/*!< in: length of data, in bytes */ /*******************************************************************//** Copies an externally stored field of a record to mem heap. The clustered index record must be protected by a lock or a page latch. @@ -721,8 +719,7 @@ btr_copy_externally_stored_field( ulint zip_size,/*!< in: nonzero=compressed BLOB page size, zero for uncompressed BLOBs */ ulint local_len,/*!< in: length of data */ - mem_heap_t* heap, /*!< in: mem heap */ - trx_t* trx); /*!< in: transaction handle */ + mem_heap_t* heap); /*!< in: mem heap */ /*******************************************************************//** Copies an externally stored field of a record to mem heap. @return the field copied to heap, or NULL if the field is incomplete */ @@ -737,8 +734,7 @@ btr_rec_copy_externally_stored_field( zero for uncompressed BLOBs */ ulint no, /*!< in: field number */ ulint* len, /*!< out: length of the field */ - mem_heap_t* heap, /*!< in: mem heap */ - trx_t* trx); /*!< in: transaction handle */ + mem_heap_t* heap); /*!< in: mem heap */ /*******************************************************************//** Flags the data tuple fields that are marked as extern storage in the update vector. We use this function to remember which fields we must diff --git a/storage/innobase/include/data0type.h b/storage/innobase/include/data0type.h index 111664b0..28182782 100644 --- a/storage/innobase/include/data0type.h +++ b/storage/innobase/include/data0type.h @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2012, 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 @@ -181,18 +182,7 @@ store the charset-collation number; one byte is left unused, though */ #define DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE 6 /* Maximum multi-byte character length in bytes, plus 1 */ -#define DATA_MBMAX 5 - -/* Pack mbminlen, mbmaxlen to mbminmaxlen. */ -#define DATA_MBMINMAXLEN(mbminlen, mbmaxlen) \ - ((mbmaxlen) * DATA_MBMAX + (mbminlen)) -/* Get mbminlen from mbminmaxlen. Cast the result of UNIV_EXPECT to ulint -because in GCC it returns a long. */ -#define DATA_MBMINLEN(mbminmaxlen) ((ulint) \ - UNIV_EXPECT(((mbminmaxlen) % DATA_MBMAX), \ - 1)) -/* Get mbmaxlen from mbminmaxlen. */ -#define DATA_MBMAXLEN(mbminmaxlen) ((ulint) ((mbminmaxlen) / DATA_MBMAX)) +#define DATA_MBMAX 8 /* We now support 15 bits (up to 32767) collation number */ #define MAX_CHAR_COLL_NUM 32767 @@ -219,8 +209,10 @@ ulint dtype_get_at_most_n_mbchars( /*========================*/ ulint prtype, /*!< in: precise type */ - ulint mbminmaxlen, /*!< in: minimum and maximum length of - a multi-byte character */ + ulint mbminlen, /*!< in: minimum length of + a multi-byte character, in bytes */ + ulint mbmaxlen, /*!< in: maximum length of + a multi-byte character, in bytes */ ulint prefix_len, /*!< in: length of the requested prefix, in characters, multiplied by dtype_get_mbmaxlen(dtype) */ @@ -365,19 +357,6 @@ dtype_get_mbmaxlen( /*===============*/ const dtype_t* type); /*!< in: type */ /*********************************************************************//** -Sets the minimum and maximum length of a character, in bytes. */ -UNIV_INLINE -void -dtype_set_mbminmaxlen( -/*==================*/ - dtype_t* type, /*!< in/out: type */ - ulint mbminlen, /*!< in: minimum length of a char, - in bytes, or 0 if this is not - a character type */ - ulint mbmaxlen); /*!< in: maximum length of a char, - in bytes, or 0 if this is not - a character type */ -/*********************************************************************//** Gets the padding character code for the type. @return padding character code, or ULINT_UNDEFINED if no padding specified */ UNIV_INLINE @@ -397,7 +376,9 @@ dtype_get_fixed_size_low( ulint mtype, /*!< in: main type */ ulint prtype, /*!< in: precise type */ ulint len, /*!< in: length */ - ulint mbminmaxlen, /*!< in: minimum and maximum length of a + ulint mbminlen, /*!< in: minimum length of a + multibyte character, in bytes */ + ulint mbmaxlen, /*!< in: maximum length of a multibyte character, in bytes */ ulint comp); /*!< in: nonzero=ROW_FORMAT=COMPACT */ #ifndef UNIV_HOTBACKUP @@ -411,8 +392,8 @@ dtype_get_min_size_low( ulint mtype, /*!< in: main type */ ulint prtype, /*!< in: precise type */ ulint len, /*!< in: length */ - ulint mbminmaxlen); /*!< in: minimum and maximum length of a - multibyte character */ + ulint mbminlen, /*!< in: minimum length of a character */ + ulint mbmaxlen); /*!< in: maximum length of a character */ /***********************************************************************//** Returns the maximum size of a data type. Note: types in system tables may be incomplete and return incorrect information. @@ -529,11 +510,10 @@ struct dtype_t{ the string, MySQL uses 1 or 2 bytes to store the string length) */ #ifndef UNIV_HOTBACKUP - unsigned mbminmaxlen:5; /*!< minimum and maximum length of a - character, in bytes; - DATA_MBMINMAXLEN(mbminlen,mbmaxlen); - mbminlen=DATA_MBMINLEN(mbminmaxlen); - mbmaxlen=DATA_MBMINLEN(mbminmaxlen) */ + unsigned mbminlen:3; /*!< minimum length of a character, + in bytes */ + unsigned mbmaxlen:3; /*!< maximum length of a character, + in bytes */ #endif /* !UNIV_HOTBACKUP */ }; diff --git a/storage/innobase/include/data0type.ic b/storage/innobase/include/data0type.ic index bf433036..eaa90f6d 100644 --- a/storage/innobase/include/data0type.ic +++ b/storage/innobase/include/data0type.ic @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2012, 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 @@ -103,27 +103,6 @@ dtype_get_mblen( } } -/*********************************************************************//** -Sets the minimum and maximum length of a character, in bytes. */ -UNIV_INLINE -void -dtype_set_mbminmaxlen( -/*==================*/ - dtype_t* type, /*!< in/out: type */ - ulint mbminlen, /*!< in: minimum length of a char, - in bytes, or 0 if this is not - a character type */ - ulint mbmaxlen) /*!< in: maximum length of a char, - in bytes, or 0 if this is not - a character type */ -{ - ut_ad(mbminlen < DATA_MBMAX); - ut_ad(mbmaxlen < DATA_MBMAX); - ut_ad(mbminlen <= mbmaxlen); - - type->mbminmaxlen = DATA_MBMINMAXLEN(mbminlen, mbmaxlen); -} - /*********************************************************************//** Compute the mbminlen and mbmaxlen members of a data type structure. */ UNIV_INLINE @@ -136,7 +115,8 @@ dtype_set_mblen( ulint mbmaxlen; dtype_get_mblen(type->mtype, type->prtype, &mbminlen, &mbmaxlen); - dtype_set_mbminmaxlen(type, mbminlen, mbmaxlen); + type->mbminlen = mbminlen; + type->mbmaxlen = mbmaxlen; ut_ad(dtype_validate(type)); } @@ -232,8 +212,7 @@ dtype_get_mbminlen( /*===============*/ const dtype_t* type) /*!< in: type */ { - ut_ad(type); - return(DATA_MBMINLEN(type->mbminmaxlen)); + return type->mbminlen; } /*********************************************************************//** Gets the maximum length of a character, in bytes. @@ -245,8 +224,7 @@ dtype_get_mbmaxlen( /*===============*/ const dtype_t* type) /*!< in: type */ { - ut_ad(type); - return(DATA_MBMAXLEN(type->mbminmaxlen)); + return type->mbmaxlen; } /*********************************************************************//** @@ -522,8 +500,10 @@ dtype_get_fixed_size_low( ulint mtype, /*!< in: main type */ ulint prtype, /*!< in: precise type */ ulint len, /*!< in: length */ - ulint mbminmaxlen, /*!< in: minimum and maximum length of - a multibyte character, in bytes */ + ulint mbminlen, /*!< in: minimum length of a + multibyte character, in bytes */ + ulint mbmaxlen, /*!< in: maximum length of a + multibyte character, in bytes */ ulint comp) /*!< in: nonzero=ROW_FORMAT=COMPACT */ { switch (mtype) { @@ -564,11 +544,10 @@ dtype_get_fixed_size_low( dtype_get_charset_coll(prtype), &i_mbminlen, &i_mbmaxlen); - ut_ad(DATA_MBMINMAXLEN(i_mbminlen, i_mbmaxlen) - == mbminmaxlen); + ut_ad(i_mbminlen == mbminlen); + ut_ad(i_mbmaxlen == mbmaxlen); #endif /* UNIV_DEBUG */ - if (DATA_MBMINLEN(mbminmaxlen) - == DATA_MBMAXLEN(mbminmaxlen)) { + if (mbminlen == mbmaxlen) { return(len); } } @@ -601,8 +580,8 @@ dtype_get_min_size_low( ulint mtype, /*!< in: main type */ ulint prtype, /*!< in: precise type */ ulint len, /*!< in: length */ - ulint mbminmaxlen) /*!< in: minimum and maximum length of a - multi-byte character */ + ulint mbminlen, /*!< in: minimum length of a character */ + ulint mbmaxlen) /*!< in: maximum length of a character */ { switch (mtype) { case DATA_SYS: @@ -632,9 +611,6 @@ dtype_get_min_size_low( if (prtype & DATA_BINARY_TYPE) { return(len); } else { - ulint mbminlen = DATA_MBMINLEN(mbminmaxlen); - ulint mbmaxlen = DATA_MBMAXLEN(mbminmaxlen); - if (mbminlen == mbmaxlen) { return(len); } @@ -705,9 +681,9 @@ dtype_get_sql_null_size( { #ifndef UNIV_HOTBACKUP return(dtype_get_fixed_size_low(type->mtype, type->prtype, type->len, - type->mbminmaxlen, comp)); + type->mbminlen, type->mbmaxlen, comp)); #else /* !UNIV_HOTBACKUP */ return(dtype_get_fixed_size_low(type->mtype, type->prtype, type->len, - 0, 0)); + 0, 0, 0)); #endif /* !UNIV_HOTBACKUP */ } diff --git a/storage/innobase/include/dict0dict.h b/storage/innobase/include/dict0dict.h index 0d5ade16..7011f4a9 100644 --- a/storage/innobase/include/dict0dict.h +++ b/storage/innobase/include/dict0dict.h @@ -2,7 +2,7 @@ Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2013, 2015, 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 @@ -197,18 +197,6 @@ dict_col_get_mbmaxlen( const dict_col_t* col) /*!< in: column */ MY_ATTRIBUTE((nonnull, warn_unused_result)); /*********************************************************************//** -Sets the minimum and maximum number of bytes per character. */ -UNIV_INLINE -void -dict_col_set_mbminmaxlen( -/*=====================*/ - dict_col_t* col, /*!< in/out: column */ - ulint mbminlen, /*!< in: minimum multi-byte - character size, in bytes */ - ulint mbmaxlen) /*!< in: minimum multi-byte - character size, in bytes */ - MY_ATTRIBUTE((nonnull)); -/*********************************************************************//** Gets the column data type. */ UNIV_INLINE void diff --git a/storage/innobase/include/dict0dict.ic b/storage/innobase/include/dict0dict.ic index 22b96a58..bc72d441 100644 --- a/storage/innobase/include/dict0dict.ic +++ b/storage/innobase/include/dict0dict.ic @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 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 @@ -41,7 +41,7 @@ dict_col_get_mbminlen( /*==================*/ const dict_col_t* col) /*!< in: column */ { - return(DATA_MBMINLEN(col->mbminmaxlen)); + return col->mbminlen; } /*********************************************************************//** Gets the maximum number of bytes per character. @@ -52,25 +52,7 @@ dict_col_get_mbmaxlen( /*==================*/ const dict_col_t* col) /*!< in: column */ { - return(DATA_MBMAXLEN(col->mbminmaxlen)); -} -/*********************************************************************//** -Sets the minimum and maximum number of bytes per character. */ -UNIV_INLINE -void -dict_col_set_mbminmaxlen( -/*=====================*/ - dict_col_t* col, /*!< in/out: column */ - ulint mbminlen, /*!< in: minimum multi-byte - character size, in bytes */ - ulint mbmaxlen) /*!< in: minimum multi-byte - character size, in bytes */ -{ - ut_ad(mbminlen < DATA_MBMAX); - ut_ad(mbmaxlen < DATA_MBMAX); - ut_ad(mbminlen <= mbmaxlen); - - col->mbminmaxlen = DATA_MBMINMAXLEN(mbminlen, mbmaxlen); + return col->mbmaxlen; } /*********************************************************************//** Gets the column data type. */ @@ -87,7 +69,8 @@ dict_col_copy_type( type->mtype = col->mtype; type->prtype = col->prtype; type->len = col->len; - type->mbminmaxlen = col->mbminmaxlen; + type->mbminlen = col->mbminlen; + type->mbmaxlen = col->mbmaxlen; } #endif /* !UNIV_HOTBACKUP */ @@ -109,7 +92,8 @@ dict_col_type_assert_equal( ut_ad(col->prtype == type->prtype); //ut_ad(col->len == type->len); # ifndef UNIV_HOTBACKUP - ut_ad(col->mbminmaxlen == type->mbminmaxlen); + ut_ad(col->mbminlen == type->mbminlen); + ut_ad(col->mbmaxlen == type->mbmaxlen); # endif /* !UNIV_HOTBACKUP */ return(TRUE); @@ -127,7 +111,7 @@ dict_col_get_min_size( const dict_col_t* col) /*!< in: column */ { return(dtype_get_min_size_low(col->mtype, col->prtype, col->len, - col->mbminmaxlen)); + col->mbminlen, col->mbmaxlen)); } /***********************************************************************//** Returns the maximum size of the column. @@ -152,7 +136,7 @@ dict_col_get_fixed_size( ulint comp) /*!< in: nonzero=ROW_FORMAT=COMPACT */ { return(dtype_get_fixed_size_low(col->mtype, col->prtype, col->len, - col->mbminmaxlen, comp)); + col->mbminlen, col->mbmaxlen, comp)); } /***********************************************************************//** Returns the ROW_FORMAT=REDUNDANT stored SQL NULL size of a column. diff --git a/storage/innobase/include/dict0mem.h b/storage/innobase/include/dict0mem.h index 9a6cc0aa..3c9bd804 100644 --- a/storage/innobase/include/dict0mem.h +++ b/storage/innobase/include/dict0mem.h @@ -2,7 +2,7 @@ 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 @@ -526,11 +526,10 @@ struct dict_col_t{ the string, MySQL uses 1 or 2 bytes to store the string length) */ - unsigned mbminmaxlen:5; /*!< minimum and maximum length of a - character, in bytes; - DATA_MBMINMAXLEN(mbminlen,mbmaxlen); - mbminlen=DATA_MBMINLEN(mbminmaxlen); - mbmaxlen=DATA_MBMINLEN(mbminmaxlen) */ + unsigned mbminlen:3; /*!< minimum length of a + character, in bytes */ + unsigned mbmaxlen:3; /*!< maximum length of a + character, in bytes */ /*----------------------*/ /* End of definitions copied from dtype_t */ /* @} */ diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h index 81f207d1..312b09e1 100644 --- a/storage/innobase/include/fil0fil.h +++ b/storage/innobase/include/fil0fil.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 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 diff --git a/storage/innobase/include/log0crypt.h b/storage/innobase/include/log0crypt.h index 0ad7e7d7..b7a221e0 100644 --- a/storage/innobase/include/log0crypt.h +++ b/storage/innobase/include/log0crypt.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (C) 2013, 2015, Google Inc. All Rights Reserved. -Copyright (C) 2014, 2017, MariaDB Corporation. 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 @@ -73,6 +73,8 @@ log_encrypt_before_write( /*=====================*/ ib_uint64_t next_checkpoint_no, /*!< in: log group to be flushed */ byte* block, /*!< in/out: pointer to a log block */ + lsn_t lsn, /*!< in: log sequence number of + the start of the buffer */ const ulint size); /*!< in: size of log blocks */ /******************************************************** @@ -83,6 +85,8 @@ void log_decrypt_after_read( /*===================*/ byte* frame, /*!< in/out: log segment */ + lsn_t lsn, /*!< in: log sequence number of the start + of the buffer */ const ulint size); /*!< in: log segment size */ /* Error codes for crypt info */ diff --git a/storage/innobase/include/mem0mem.ic b/storage/innobase/include/mem0mem.ic index 63e68150..2b463871 100644 --- a/storage/innobase/include/mem0mem.ic +++ b/storage/innobase/include/mem0mem.ic @@ -305,8 +305,8 @@ mem_heap_free_heap_top( mem_block_set_free(block, old_top - (byte*) block); ut_ad(mem_block_get_start(block) <= mem_block_get_free(block)); - UNIV_MEM_ASSERT_W(old_top, (byte*) block + block->len - old_top); #if defined UNIV_MEM_DEBUG + UNIV_MEM_ALLOC(old_top, (byte*)block + block->len - old_top); /* In the debug version erase block from top up */ mem_erase_buf(old_top, (byte*) block + block->len - old_top); @@ -315,7 +315,7 @@ mem_heap_free_heap_top( mem_current_allocated_memory -= (total_size - size); mutex_exit(&mem_hash_mutex); #endif /* UNIV_MEM_DEBUG */ - UNIV_MEM_ALLOC(old_top, (byte*) block + block->len - old_top); + UNIV_MEM_FREE(old_top, (byte*)block + block->len - old_top); /* If free == start, we may free the block if it is not the first one */ @@ -396,11 +396,11 @@ mem_heap_free_top( /* Subtract the free field of block */ mem_block_set_free(block, mem_block_get_free(block) - MEM_SPACE_NEEDED(n)); - UNIV_MEM_ASSERT_W((byte*) block + mem_block_get_free(block), n); #ifdef UNIV_MEM_DEBUG ut_ad(mem_block_get_start(block) <= mem_block_get_free(block)); + UNIV_MEM_ALLOC((byte*) block + mem_block_get_free(block), n); /* In the debug version check the consistency, and erase field */ mem_field_erase((byte*) block + mem_block_get_free(block), n); #endif @@ -412,11 +412,7 @@ mem_heap_free_top( == mem_block_get_start(block))) { mem_heap_block_free(heap, block); } else { - /* Avoid a bogus UNIV_MEM_ASSERT_W() warning in a - subsequent invocation of mem_heap_free_top(). - Originally, this was UNIV_MEM_FREE(), to catch writes - to freed memory. */ - UNIV_MEM_ALLOC((byte*) block + mem_block_get_free(block), n); + UNIV_MEM_FREE((byte*) block + mem_block_get_free(block), n); } } diff --git a/storage/innobase/include/mtr0mtr.h b/storage/innobase/include/mtr0mtr.h index c3307985..1df9fba5 100644 --- a/storage/innobase/include/mtr0mtr.h +++ b/storage/innobase/include/mtr0mtr.h @@ -36,7 +36,6 @@ Created 11/26/1995 Heikki Tuuri #include "ut0byte.h" #include "mtr0types.h" #include "page0types.h" -#include "trx0types.h" /* Logging modes for a mini-transaction */ #define MTR_LOG_ALL 21 /* default mode: log all operations @@ -210,15 +209,6 @@ functions). The page number parameter was originally written as 0. @{ */ /* included here because it needs MLOG_LSN defined */ #include "log0log.h" -/***************************************************************//** -Starts a mini-transaction. */ -UNIV_INLINE -void -mtr_start_trx( -/*======*/ - mtr_t* mtr, /*!< out: mini-transaction */ - trx_t* trx) /*!< in: transaction */ - MY_ATTRIBUTE((nonnull (1))); /***************************************************************//** Starts a mini-transaction. */ UNIV_INLINE @@ -226,10 +216,7 @@ void mtr_start( /*======*/ mtr_t* mtr) /*!< out: mini-transaction */ -{ - mtr_start_trx(mtr, NULL); -} - MY_ATTRIBUTE((nonnull)) + MY_ATTRIBUTE((nonnull)); /***************************************************************//** Commits a mini-transaction. */ UNIV_INTERN @@ -437,7 +424,6 @@ struct mtr_t{ #ifdef UNIV_DEBUG ulint magic_n; #endif /* UNIV_DEBUG */ - trx_t* trx; /*!< transaction */ }; #ifdef UNIV_DEBUG diff --git a/storage/innobase/include/mtr0mtr.ic b/storage/innobase/include/mtr0mtr.ic index 37cea34d..3f897ae1 100644 --- a/storage/innobase/include/mtr0mtr.ic +++ b/storage/innobase/include/mtr0mtr.ic @@ -43,10 +43,9 @@ mtr_block_dirtied( Starts a mini-transaction. */ UNIV_INLINE void -mtr_start_trx( +mtr_start( /*======*/ - mtr_t* mtr, /*!< out: mini-transaction */ - trx_t* trx) /*!< in: transaction */ + mtr_t* mtr) /*!< out: mini-transaction */ { UNIV_MEM_INVALID(mtr, sizeof *mtr); @@ -59,7 +58,6 @@ mtr_start_trx( mtr->made_dirty = FALSE; mtr->n_log_recs = 0; mtr->n_freed_pages = 0; - mtr->trx = trx; ut_d(mtr->state = MTR_ACTIVE); ut_d(mtr->magic_n = MTR_MAGIC_N); diff --git a/storage/innobase/include/rem0rec.ic b/storage/innobase/include/rem0rec.ic index 5811a77a..89f69020 100644 --- a/storage/innobase/include/rem0rec.ic +++ b/storage/innobase/include/rem0rec.ic @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1994, 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 @@ -922,7 +923,7 @@ rec_offs_set_n_alloc( { ut_ad(offsets); ut_ad(n_alloc > REC_OFFS_HEADER_SIZE); - UNIV_MEM_ASSERT_AND_ALLOC(offsets, n_alloc * sizeof *offsets); + UNIV_MEM_ALLOC(offsets, n_alloc * sizeof *offsets); offsets[0] = n_alloc; } diff --git a/storage/innobase/include/row0mysql.h b/storage/innobase/include/row0mysql.h index 71e3b9bb..a38e9b6b 100644 --- a/storage/innobase/include/row0mysql.h +++ b/storage/innobase/include/row0mysql.h @@ -589,18 +589,6 @@ void row_mysql_close(void); /*=================*/ -/*********************************************************************//** -Reassigns the table identifier of a table. -@return error code or DB_SUCCESS */ -UNIV_INTERN -dberr_t -row_mysql_table_id_reassign( -/*========================*/ - dict_table_t* table, /*!< in/out: table */ - trx_t* trx, /*!< in/out: transaction */ - table_id_t* new_id) /*!< out: new table id */ - MY_ATTRIBUTE((nonnull, warn_unused_result)); - /* A struct describing a place for an individual column in the MySQL row format which is presented to the table handler in ha_innobase. This template struct is used to speed up row transformations between diff --git a/storage/innobase/include/trx0rec.h b/storage/innobase/include/trx0rec.h index 630818a8..ec15250e 100644 --- a/storage/innobase/include/trx0rec.h +++ b/storage/innobase/include/trx0rec.h @@ -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 @@ -196,6 +196,7 @@ trx_undo_rec_get_partial_row( used, as we do NOT copy the data in the record! */ dict_index_t* index, /*!< in: clustered index */ + const upd_t* update, /*!< in: updated columns */ dtuple_t** row, /*!< out, own: partial row */ ibool ignore_prefix, /*!< in: flag to indicate if we expect blob prefixes in undo. Used diff --git a/storage/innobase/include/trx0undo.h b/storage/innobase/include/trx0undo.h index 42ac6291..266ca325 100644 --- a/storage/innobase/include/trx0undo.h +++ b/storage/innobase/include/trx0undo.h @@ -246,13 +246,22 @@ Truncates an undo log from the end. This function is used during a rollback to free space from an undo log. */ UNIV_INTERN void -trx_undo_truncate_end( +trx_undo_truncate_end_func( /*=======================*/ - trx_t* trx, /*!< in: transaction whose undo log it is */ +#ifdef UNIV_DEBUG + const trx_t* trx, /*!< in: transaction whose undo log it is */ +#endif /* UNIV_DEBUG */ trx_undo_t* undo, /*!< in/out: undo log */ undo_no_t limit) /*!< in: all undo records with undo number >= this value should be truncated */ MY_ATTRIBUTE((nonnull)); +#ifdef UNIV_DEBUG +# define trx_undo_truncate_end(trx,undo,limit) \ + trx_undo_truncate_end_func(trx,undo,limit) +#else /* UNIV_DEBUG */ +# define trx_undo_truncate_end(trx,undo,limit) \ + trx_undo_truncate_end_func(undo,limit) +#endif /* UNIV_DEBUG */ /***********************************************************************//** Truncates an undo log from the start. This function is used during a purge diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i index f00cb179..24bcab56 100644 --- a/storage/innobase/include/univ.i +++ b/storage/innobase/include/univ.i @@ -677,14 +677,6 @@ typedef void* os_thread_ret_t; # define UNIV_MEM_ASSERT_W(addr, size) do {} while(0) # define UNIV_MEM_TRASH(addr, c, size) do {} while(0) #endif -#define UNIV_MEM_ASSERT_AND_FREE(addr, size) do { \ - UNIV_MEM_ASSERT_W(addr, size); \ - UNIV_MEM_FREE(addr, size); \ -} while (0) -#define UNIV_MEM_ASSERT_AND_ALLOC(addr, size) do { \ - UNIV_MEM_ASSERT_W(addr, size); \ - UNIV_MEM_ALLOC(addr, size); \ -} while (0) extern ulong srv_page_size_shift; extern ulong srv_page_size; diff --git a/storage/innobase/include/ut0ut.h b/storage/innobase/include/ut0ut.h index cdf517ce..ffdb13dd 100644 --- a/storage/innobase/include/ut0ut.h +++ b/storage/innobase/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 @@ -291,6 +291,7 @@ UNIV_INTERN ulint ut_time_ms(void); /*============*/ + #endif /* !UNIV_HOTBACKUP */ /**********************************************************//** diff --git a/storage/innobase/lock/lock0lock.cc b/storage/innobase/lock/lock0lock.cc index 61385891..64e7a8b9 100644 --- a/storage/innobase/lock/lock0lock.cc +++ b/storage/innobase/lock/lock0lock.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 @@ -6910,7 +6910,7 @@ lock_rec_block_validate( /* Make sure that the tablespace is not deleted while we are trying to access the page. */ - if (fil_space_t* space = fil_space_acquire(space_id)) { + if (fil_space_t* space = fil_space_acquire_silent(space_id)) { mtr_start(&mtr); block = buf_page_get_gen( diff --git a/storage/innobase/log/log0crypt.cc b/storage/innobase/log/log0crypt.cc index 13d69118..ec3c72ca 100644 --- a/storage/innobase/log/log0crypt.cc +++ b/storage/innobase/log/log0crypt.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (C) 2013, 2015, Google Inc. All Rights Reserved. -Copyright (C) 2014, 2017, MariaDB Corporation. 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 @@ -70,22 +70,6 @@ struct crypt_info_t { static std::deque crypt_info; -/*********************************************************************//** -Get a log block's start lsn. -@return a log block's start lsn */ -static inline -lsn_t -log_block_get_start_lsn( -/*====================*/ - lsn_t lsn, /*!< in: checkpoint lsn */ - ulint log_block_no) /*!< in: log block number */ -{ - lsn_t start_lsn = - (lsn & (lsn_t)0xffffffff00000000ULL) | - (((log_block_no - 1) & (lsn_t)0x3fffffff) << 9); - return start_lsn; -} - /*********************************************************************//** Get crypt info from checkpoint. @return a crypt info or NULL if not present. */ @@ -162,6 +146,8 @@ Crypt_result log_blocks_crypt( /*=============*/ const byte* block, /*!< in: blocks before encrypt/decrypt*/ + lsn_t lsn, /*!< in: log sequence number of the start + of the buffer */ ulint size, /*!< in: size of block */ byte* dst_block, /*!< out: blocks after encrypt/decrypt */ int what, /*!< in: encrypt or decrypt*/ @@ -171,21 +157,18 @@ log_blocks_crypt( Crypt_result rc = MY_AES_OK; uint dst_len; byte aes_ctr_counter[MY_AES_BLOCK_SIZE]; - byte is_encrypt= what == ENCRYPTION_FLAG_ENCRYPT; - lsn_t lsn = is_encrypt ? log_sys->lsn : srv_start_lsn; const uint src_len = OS_FILE_LOG_BLOCK_SIZE - LOG_BLOCK_HDR_SIZE; - for (ulint i = 0; i < size ; i += OS_FILE_LOG_BLOCK_SIZE) { + for (ulint i = 0; i < size ; i += OS_FILE_LOG_BLOCK_SIZE, + lsn += OS_FILE_LOG_BLOCK_SIZE) { ulint log_block_no = log_block_get_hdr_no(log_block); - lsn_t log_block_start_lsn = log_block_get_start_lsn( - lsn, log_block_no); const crypt_info_t* info = crypt_info == NULL ? get_crypt_info(log_block) : crypt_info; #ifdef DEBUG_CRYPT fprintf(stderr, "%s %lu chkpt: %lu key: %u lsn: %lu\n", - is_encrypt ? "crypt" : "decrypt", + what == ENCRYPTION_FLAG_ENCRYPT ? "crypt" : "decrypt", log_block_no, log_block_get_checkpoint_no(log_block), info ? info->key_version : 0, @@ -214,7 +197,7 @@ log_blocks_crypt( // (1-byte, only 5 bits are used). "+" means concatenate. bzero(aes_ctr_counter, MY_AES_BLOCK_SIZE); memcpy(aes_ctr_counter, info->crypt_nonce, 3); - mach_write_to_8(aes_ctr_counter + 3, log_block_start_lsn); + mach_write_to_8(aes_ctr_counter + 3, lsn); mach_write_to_4(aes_ctr_counter + 11, log_block_no); bzero(aes_ctr_counter + 15, 1); @@ -459,19 +442,6 @@ add_crypt_info( return true; } -/*********************************************************************//** -Encrypt log blocks. */ -UNIV_INTERN -Crypt_result -log_blocks_encrypt( -/*===============*/ - const byte* block, /*!< in: blocks before encryption */ - const ulint size, /*!< in: size of blocks, must be multiple of a log block */ - byte* dst_block) /*!< out: blocks after encryption */ -{ - return log_blocks_crypt(block, size, dst_block, ENCRYPTION_FLAG_ENCRYPT, NULL); -} - /*********************************************************************//** Set next checkpoint's key version to latest one, and generate current key. Key version 0 means no encryption. */ @@ -523,6 +493,8 @@ log_encrypt_before_write( /*=====================*/ ib_uint64_t next_checkpoint_no, /*!< in: log group to be flushed */ byte* block, /*!< in/out: pointer to a log block */ + lsn_t lsn, /*!< in: log sequence number of + the start of the buffer */ const ulint size) /*!< in: size of log blocks */ { ut_ad(size % OS_FILE_LOG_BLOCK_SIZE == 0); @@ -541,7 +513,8 @@ log_encrypt_before_write( byte* dst_frame = (byte*)malloc(size); //encrypt log blocks content - Crypt_result result = log_blocks_crypt(block, size, dst_frame, ENCRYPTION_FLAG_ENCRYPT, NULL); + Crypt_result result = log_blocks_crypt( + block, lsn, size, dst_frame, ENCRYPTION_FLAG_ENCRYPT, NULL); if (result == MY_AES_OK) { ut_ad(block[0] == dst_frame[0]); @@ -561,13 +534,16 @@ void log_decrypt_after_read( /*===================*/ byte* frame, /*!< in/out: log segment */ + lsn_t lsn, /*!< in: log sequence number of the start + of the buffer */ const ulint size) /*!< in: log segment size */ { ut_ad(size % OS_FILE_LOG_BLOCK_SIZE == 0); byte* dst_frame = (byte*)malloc(size); // decrypt log blocks content - Crypt_result result = log_blocks_crypt(frame, size, dst_frame, ENCRYPTION_FLAG_DECRYPT, NULL); + Crypt_result result = log_blocks_crypt( + frame, lsn, size, dst_frame, ENCRYPTION_FLAG_DECRYPT, NULL); if (result == MY_AES_OK) { memcpy(frame, dst_frame, size); diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc index 1c9cbc3a..7a242b76 100644 --- a/storage/innobase/log/log0log.cc +++ b/storage/innobase/log/log0log.cc @@ -1380,7 +1380,7 @@ log_group_write_buf( ut_a(next_offset / UNIV_PAGE_SIZE <= ULINT_MAX); log_encrypt_before_write(log_sys->next_checkpoint_no, - buf, write_len); + buf, start_lsn, write_len); fil_io(OS_FILE_WRITE | OS_FILE_LOG, true, group->space_id, 0, (ulint) (next_offset / UNIV_PAGE_SIZE), @@ -2335,7 +2335,7 @@ log_group_read_log_seg( log_block_get_checksum(buf), source_offset); #endif - log_decrypt_after_read(buf, len); + log_decrypt_after_read(buf, start_lsn, len); #ifdef DEBUG_CRYPT fprintf(stderr, "AFTER DECRYPT: block: %lu checkpoint: %lu %.8lx %.8lx\n", @@ -2576,7 +2576,8 @@ log_group_archive( MONITOR_INC(MONITOR_LOG_IO); //TODO (jonaso): This must be dead code?? - log_encrypt_before_write(log_sys->next_checkpoint_no, buf, len); + log_encrypt_before_write(log_sys->next_checkpoint_no, + buf, start_lsn, len); fil_io(OS_FILE_WRITE | OS_FILE_LOG, false, group->archive_space_id, (ulint) (next_offset / UNIV_PAGE_SIZE), diff --git a/storage/innobase/mem/mem0mem.cc b/storage/innobase/mem/mem0mem.cc index e066aff5..b9f19050 100644 --- a/storage/innobase/mem/mem0mem.cc +++ b/storage/innobase/mem/mem0mem.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1994, 2011, 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 @@ -506,13 +507,13 @@ mem_heap_block_free( #ifndef UNIV_HOTBACKUP if (!srv_use_sys_malloc) { #ifdef UNIV_MEM_DEBUG + UNIV_MEM_ALLOC(block, len); /* In the debug version we set the memory to a random combination of hex 0xDE and 0xAD. */ - mem_erase_buf((byte*) block, len); -#else /* UNIV_MEM_DEBUG */ - UNIV_MEM_ASSERT_AND_FREE(block, len); + mem_erase_buf((byte*)block, len); #endif /* UNIV_MEM_DEBUG */ + UNIV_MEM_FREE(block, len); } if (type == MEM_HEAP_DYNAMIC || len < UNIV_PAGE_SIZE / 2) { @@ -526,13 +527,13 @@ mem_heap_block_free( } #else /* !UNIV_HOTBACKUP */ #ifdef UNIV_MEM_DEBUG + UNIV_MEM_ALLOC(block, len); /* In the debug version we set the memory to a random combination of hex 0xDE and 0xAD. */ - mem_erase_buf((byte*) block, len); -#else /* UNIV_MEM_DEBUG */ - UNIV_MEM_ASSERT_AND_FREE(block, len); + mem_erase_buf((byte*)block, len); #endif /* UNIV_MEM_DEBUG */ + UNIV_MEM_FREE(block, len); ut_free(block); #endif /* !UNIV_HOTBACKUP */ } diff --git a/storage/innobase/rem/rem0rec.cc b/storage/innobase/rem/rem0rec.cc index b6bbe334..af32d051 100644 --- a/storage/innobase/rem/rem0rec.cc +++ b/storage/innobase/rem/rem0rec.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1994, 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 @@ -861,13 +862,10 @@ rec_get_converted_size_comp_prefix_low( if (fixed_len) { #ifdef UNIV_DEBUG - ulint mbminlen = DATA_MBMINLEN(col->mbminmaxlen); - ulint mbmaxlen = DATA_MBMAXLEN(col->mbminmaxlen); - ut_ad(len <= fixed_len); - ut_ad(!mbmaxlen || len >= mbminlen - * (fixed_len / mbmaxlen)); + ut_ad(!col->mbmaxlen || len >= col->mbminlen + * (fixed_len / col->mbmaxlen)); /* dict_index_add_col() should guarantee this */ ut_ad(!field->prefix_len @@ -1254,14 +1252,10 @@ rec_convert_dtuple_to_rec_comp( it is 128 or more, or when the field is stored externally. */ if (fixed_len) { #ifdef UNIV_DEBUG - ulint mbminlen = DATA_MBMINLEN( - ifield->col->mbminmaxlen); - ulint mbmaxlen = DATA_MBMAXLEN( - ifield->col->mbminmaxlen); - ut_ad(len <= fixed_len); - ut_ad(!mbmaxlen || len >= mbminlen - * (fixed_len / mbmaxlen)); + ut_ad(!ifield->col->mbmaxlen + || len >= ifield->col->mbminlen + * (fixed_len / ifield->col->mbmaxlen)); ut_ad(!dfield_is_ext(field)); #endif /* UNIV_DEBUG */ } else if (dfield_is_ext(field)) { diff --git a/storage/innobase/row/row0ext.cc b/storage/innobase/row/row0ext.cc index ad852577..32b78391 100644 --- a/storage/innobase/row/row0ext.cc +++ b/storage/innobase/row/row0ext.cc @@ -78,8 +78,7 @@ row_ext_cache_fill( crashed during the execution of btr_free_externally_stored_field(). */ ext->len[i] = btr_copy_externally_stored_field_prefix( - buf, ext->max_len, zip_size, field, f_len, - NULL); + buf, ext->max_len, zip_size, field, f_len); } } } diff --git a/storage/innobase/row/row0ftsort.cc b/storage/innobase/row/row0ftsort.cc index 40ddb3a6..5ab577ce 100644 --- a/storage/innobase/row/row0ftsort.cc +++ b/storage/innobase/row/row0ftsort.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2010, 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 @@ -103,8 +103,9 @@ row_merge_create_fts_sort_index( field->col->prtype = idx_field->col->prtype | DATA_NOT_NULL; field->col->mtype = charset == &my_charset_latin1 ? DATA_VARCHAR : DATA_VARMYSQL; - field->col->mbminmaxlen = idx_field->col->mbminmaxlen; - field->col->len = HA_FT_MAXCHARLEN * DATA_MBMAXLEN(field->col->mbminmaxlen); + field->col->mbminlen = idx_field->col->mbminlen; + field->col->mbmaxlen = idx_field->col->mbmaxlen; + field->col->len = HA_FT_MAXCHARLEN * field->col->mbmaxlen; field->fixed_len = 0; @@ -147,7 +148,8 @@ row_merge_create_fts_sort_index( field->col->prtype = DATA_NOT_NULL | DATA_BINARY_TYPE; - field->col->mbminmaxlen = 0; + field->col->mbminlen = 0; + field->col->mbmaxlen = 0; /* The third field is on the word's position in the original doc */ field = dict_index_get_nth_field(new_index, 2); @@ -159,7 +161,8 @@ row_merge_create_fts_sort_index( field->col->len = 4 ; field->fixed_len = 4; field->col->prtype = DATA_NOT_NULL; - field->col->mbminmaxlen = 0; + field->col->mbminlen = 0; + field->col->mbmaxlen = 0; return(new_index); } @@ -537,7 +540,8 @@ row_merge_fts_doc_tokenize( field->type.mtype = DATA_INT; field->type.prtype = DATA_NOT_NULL | DATA_BINARY_TYPE; field->type.len = len; - field->type.mbminmaxlen = 0; + field->type.mbminlen = 0; + field->type.mbmaxlen = 0; cur_len += len; dfield_dup(field, buf->heap); @@ -556,7 +560,8 @@ row_merge_fts_doc_tokenize( field->type.mtype = DATA_INT; field->type.prtype = DATA_NOT_NULL; field->type.len = len; - field->type.mbminmaxlen = 0; + field->type.mbminlen = 0; + field->type.mbmaxlen = 0; cur_len += len; dfield_dup(field, buf->heap); @@ -706,8 +711,7 @@ fts_parallel_tokenization( doc.text.f_str = btr_copy_externally_stored_field( &doc.text.f_len, data, - zip_size, data_len, blob_heap, - NULL); + zip_size, data_len, blob_heap); } else { doc.text.f_str = data; doc.text.f_len = data_len; diff --git a/storage/innobase/row/row0import.cc b/storage/innobase/row/row0import.cc index 9cf55699..cc5fe0ac 100644 --- a/storage/innobase/row/row0import.cc +++ b/storage/innobase/row/row0import.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2012, 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 @@ -1258,7 +1258,8 @@ row_import::match_table_columns( err = DB_ERROR; } - if (cfg_col->mbminmaxlen != col->mbminmaxlen) { + if (cfg_col->mbminlen != col->mbminlen + || cfg_col->mbmaxlen != col->mbmaxlen) { ib_errf(thd, IB_LOG_LEVEL_ERROR, ER_TABLE_SCHEMA_MISMATCH, @@ -2876,7 +2877,9 @@ row_import_read_columns( col->len = mach_read_from_4(ptr); ptr += sizeof(ib_uint32_t); - col->mbminmaxlen = mach_read_from_4(ptr); + ulint mbminmaxlen = mach_read_from_4(ptr); + col->mbmaxlen = mbminmaxlen / 5; + col->mbminlen = mbminmaxlen % 5; ptr += sizeof(ib_uint32_t); col->ind = mach_read_from_4(ptr); diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc index bc369ad4..c50eaa2a 100644 --- a/storage/innobase/row/row0ins.cc +++ b/storage/innobase/row/row0ins.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 @@ -565,7 +565,8 @@ row_ins_cascade_calc_update_vec( if (!dfield_is_null(&ufield->new_val) && dtype_get_at_most_n_mbchars( - col->prtype, col->mbminmaxlen, + col->prtype, + col->mbminlen, col->mbmaxlen, col->len, ufield_len, static_cast( @@ -1324,7 +1325,7 @@ row_ins_foreign_check_on_constraint( row_mysql_freeze_data_dictionary(thr_get_trx(thr)); - mtr_start_trx(mtr, trx); + mtr_start(mtr); /* Restore pcur position */ @@ -1352,7 +1353,7 @@ row_ins_foreign_check_on_constraint( btr_pcur_store_position(pcur, mtr); mtr_commit(mtr); - mtr_start_trx(mtr, trx); + mtr_start(mtr); btr_pcur_restore_position(BTR_SEARCH_LEAF, pcur, mtr); @@ -1565,7 +1566,7 @@ row_ins_check_foreign_constraint( } } - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); /* Store old value on n_fields_cmp */ @@ -2360,7 +2361,7 @@ row_ins_clust_index_entry_low( || n_uniq == dict_index_get_n_unique(index)); ut_ad(!n_uniq || n_uniq == dict_index_get_n_unique(index)); - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); if (mode == BTR_MODIFY_LEAF && dict_index_is_online_ddl(index)) { mode = BTR_MODIFY_LEAF | BTR_ALREADY_S_LATCHED; @@ -2579,10 +2580,9 @@ Starts a mini-transaction and checks if the index will be dropped. @return true if the index is to be dropped */ static MY_ATTRIBUTE((nonnull, warn_unused_result)) bool -row_ins_sec_mtr_start_trx_and_check_if_aborted( +row_ins_sec_mtr_start_and_check_if_aborted( /*=======================================*/ mtr_t* mtr, /*!< out: mini-transaction */ - trx_t* trx, /*!< in: transaction handle */ dict_index_t* index, /*!< in/out: secondary index */ bool check, /*!< in: whether to check */ ulint search_mode) @@ -2590,7 +2590,7 @@ row_ins_sec_mtr_start_trx_and_check_if_aborted( { ut_ad(!dict_index_is_clust(index)); - mtr_start_trx(mtr, trx); + mtr_start(mtr); if (!check) { return(false); @@ -2648,14 +2648,13 @@ row_ins_sec_index_entry_low( ulint n_unique; mtr_t mtr; ulint* offsets = NULL; - trx_t* trx = thr_get_trx(thr); ut_ad(!dict_index_is_clust(index)); ut_ad(mode == BTR_MODIFY_LEAF || mode == BTR_MODIFY_TREE); cursor.thr = thr; ut_ad(thr_get_trx(thr)->id); - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); /* Ensure that we acquire index->lock when inserting into an index with index->online_status == ONLINE_INDEX_COMPLETE, but @@ -2693,7 +2692,7 @@ row_ins_sec_index_entry_low( if (err != DB_SUCCESS) { if (err == DB_DECRYPTION_FAILED) { - ib_push_warning(trx->mysql_thd, + ib_push_warning(thr_get_trx(thr)->mysql_thd, DB_DECRYPTION_FAILED, "Table %s is encrypted but encryption service or" " used key_id is not available. " @@ -2729,8 +2728,8 @@ row_ins_sec_index_entry_low( DEBUG_SYNC_C("row_ins_sec_index_unique"); - if (row_ins_sec_mtr_start_trx_and_check_if_aborted( - &mtr, trx, index, check, search_mode)) { + if (row_ins_sec_mtr_start_and_check_if_aborted( + &mtr, index, check, search_mode)) { goto func_exit; } @@ -2764,8 +2763,8 @@ row_ins_sec_index_entry_low( return(err); } - if (row_ins_sec_mtr_start_trx_and_check_if_aborted( - &mtr, trx, index, check, search_mode)) { + if (row_ins_sec_mtr_start_and_check_if_aborted( + &mtr, index, check, search_mode)) { goto func_exit; } @@ -3074,7 +3073,7 @@ row_ins_index_entry_set_vals( = dict_field_get_col(ind_field); len = dtype_get_at_most_n_mbchars( - col->prtype, col->mbminmaxlen, + col->prtype, col->mbminlen, col->mbmaxlen, ind_field->prefix_len, len, static_cast( diff --git a/storage/innobase/row/row0log.cc b/storage/innobase/row/row0log.cc index 49627a65..fd5a13bb 100644 --- a/storage/innobase/row/row0log.cc +++ b/storage/innobase/row/row0log.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2011, 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 @@ -1064,7 +1064,7 @@ row_log_table_get_pk_col( mem_heap_alloc(heap, field_len)); len = btr_copy_externally_stored_field_prefix( - blob_field, field_len, zip_size, field, len, NULL); + blob_field, field_len, zip_size, field, len); if (len >= max_len + 1) { return(DB_TOO_BIG_INDEX_COL); } @@ -1183,7 +1183,7 @@ row_log_table_get_pk( dict_field_t* ifield; dfield_t* dfield; ulint prtype; - ulint mbminmaxlen; + ulint mbminlen, mbmaxlen; ifield = dict_index_get_nth_field(new_index, new_i); dfield = dtuple_get_nth_field(tuple, new_i); @@ -1212,7 +1212,8 @@ row_log_table_get_pk( goto func_exit; } - mbminmaxlen = col->mbminmaxlen; + mbminlen = col->mbminlen; + mbmaxlen = col->mbmaxlen; prtype = col->prtype; } else { /* No matching column was found in the old @@ -1222,7 +1223,8 @@ row_log_table_get_pk( dfield_copy(dfield, dtuple_get_nth_field( log->add_cols, col_no)); - mbminmaxlen = dfield->type.mbminmaxlen; + mbminlen = dfield->type.mbminlen; + mbmaxlen = dfield->type.mbmaxlen; prtype = dfield->type.prtype; } @@ -1231,7 +1233,7 @@ row_log_table_get_pk( if (ifield->prefix_len) { ulint len = dtype_get_at_most_n_mbchars( - prtype, mbminmaxlen, + prtype, mbminlen, mbmaxlen, ifield->prefix_len, dfield_get_len(dfield), static_cast( @@ -1455,7 +1457,7 @@ row_log_table_apply_convert_mrec( data = btr_rec_copy_externally_stored_field( mrec, offsets, dict_table_zip_size(index->table), - i, &len, heap, NULL); + i, &len, heap); ut_a(data); dfield_set_data(dfield, data, len); blob_done: diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc index f4120e5f..80ab10cd 100644 --- a/storage/innobase/row/row0merge.cc +++ b/storage/innobase/row/row0merge.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2005, 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 @@ -267,8 +267,8 @@ row_merge_buf_redundant_convert( ulint zip_size, mem_heap_t* heap) { - ut_ad(DATA_MBMINLEN(field->type.mbminmaxlen) == 1); - ut_ad(DATA_MBMAXLEN(field->type.mbminmaxlen) > 1); + ut_ad(field->type.mbminlen == 1); + ut_ad(field->type.mbmaxlen > 1); byte* buf = (byte*) mem_heap_alloc(heap, len); ulint field_len = row_field->len; @@ -284,7 +284,7 @@ row_merge_buf_redundant_convert( field_ref_zero, BTR_EXTERN_FIELD_REF_SIZE)); byte* data = btr_copy_externally_stored_field( - &ext_len, field_data, zip_size, field_len, heap, NULL); + &ext_len, field_data, zip_size, field_len, heap); ut_ad(ext_len < len); @@ -394,7 +394,8 @@ row_merge_buf_add( field->type.mtype = ifield->col->mtype; field->type.prtype = ifield->col->prtype; - field->type.mbminmaxlen = DATA_MBMINMAXLEN(0, 0); + field->type.mbminlen = 0; + field->type.mbmaxlen = 0; field->type.len = ifield->col->len; } else { row_field = dtuple_get_nth_field(row, col_no); @@ -529,7 +530,7 @@ row_merge_buf_add( if (ifield->prefix_len) { len = dtype_get_at_most_n_mbchars( col->prtype, - col->mbminmaxlen, + col->mbminlen, col->mbmaxlen, ifield->prefix_len, len, static_cast(dfield_get_data(field))); @@ -540,8 +541,7 @@ row_merge_buf_add( fixed_len = ifield->fixed_len; if (fixed_len && !dict_table_is_comp(index->table) - && DATA_MBMINLEN(col->mbminmaxlen) - != DATA_MBMAXLEN(col->mbminmaxlen)) { + && col->mbminlen != col->mbmaxlen) { /* CHAR in ROW_FORMAT=REDUNDANT is always fixed-length, but in the temporary file it is variable-length for variable-length character @@ -551,14 +551,11 @@ row_merge_buf_add( if (fixed_len) { #ifdef UNIV_DEBUG - ulint mbminlen = DATA_MBMINLEN(col->mbminmaxlen); - ulint mbmaxlen = DATA_MBMAXLEN(col->mbminmaxlen); - /* len should be between size calcualted base on mbmaxlen and mbminlen */ ut_ad(len <= fixed_len); - ut_ad(!mbmaxlen || len >= mbminlen - * (fixed_len / mbmaxlen)); + ut_ad(!col->mbmaxlen || len >= col->mbminlen + * (fixed_len / col->mbmaxlen)); ut_ad(!dfield_is_ext(field)); #endif /* UNIV_DEBUG */ @@ -2623,7 +2620,7 @@ row_merge_copy_blobs( BLOB pointers are read (row_merge_read_clustered_index()) and dereferenced (below). */ data = btr_rec_copy_externally_stored_field( - mrec, offsets, zip_size, i, &len, heap, NULL); + mrec, offsets, zip_size, i, &len, heap); /* Because we have locked the table, any records written by incomplete transactions must have been rolled back already. There must not be any incomplete diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index b78a8b58..36ca5c77 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2000, 2017, 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 @@ -1986,7 +1986,7 @@ row_unlock_for_mysql( trx_id_t rec_trx_id; mtr_t mtr; - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); /* Restore the cursor position and find the record */ @@ -2871,7 +2871,7 @@ row_add_table_to_background_drop_list(table_id_t table_id) /*********************************************************************//** Reassigns the table identifier of a table. @return error code or DB_SUCCESS */ -UNIV_INTERN +static dberr_t row_mysql_table_id_reassign( /*========================*/ @@ -3562,7 +3562,7 @@ row_truncate_table_for_mysql( index = dict_table_get_next_index(index); } while (index); - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); fsp_header_init(space_id, FIL_IBD_FILE_INITIAL_SIZE, &mtr); mtr_commit(&mtr); @@ -3591,7 +3591,7 @@ row_truncate_table_for_mysql( sys_index = dict_table_get_first_index(dict_sys->sys_indexes); dict_index_copy_types(tuple, sys_index, 1); - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); btr_pcur_open_on_user_rec(sys_index, tuple, PAGE_CUR_GE, BTR_MODIFY_LEAF, &pcur, &mtr); for (;;) { @@ -3638,7 +3638,7 @@ row_truncate_table_for_mysql( a page in this mini-transaction, and the rest of this loop could latch another index page. */ mtr_commit(&mtr); - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); btr_pcur_restore_position(BTR_MODIFY_LEAF, &pcur, &mtr); } diff --git a/storage/innobase/row/row0purge.cc b/storage/innobase/row/row0purge.cc index 1ed8b737..98504b1e 100644 --- a/storage/innobase/row/row0purge.cc +++ b/storage/innobase/row/row0purge.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 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 @@ -823,7 +823,7 @@ row_purge_parse_undo_rec( if (!(node->cmpl_info & UPD_NODE_NO_ORD_CHANGE)) { ptr = trx_undo_rec_get_partial_row( - ptr, clust_index, &node->row, + ptr, clust_index, node->update, &node->row, type == TRX_UNDO_UPD_DEL_REC, node->heap); } diff --git a/storage/innobase/row/row0quiesce.cc b/storage/innobase/row/row0quiesce.cc index 6c4e6adb..53b4040f 100644 --- a/storage/innobase/row/row0quiesce.cc +++ b/storage/innobase/row/row0quiesce.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2012, 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 @@ -237,7 +237,11 @@ row_quiesce_write_table( mach_write_to_4(ptr, col->len); ptr += sizeof(ib_uint32_t); - mach_write_to_4(ptr, col->mbminmaxlen); + /* FIXME: This will not work if mbminlen>4. + This field is also redundant, because the lengths + are a property of the character set encoding, which + in turn is encodedin prtype above. */ + mach_write_to_4(ptr, col->mbmaxlen * 5 + col->mbminlen); ptr += sizeof(ib_uint32_t); mach_write_to_4(ptr, col->ind); diff --git a/storage/innobase/row/row0row.cc b/storage/innobase/row/row0row.cc index 96d25e15..9bf9e718 100644 --- a/storage/innobase/row/row0row.cc +++ b/storage/innobase/row/row0row.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 @@ -173,7 +174,7 @@ row_build_index_entry_low( /* If a column prefix index, take only the prefix. */ if (ind_field->prefix_len) { len = dtype_get_at_most_n_mbchars( - col->prtype, col->mbminmaxlen, + col->prtype, col->mbminlen, col->mbmaxlen, ind_field->prefix_len, len, static_cast(dfield_get_data(dfield))); dfield_set_len(dfield, len); @@ -588,7 +589,8 @@ row_build_row_ref( dfield_set_len(dfield, dtype_get_at_most_n_mbchars( dtype->prtype, - dtype->mbminmaxlen, + dtype->mbminlen, + dtype->mbmaxlen, clust_col_prefix_len, len, (char*) field)); } @@ -702,7 +704,8 @@ row_build_row_ref_in_tuple( dfield_set_len(dfield, dtype_get_at_most_n_mbchars( dtype->prtype, - dtype->mbminmaxlen, + dtype->mbminlen, + dtype->mbmaxlen, clust_col_prefix_len, len, (char*) field)); } diff --git a/storage/innobase/row/row0sel.cc b/storage/innobase/row/row0sel.cc index d309cf4c..6cca3e21 100644 --- a/storage/innobase/row/row0sel.cc +++ b/storage/innobase/row/row0sel.cc @@ -2,7 +2,7 @@ Copyright (c) 1997, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. -Copyright (c) 2015, 2017, MariaDB Corporation. +Copyright (c) 2015, 2018, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -94,8 +94,10 @@ row_sel_sec_rec_is_for_blob( /*========================*/ ulint mtype, /*!< in: main type */ ulint prtype, /*!< in: precise type */ - ulint mbminmaxlen, /*!< in: minimum and maximum length of - a multi-byte character */ + ulint mbminlen, /*!< in: minimum length of + a character, in bytes */ + ulint mbmaxlen, /*!< in: maximum length of + a character, in bytes */ const byte* clust_field, /*!< in: the locally stored part of the clustered index column, including the BLOB pointer; the clustered @@ -134,8 +136,7 @@ row_sel_sec_rec_is_for_blob( len = btr_copy_externally_stored_field_prefix(buf, prefix_len, zip_size, - clust_field, clust_len, - NULL); + clust_field, clust_len); if (UNIV_UNLIKELY(len == 0)) { /* The BLOB was being deleted as the server crashed. @@ -146,7 +147,7 @@ row_sel_sec_rec_is_for_blob( return(FALSE); } - len = dtype_get_at_most_n_mbchars(prtype, mbminmaxlen, + len = dtype_get_at_most_n_mbchars(prtype, mbminlen, mbmaxlen, prefix_len, len, (const char*) buf); return(!cmp_data_data(mtype, prtype, buf, len, sec_field, sec_len)); @@ -230,14 +231,14 @@ row_sel_sec_rec_is_for_clust_rec( } len = dtype_get_at_most_n_mbchars( - col->prtype, col->mbminmaxlen, + col->prtype, col->mbminlen, col->mbmaxlen, ifield->prefix_len, len, (char*) clust_field); if (rec_offs_nth_extern(clust_offs, clust_pos) && len < sec_len) { if (!row_sel_sec_rec_is_for_blob( col->mtype, col->prtype, - col->mbminmaxlen, + col->mbminlen, col->mbmaxlen, clust_field, clust_len, sec_field, sec_len, ifield->prefix_len, @@ -454,7 +455,7 @@ row_sel_fetch_columns( data = btr_rec_copy_externally_stored_field( rec, offsets, dict_table_zip_size(index->table), - field_no, &len, heap, NULL); + field_no, &len, heap); /* data == NULL means that the externally stored field was not @@ -1401,7 +1402,7 @@ row_sel( /* Open a cursor to index, or restore an open cursor position */ - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); if (consistent_read && plan->unique_search && !plan->pcur_is_open && !plan->must_get_clust @@ -1441,7 +1442,7 @@ row_sel( plan_reset_cursor(plan); mtr_commit(&mtr); - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); } if (search_latch_locked) { @@ -2812,7 +2813,7 @@ row_sel_store_mysql_field_func( data = btr_rec_copy_externally_stored_field( rec, offsets, dict_table_zip_size(prebuilt->table), - field_no, &len, heap, NULL); + field_no, &len, heap); if (UNIV_UNLIKELY(!data)) { /* The externally stored field was not written @@ -3930,7 +3931,7 @@ row_search_for_mysql( } } - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); /*-------------------------------------------------------------*/ /* PHASE 2: Try fast adaptive hash index search if possible */ @@ -4061,7 +4062,7 @@ row_search_for_mysql( } mtr_commit(&mtr); - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); } } @@ -5137,7 +5138,7 @@ row_search_for_mysql( mtr_commit(&mtr); mtr_has_extra_clust_latch = FALSE; - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); if (sel_restore_position_for_mysql(&same_user_rec, BTR_SEARCH_LEAF, pcur, moves_up, &mtr)) { @@ -5204,7 +5205,7 @@ row_search_for_mysql( /* It was a lock wait, and it ended */ thr->lock_state = QUE_THR_LOCK_NOLOCK; - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); /* Table lock waited, go try to obtain table lock again */ diff --git a/storage/innobase/row/row0umod.cc b/storage/innobase/row/row0umod.cc index 4aa5cfdc..6c5e808c 100644 --- a/storage/innobase/row/row0umod.cc +++ b/storage/innobase/row/row0umod.cc @@ -299,7 +299,7 @@ row_undo_mod_clust( pcur = &node->pcur; index = btr_cur_get_index(btr_pcur_get_btr_cur(pcur)); - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); online = dict_index_is_online_ddl(index); if (online) { @@ -328,7 +328,7 @@ row_undo_mod_clust( /* We may have to modify tree structure: do a pessimistic descent down the index tree */ - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); err = row_undo_mod_clust_low( node, &offsets, &offsets_heap, @@ -380,7 +380,7 @@ row_undo_mod_clust( if (err == DB_SUCCESS && node->rec_type == TRX_UNDO_UPD_DEL_REC) { - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); /* It is not necessary to call row_log_table, because the record is delete-marked and would thus @@ -393,7 +393,7 @@ row_undo_mod_clust( /* We may have to modify tree structure: do a pessimistic descent down the index tree */ - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); err = row_undo_mod_remove_clust_low(node, thr, &mtr, BTR_MODIFY_TREE); @@ -440,7 +440,7 @@ row_undo_mod_del_mark_or_remove_sec_low( enum row_search_result search_result; log_free_check(); - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); if (mode == BTR_MODIFY_TREE && index->space == IBUF_SPACE_ID && !dict_index_is_unique(index)) { @@ -501,7 +501,7 @@ row_undo_mod_del_mark_or_remove_sec_low( which cannot be purged yet, requires its existence. If some requires, we should delete mark the record. */ - mtr_start_trx(&mtr_vers, thr_get_trx(thr)); + mtr_start(&mtr_vers); success = btr_pcur_restore_position(BTR_SEARCH_LEAF, &(node->pcur), &mtr_vers); @@ -617,7 +617,7 @@ row_undo_mod_del_unmark_sec_and_undo_update( ut_ad(trx->id); log_free_check(); - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); if (mode == BTR_MODIFY_TREE && index->space == IBUF_SPACE_ID && !dict_index_is_unique(index)) { diff --git a/storage/innobase/row/row0upd.cc b/storage/innobase/row/row0upd.cc index ef51e204..e2de47bf 100644 --- a/storage/innobase/row/row0upd.cc +++ b/storage/innobase/row/row0upd.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 @@ -259,7 +260,7 @@ row_upd_check_references_constraints( DEBUG_SYNC_C("foreign_constraint_check_for_update"); - mtr_start_trx(mtr, trx); + mtr_start(mtr); if (trx->dict_operation_lock_mode == 0) { got_s_lock = TRUE; @@ -1152,7 +1153,7 @@ row_upd_ext_fetch( byte* buf = static_cast(mem_heap_alloc(heap, *len)); *len = btr_copy_externally_stored_field_prefix( - buf, *len, zip_size, data, local_len, NULL); + buf, *len, zip_size, data, local_len); /* We should never update records containing a half-deleted BLOB. */ ut_a(*len); @@ -1204,7 +1205,7 @@ row_upd_index_replace_new_col_val( } len = dtype_get_at_most_n_mbchars(col->prtype, - col->mbminmaxlen, + col->mbminlen, col->mbmaxlen, field->prefix_len, len, (const char*) data); @@ -1852,7 +1853,7 @@ row_upd_sec_index_entry( } #endif /* UNIV_DEBUG */ - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); if (*index->name == TEMP_INDEX_PREFIX) { /* The index->online_status may change if the @@ -2389,7 +2390,7 @@ row_upd_clust_rec( /* We may have to modify the tree structure: do a pessimistic descent down the index tree */ - mtr_start_trx(mtr, thr_get_trx(thr)); + mtr_start(mtr); /* NOTE: this transaction has an s-lock or x-lock on the record and therefore other transactions cannot modify the record when we have no @@ -2601,7 +2602,7 @@ row_upd_clust_step( /* We have to restore the cursor to its position */ - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); /* If the restoration does not succeed, then the same transaction has deleted the record on which the cursor was, @@ -2655,7 +2656,7 @@ row_upd_clust_step( mtr_commit(&mtr); - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); success = btr_pcur_restore_position(BTR_MODIFY_LEAF, pcur, &mtr); diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc index 749ece33..cb003edf 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -77,10 +77,6 @@ Created 10/8/1995 Heikki Tuuri #include "fil0pagecompress.h" #include "btr0scrub.h" -#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; diff --git a/storage/innobase/trx/trx0purge.cc b/storage/innobase/trx/trx0purge.cc index 5553de48..9e5e9012 100644 --- a/storage/innobase/trx/trx0purge.cc +++ b/storage/innobase/trx/trx0purge.cc @@ -584,32 +584,6 @@ trx_purge_rseg_get_next_history_log( mutex_exit(&(rseg->mutex)); mtr_commit(&mtr); - - mutex_enter(&trx_sys->mutex); - - /* Add debug code to track history list corruption reported - on the MySQL mailing list on Nov 9, 2004. The fut0lst.cc - file-based list was corrupt. The prev node pointer was - FIL_NULL, even though the list length was over 8 million nodes! - We assume that purge truncates the history list in large - size pieces, and if we here reach the head of the list, the - list cannot be longer than 2000 000 undo logs now. */ - - if (trx_sys->rseg_history_len > 2000000) { - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Warning: purge reached the" - " head of the history list,\n" - "InnoDB: but its length is still" - " reported as %lu! Make a detailed bug\n" - "InnoDB: report, and submit it" - " to https://jira.mariadb.org/\n", - (ulong) trx_sys->rseg_history_len); - ut_ad(0); - } - - mutex_exit(&trx_sys->mutex); - return; } diff --git a/storage/innobase/trx/trx0rec.cc b/storage/innobase/trx/trx0rec.cc index 10eadcb6..cd5e51d4 100644 --- a/storage/innobase/trx/trx0rec.cc +++ b/storage/innobase/trx/trx0rec.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 @@ -467,7 +467,7 @@ trx_undo_page_fetch_ext( { /* Fetch the BLOB. */ ulint ext_len = btr_copy_externally_stored_field_prefix( - ext_buf, prefix_len, zip_size, field, *len, NULL); + ext_buf, prefix_len, zip_size, field, *len); /* BLOBs should always be nonempty. */ ut_a(ext_len); /* Append the BLOB pointer to the prefix. */ @@ -1076,6 +1076,7 @@ trx_undo_rec_get_partial_row( used, as we do NOT copy the data in the record! */ dict_index_t* index, /*!< in: clustered index */ + const upd_t* update, /*!< in: updated columns */ dtuple_t** row, /*!< out, own: partial row */ ibool ignore_prefix, /*!< in: flag to indicate if we expect blob prefixes in undo. Used @@ -1103,6 +1104,13 @@ trx_undo_rec_get_partial_row( ->mtype = DATA_MISSING; } + for (const upd_field_t* uf = update->fields, * const ue + = update->fields + update->n_fields; + uf != ue; uf++) { + ulint c = dict_index_get_nth_col(index, uf->field_no)->ind; + *dtuple_get_nth_field(*row, c) = uf->new_val; + } + end_ptr = ptr + mach_read_from_2(ptr); ptr += 2; @@ -1123,6 +1131,10 @@ trx_undo_rec_get_partial_row( ptr = trx_undo_rec_get_col_val(ptr, &field, &len, &orig_len); dfield = dtuple_get_nth_field(*row, col_no); + ut_ad(dfield->type.mtype == DATA_MISSING + || dict_col_type_assert_equal(col, &dfield->type)); + ut_ad(dfield->type.mtype == DATA_MISSING + || dfield->len == len); dict_col_copy_type( dict_table_get_nth_col(index->table, col_no), dfield_get_type(dfield)); @@ -1255,7 +1267,7 @@ trx_undo_report_row_operation( rseg = trx->rseg; - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); mutex_enter(&trx->undo_mutex); /* If the undo log is not assigned yet, assign one */ @@ -1331,7 +1343,7 @@ trx_undo_report_row_operation( latches, such as SYNC_FSP and SYNC_FSP_PAGE. */ mtr_commit(&mtr); - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); mutex_enter(&rseg->mutex); trx_undo_free_last_page(trx, undo, &mtr); @@ -1368,7 +1380,7 @@ trx_undo_report_row_operation( /* We have to extend the undo log by one page */ ut_ad(++loop_count < 2); - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); /* When we add a page to an undo log, this is analogous to a pessimistic insert in a B-tree, and we must reserve the diff --git a/storage/innobase/trx/trx0roll.cc b/storage/innobase/trx/trx0roll.cc index 2c7287d4..e5c57aa2 100644 --- a/storage/innobase/trx/trx0roll.cc +++ b/storage/innobase/trx/trx0roll.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 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 @@ -739,7 +739,8 @@ trx_roll_must_shutdown() mutex_enter(&recv_sys->mutex); if (recv_sys->report(time)) { - ulint n_trx = 0, n_rows = 0; + ulint n_trx = 0; + ulonglong n_rows = 0; for (const trx_t* t = UT_LIST_GET_FIRST(trx_sys->rw_trx_list); t != NULL; t = UT_LIST_GET_NEXT(trx_list, t)) { @@ -753,9 +754,9 @@ trx_roll_must_shutdown() } ib_logf(IB_LOG_LEVEL_INFO, "To roll back: " ULINTPF " transactions, " - ULINTPF " rows", n_trx, n_rows); + "%llu rows", n_trx, n_rows); sd_notifyf(0, "STATUS=To roll back: " ULINTPF " transactions, " - ULINTPF " rows", n_trx, n_rows); + "%llu rows", n_trx, n_rows); } mutex_exit(&recv_sys->mutex); diff --git a/storage/innobase/trx/trx0undo.cc b/storage/innobase/trx/trx0undo.cc index 5638ccd1..d6bcd131 100644 --- a/storage/innobase/trx/trx0undo.cc +++ b/storage/innobase/trx/trx0undo.cc @@ -1070,9 +1070,11 @@ Truncates an undo log from the end. This function is used during a rollback to free space from an undo log. */ UNIV_INTERN void -trx_undo_truncate_end( +trx_undo_truncate_end_func( /*=======================*/ - trx_t* trx, /*!< in: transaction whose undo log it is */ +#ifdef UNIV_DEBUG + const trx_t* trx, /*!< in: transaction whose undo log it is */ +#endif /* UNIV_DEBUG */ trx_undo_t* undo, /*!< in: undo log */ undo_no_t limit) /*!< in: all undo records with undo number >= this value should be truncated */ @@ -1087,7 +1089,7 @@ trx_undo_truncate_end( ut_ad(mutex_own(&(trx->rseg->mutex))); for (;;) { - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); trunc_here = NULL; @@ -1774,7 +1776,7 @@ trx_undo_assign_undo( ut_ad(mutex_own(&(trx->undo_mutex))); - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); mutex_enter(&rseg->mutex); diff --git a/storage/innobase/ut/ut0ut.cc b/storage/innobase/ut/ut0ut.cc index 181e713c..2a430c9c 100644 --- a/storage/innobase/ut/ut0ut.cc +++ b/storage/innobase/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 @@ -46,6 +46,9 @@ Created 5/11/1994 Heikki Tuuri #endif /* UNIV_HOTBACKUP */ #ifdef __WIN__ +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: @@ -71,7 +74,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/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc index 47f759e0..47b24e10 100644 --- a/storage/maria/ha_maria.cc +++ b/storage/maria/ha_maria.cc @@ -2134,11 +2134,16 @@ void ha_maria::start_bulk_insert(ha_rows rows, uint flags) safety net for now, we don't remove the test of file->state->records, because there is uncertainty on what will happen during repair if the two states disagree. + + We also have to check in case of transactional tables that the + user has not used LOCK TABLE on the table twice. */ if ((file->state->records == 0) && (share->state.state.records == 0) && can_enable_indexes && (!rows || rows >= MARIA_MIN_ROWS_TO_DISABLE_INDEXES) && - (file->lock.type == TL_WRITE || file->lock.type == TL_UNLOCK)) + (file->lock.type == TL_WRITE || file->lock.type == TL_UNLOCK) && + (!share->have_versioning || !share->now_transactional || + file->used_tables->use_count == 1)) { /** @todo for a single-row INSERT SELECT, we will go into repair, which diff --git a/storage/maria/ma_blockrec.c b/storage/maria/ma_blockrec.c index 57596558..c4ec3cf2 100644 --- a/storage/maria/ma_blockrec.c +++ b/storage/maria/ma_blockrec.c @@ -6166,7 +6166,7 @@ my_bool write_hook_for_undo_row_insert(enum translog_record_type type /** - @brief Upates "records" and calls the generic UNDO hook + @brief Updates "records" and calls the generic UNDO hook @return Operation status, always 0 (success) */ @@ -6316,8 +6316,8 @@ uint _ma_apply_redo_insert_row_head_or_tail(MARIA_HA *info, LSN lsn, uchar *buff, *dir; uint result; MARIA_PINNED_PAGE page_link; - enum pagecache_page_lock unlock_method; - enum pagecache_page_pin unpin_method; + enum pagecache_page_lock lock_method; + enum pagecache_page_pin pin_method; my_off_t end_of_page; uint error; DBUG_ENTER("_ma_apply_redo_insert_row_head_or_tail"); @@ -6345,8 +6345,8 @@ uint _ma_apply_redo_insert_row_head_or_tail(MARIA_HA *info, LSN lsn, fill it entirely with zeroes, then the REDO will put correct data on it. */ - unlock_method= PAGECACHE_LOCK_WRITE; - unpin_method= PAGECACHE_PIN; + lock_method= PAGECACHE_LOCK_WRITE; + pin_method= PAGECACHE_PIN; DBUG_ASSERT(rownr == 0 && new_page); if (rownr != 0 || !new_page) @@ -6361,8 +6361,8 @@ uint _ma_apply_redo_insert_row_head_or_tail(MARIA_HA *info, LSN lsn, } else { - unlock_method= PAGECACHE_LOCK_LEFT_WRITELOCKED; - unpin_method= PAGECACHE_PIN_LEFT_PINNED; + lock_method= PAGECACHE_LOCK_LEFT_WRITELOCKED; + pin_method= PAGECACHE_PIN_LEFT_PINNED; share->pagecache->readwrite_flags&= ~MY_WME; buff= pagecache_read(share->pagecache, &info->dfile, @@ -6463,11 +6463,11 @@ uint _ma_apply_redo_insert_row_head_or_tail(MARIA_HA *info, LSN lsn, this group, for this page, would be skipped) and unpin then. */ result= 0; - if (unlock_method == PAGECACHE_LOCK_WRITE && + if (lock_method == PAGECACHE_LOCK_WRITE && pagecache_write(share->pagecache, &info->dfile, page, 0, buff, PAGECACHE_PLAIN_PAGE, - unlock_method, unpin_method, + lock_method, pin_method, PAGECACHE_WRITE_DELAY, &page_link.link, LSN_IMPOSSIBLE)) result= my_errno; @@ -6488,7 +6488,7 @@ uint _ma_apply_redo_insert_row_head_or_tail(MARIA_HA *info, LSN lsn, _ma_set_fatal_error(share, HA_ERR_WRONG_IN_RECORD); err: error= my_errno; - if (unlock_method == PAGECACHE_LOCK_LEFT_WRITELOCKED) + if (lock_method == PAGECACHE_LOCK_LEFT_WRITELOCKED) pagecache_unlock_by_link(share->pagecache, page_link.link, PAGECACHE_LOCK_WRITE_UNLOCK, PAGECACHE_UNPIN, LSN_IMPOSSIBLE, diff --git a/storage/maria/ma_page.c b/storage/maria/ma_page.c index 4021fb8e..2f77f6f8 100644 --- a/storage/maria/ma_page.c +++ b/storage/maria/ma_page.c @@ -224,17 +224,35 @@ my_bool _ma_write_keypage(MARIA_PAGE *page, enum pagecache_page_lock lock, #endif page_cleanup(share, page); - res= pagecache_write(share->pagecache, - &share->kfile, - (pgcache_page_no_t) (page->pos / block_size), - level, buff, share->page_type, - lock, - lock == PAGECACHE_LOCK_LEFT_WRITELOCKED ? - PAGECACHE_PIN_LEFT_PINNED : - (lock == PAGECACHE_LOCK_WRITE_UNLOCK ? - PAGECACHE_UNPIN : PAGECACHE_PIN), - PAGECACHE_WRITE_DELAY, &page_link.link, - LSN_IMPOSSIBLE); + { + PAGECACHE_BLOCK_LINK **link; + enum pagecache_page_pin pin; + if (lock == PAGECACHE_LOCK_LEFT_WRITELOCKED) + { + pin= PAGECACHE_PIN_LEFT_PINNED; + link= &page_link.link; + } + else if (lock == PAGECACHE_LOCK_WRITE_UNLOCK) + { + pin= PAGECACHE_UNPIN; + /* + We unlock this page so link should be 0 to prevent it usage + even accidentally + */ + link= NULL; + } + else + { + pin= PAGECACHE_PIN; + link= &page_link.link; + } + res= pagecache_write(share->pagecache, + &share->kfile, + (pgcache_page_no_t) (page->pos / block_size), + level, buff, share->page_type, + lock, pin, PAGECACHE_WRITE_DELAY, link, + LSN_IMPOSSIBLE); + } if (lock == PAGECACHE_LOCK_WRITE) { diff --git a/storage/maria/ma_search.c b/storage/maria/ma_search.c index 951850b1..0132dc95 100644 --- a/storage/maria/ma_search.c +++ b/storage/maria/ma_search.c @@ -745,11 +745,11 @@ void _ma_kpointer(register MARIA_HA *info, register uchar *buff, my_off_t pos) case 5: mi_int5store(buff,pos); break; #else case 7: *buff++=0; - /* fall trough */ + /* fall through */ case 6: *buff++=0; - /* fall trough */ + /* fall through */ case 5: *buff++=0; - /* fall trough */ + /* fall through */ #endif case 4: mi_int4store(buff,pos); break; case 3: mi_int3store(buff,pos); break; @@ -881,13 +881,13 @@ void _ma_dpointer(MARIA_SHARE *share, uchar *buff, my_off_t pos) case 5: mi_int5store(buff,pos); break; #else case 8: *buff++=0; - /* fall trough */ + /* fall through */ case 7: *buff++=0; - /* fall trough */ + /* fall through */ case 6: *buff++=0; - /* fall trough */ + /* fall through */ case 5: *buff++=0; - /* fall trough */ + /* fall through */ #endif case 4: mi_int4store(buff,pos); break; case 3: mi_int3store(buff,pos); break; diff --git a/storage/maria/ma_state.c b/storage/maria/ma_state.c index 88ce88b8..7404fe06 100644 --- a/storage/maria/ma_state.c +++ b/storage/maria/ma_state.c @@ -58,6 +58,7 @@ my_bool _ma_setup_live_state(MARIA_HA *info) MARIA_USED_TABLES *tables; MARIA_STATE_HISTORY *history; DBUG_ENTER("_ma_setup_live_state"); + DBUG_PRINT("enter", ("info: %p", info)); DBUG_ASSERT(share->lock_key_trees); @@ -110,6 +111,8 @@ my_bool _ma_setup_live_state(MARIA_HA *info) end: info->state_start= &tables->state_start; info->state= &tables->state_current; + info->used_tables= tables; + tables->use_count++; /* Mark in transaction state if we are not using transid (versioning) @@ -118,6 +121,7 @@ my_bool _ma_setup_live_state(MARIA_HA *info) */ tables->state_current.no_transid|= !(info->row_flag & ROW_FLAG_TRANSID); + DBUG_PRINT("exit", ("tables: %p info->state: %p", tables, info->state)); DBUG_RETURN(0); } @@ -241,9 +245,10 @@ void _ma_reset_state(MARIA_HA *info) DBUG_ENTER("_ma_reset_state"); /* Always true if share->now_transactional is set */ - if (history) + if (history && share->have_versioning) { MARIA_STATE_HISTORY *next; + DBUG_PRINT("info", ("resetting history")); /* Set the current history to current state */ share->state_history->state= share->state.state; @@ -255,7 +260,7 @@ void _ma_reset_state(MARIA_HA *info) my_free(history); } share->state_history->next= 0; - share->state_history->trid= 0; /* Visibile for all */ + share->state_history->trid= 0; /* Visible for all */ } DBUG_VOID_RETURN; } @@ -597,7 +602,7 @@ void _ma_remove_table_from_trnman(MARIA_SHARE *share, TRN *trn) SYNOPSIS _ma_get_status() - param Pointer to Myisam handler + param Pointer to Aria handler concurrent_insert Set to 1 if we are going to do concurrent inserts (THR_WRITE_CONCURRENT_INSERT was used) */ @@ -627,6 +632,8 @@ void _ma_block_get_status(void* param, my_bool concurrent_insert) my_bool _ma_block_start_trans(void* param) { MARIA_HA *info=(MARIA_HA*) param; + DBUG_ENTER("_ma_block_start_trans"); + if (info->s->lock_key_trees) { /* @@ -634,7 +641,7 @@ my_bool _ma_block_start_trans(void* param) out of memory conditions) TODO: Fix this by having one extra state pre-allocated */ - return _ma_setup_live_state(info); + DBUG_RETURN(_ma_setup_live_state(info)); } else { @@ -663,9 +670,9 @@ my_bool _ma_block_start_trans(void* param) Assume for now that this doesn't fail (It can only fail in out of memory conditions) */ - return maria_create_trn_hook(info) != 0; + DBUG_RETURN(maria_create_trn_hook(info) != 0); } - return 0; + DBUG_RETURN(0); } @@ -697,7 +704,7 @@ my_bool _ma_block_check_status(void *param __attribute__((unused))) my_bool _ma_block_start_trans_no_versioning(void* param) { MARIA_HA *info=(MARIA_HA*) param; - DBUG_ENTER("_ma_block_get_status_no_version"); + DBUG_ENTER("_ma_block_start_trans_no_versioning"); DBUG_ASSERT(info->s->base.born_transactional && !info->s->lock_key_trees); info->state->changed= 0; /* from _ma_reset_update_flag() */ @@ -722,6 +729,8 @@ my_bool _ma_block_start_trans_no_versioning(void* param) void maria_versioning(MARIA_HA *info, my_bool versioning) { MARIA_SHARE *share= info->s; + DBUG_ENTER("maria_versioning"); + /* For now, this is a hack */ if (share->have_versioning) { @@ -738,6 +747,7 @@ void maria_versioning(MARIA_HA *info, my_bool versioning) info->state= &share->state.state; /* Change global values by default */ info->state_start= info->state; /* Initial values */ } + DBUG_VOID_RETURN; } diff --git a/storage/maria/ma_state.h b/storage/maria/ma_state.h index 5ff6dc26..a86aada9 100644 --- a/storage/maria/ma_state.h +++ b/storage/maria/ma_state.h @@ -34,6 +34,7 @@ typedef struct st_used_tables { struct st_maria_share *share; MARIA_STATUS_INFO state_current; MARIA_STATUS_INFO state_start; + uint use_count; } MARIA_USED_TABLES; diff --git a/storage/maria/ma_write.c b/storage/maria/ma_write.c index 34ce5302..4175a5be 100644 --- a/storage/maria/ma_write.c +++ b/storage/maria/ma_write.c @@ -340,7 +340,7 @@ int maria_write(MARIA_HA *info, uchar *record) for (j=0 ; j < share->base.keys ; j++) maria_flush_bulk_insert(info, j); } - info->errkey= (int) i; + info->errkey= i < share->base.keys ? (int) i : -1; /* We delete keys in the reverse order of insertion. This is the order that a rollback would do and is important for CLR_ENDs generated by diff --git a/storage/maria/maria_def.h b/storage/maria/maria_def.h index 3b93dda2..d57a4293 100644 --- a/storage/maria/maria_def.h +++ b/storage/maria/maria_def.h @@ -600,6 +600,7 @@ struct st_maria_handler struct st_ma_transaction *trn; /* Pointer to active transaction */ MARIA_STATUS_INFO *state, state_save; MARIA_STATUS_INFO *state_start; /* State at start of transaction */ + MARIA_USED_TABLES *used_tables; MARIA_ROW cur_row; /* The active row that we just read */ MARIA_ROW new_row; /* Storage for a row during update */ MARIA_KEY last_key; /* Last found key */ @@ -1181,7 +1182,7 @@ extern ulonglong transid_get_packed(MARIA_SHARE *share, const uchar *from); #ifdef IDENTICAL_PAGES_AFTER_RECOVERY void page_cleanup(MARIA_SHARE *share, MARIA_PAGE *page) #else -#define page_cleanup(A,B) while (0) +#define page_cleanup(A,B) do { } while (0) #endif extern MARIA_KEY *_ma_make_key(MARIA_HA *info, MARIA_KEY *int_key, uint keynr, diff --git a/storage/maria/unittest/ma_test_loghandler_multigroup-t.c b/storage/maria/unittest/ma_test_loghandler_multigroup-t.c index 39cff18a..1ea31d22 100644 --- a/storage/maria/unittest/ma_test_loghandler_multigroup-t.c +++ b/storage/maria/unittest/ma_test_loghandler_multigroup-t.c @@ -233,7 +233,7 @@ int main(int argc __attribute__((unused)), char *argv[]) 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55 }; - uchar *long_buffer= malloc(LONG_BUFFER_SIZE + LSN_STORE_SIZE * 2 + 2); + uchar *long_buffer; char **default_argv; PAGECACHE pagecache; LSN lsn, lsn_base, first_lsn; @@ -255,6 +255,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); default_argv= argv; get_options(&argc, &argv); @@ -758,9 +759,12 @@ int main(int argc __attribute__((unused)), char *argv[]) if (maria_log_remove(maria_data_root)) exit(1); + free(long_buffer); + my_uuid_end(); my_free_open_file_info(); my_end(0); + return (MY_TEST(exit_status())); } diff --git a/storage/maria/unittest/ma_test_loghandler_nologs-t.c b/storage/maria/unittest/ma_test_loghandler_nologs-t.c index a6ccfd75..310345f0 100644 --- a/storage/maria/unittest/ma_test_loghandler_nologs-t.c +++ b/storage/maria/unittest/ma_test_loghandler_nologs-t.c @@ -191,6 +191,8 @@ int main(int argc __attribute__((unused)), char *argv[]) if (maria_log_remove(maria_data_root)) exit(1); + free(long_buffer); + my_uuid_end(); my_free_open_file_info(); my_end(0); diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc index 3a9bf45e..7f2afc31 100644 --- a/storage/myisam/ha_myisam.cc +++ b/storage/myisam/ha_myisam.cc @@ -729,6 +729,7 @@ int ha_myisam::open(const char *name, int mode, uint test_if_locked) { MI_KEYDEF *keyinfo; MI_COLUMNDEF *recinfo= 0; + char readlink_buf[FN_REFLEN], name_buff[FN_REFLEN]; uint recs; uint i; @@ -783,6 +784,30 @@ int ha_myisam::open(const char *name, int mode, uint test_if_locked) (void) mi_extra(file, HA_EXTRA_NO_WAIT_LOCK, 0); info(HA_STATUS_NO_LOCK | HA_STATUS_VARIABLE | HA_STATUS_CONST); + + /* + Set data_file_name and index_file_name to point at the symlink value + if table is symlinked (Ie; Real name is not same as generated name) + */ + fn_format(name_buff, file->filename, "", MI_NAME_DEXT, + MY_APPEND_EXT | MY_UNPACK_FILENAME); + if (my_is_symlink(name_buff)) + { + my_readlink(readlink_buf, name_buff, MYF(0)); + data_file_name= strdup_root(&table->mem_root, readlink_buf); + } + else + data_file_name= 0; + fn_format(name_buff, file->filename, "", MI_NAME_IEXT, + MY_APPEND_EXT | MY_UNPACK_FILENAME); + if (my_is_symlink(name_buff)) + { + my_readlink(readlink_buf, name_buff, MYF(0)); + index_file_name= strdup_root(&table->mem_root, readlink_buf); + } + else + index_file_name= 0; + if (!(test_if_locked & HA_OPEN_WAIT_IF_LOCKED)) (void) mi_extra(file, HA_EXTRA_WAIT_LOCK, 0); if (!table->s->db_record_offset) @@ -1847,7 +1872,6 @@ void ha_myisam::position(const uchar *record) int ha_myisam::info(uint flag) { MI_ISAMINFO misam_info; - char name_buff[FN_REFLEN]; if (!table) return 1; @@ -1895,27 +1919,6 @@ int ha_myisam::info(uint flag) sizeof(table->key_info[0].rec_per_key[0])*share->key_parts); if (table_share->tmp_table == NO_TMP_TABLE) mysql_mutex_unlock(&table_share->LOCK_share); - - /* - Set data_file_name and index_file_name to point at the symlink value - if table is symlinked (Ie; Real name is not same as generated name) - */ - char buf[FN_REFLEN]; - data_file_name= index_file_name= 0; - fn_format(name_buff, file->filename, "", MI_NAME_DEXT, - MY_APPEND_EXT | MY_UNPACK_FILENAME); - if (my_is_symlink(name_buff)) - { - my_readlink(buf, name_buff, MYF(0)); - data_file_name= ha_thd()->strdup(buf); - } - fn_format(name_buff, file->filename, "", MI_NAME_IEXT, - MY_APPEND_EXT | MY_UNPACK_FILENAME); - if (my_is_symlink(name_buff)) - { - my_readlink(buf, name_buff, MYF(0)); - index_file_name= ha_thd()->strdup(buf); - } } if (flag & HA_STATUS_ERRKEY) { diff --git a/storage/myisam/mi_locking.c b/storage/myisam/mi_locking.c index 19219264..4fd287c6 100644 --- a/storage/myisam/mi_locking.c +++ b/storage/myisam/mi_locking.c @@ -1,5 +1,5 @@ -/* - Copyright (c) 2000, 2010, Oracle and/or its affiliates +/* Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. + 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 @@ -113,6 +113,8 @@ int mi_lock_database(MI_INFO *info, int lock_type) share->changed=0; if (myisam_flush) { + if (share->file_map) + my_msync(info->dfile, share->file_map, share->mmaped_length, MS_SYNC); if (mysql_file_sync(share->kfile, MYF(0))) mark_crashed= error= my_errno; if (mysql_file_sync(info->dfile, MYF(0))) @@ -526,6 +528,8 @@ int _mi_writeinfo(register MI_INFO *info, uint operation) #ifdef _WIN32 if (myisam_flush) { + if (share->file_map) + my_msync(info->dfile, share->file_map, share->mmaped_length, MS_SYNC); mysql_file_sync(share->kfile, 0); mysql_file_sync(info->dfile, 0); } diff --git a/storage/myisam/mi_search.c b/storage/myisam/mi_search.c index 60a34c64..92f28f4e 100644 --- a/storage/myisam/mi_search.c +++ b/storage/myisam/mi_search.c @@ -607,11 +607,11 @@ void _mi_kpointer(register MI_INFO *info, register uchar *buff, my_off_t pos) case 5: mi_int5store(buff,pos); break; #else case 7: *buff++=0; - /* fall trough */ + /* fall through */ case 6: *buff++=0; - /* fall trough */ + /* fall through */ case 5: *buff++=0; - /* fall trough */ + /* fall through */ #endif case 4: mi_int4store(buff,pos); break; case 3: mi_int3store(buff,pos); break; @@ -728,13 +728,13 @@ void _mi_dpointer(MI_INFO *info, uchar *buff, my_off_t pos) case 5: mi_int5store(buff,pos); break; #else case 8: *buff++=0; - /* fall trough */ + /* fall through */ case 7: *buff++=0; - /* fall trough */ + /* fall through */ case 6: *buff++=0; - /* fall trough */ + /* fall through */ case 5: *buff++=0; - /* fall trough */ + /* fall through */ #endif case 4: mi_int4store(buff,pos); break; case 3: mi_int3store(buff,pos); break; diff --git a/storage/tokudb/CMakeLists.txt b/storage/tokudb/CMakeLists.txt index f01c4aed..7ea98728 100644 --- a/storage/tokudb/CMakeLists.txt +++ b/storage/tokudb/CMakeLists.txt @@ -1,7 +1,9 @@ -SET(TOKUDB_VERSION 5.6.37-82.2) +SET(TOKUDB_VERSION 5.6.38-83.0) # 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(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64") # tokudb requires F_NOCACHE or O_DIRECT, and designated initializers diff --git a/storage/tokudb/PerconaFT/CMakeLists.txt b/storage/tokudb/PerconaFT/CMakeLists.txt index d42525f1..3973ec71 100644 --- a/storage/tokudb/PerconaFT/CMakeLists.txt +++ b/storage/tokudb/PerconaFT/CMakeLists.txt @@ -12,9 +12,14 @@ set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") # detect when we are being built as a subproject if (DEFINED MYSQL_PROJECT_NAME_DOCSTRING) add_definitions( -DMYSQL_TOKUDB_ENGINE=1) + # Extended PFS instrumentation: + # -DTOKU_PFS_MUTEX_EXTENDED_CACHETABLEMMUTEX=1 + if (WITH_PERFSCHEMA_STORAGE_ENGINE) + add_definitions(-DTOKU_MYSQL_WITH_PFS) + endif () + include_directories(${CMAKE_SOURCE_DIR}/include) if ((CMAKE_BUILD_TYPE MATCHES "Debug") AND (CMAKE_CXX_FLAGS_DEBUG MATCHES " -DENABLED_DEBUG_SYNC")) - include_directories(${CMAKE_SOURCE_DIR}/include) include_directories(${CMAKE_SOURCE_DIR}/sql) endif () endif () diff --git a/storage/tokudb/PerconaFT/buildheader/make_tdb.cc b/storage/tokudb/PerconaFT/buildheader/make_tdb.cc index 0fa876f2..95d6207e 100644 --- a/storage/tokudb/PerconaFT/buildheader/make_tdb.cc +++ b/storage/tokudb/PerconaFT/buildheader/make_tdb.cc @@ -445,14 +445,15 @@ static void print_db_key_range_struct (void) { sort_and_dump_fields("db_key_range", false, NULL); } -static void print_db_lsn_struct (void) { - field_counter=0; - /* A dummy field to make sizeof(DB_LSN) equal in C and C++ */ - const char *extra[] = { "char dummy", NULL }; - sort_and_dump_fields("db_lsn", false, extra); +static void print_db_lsn_struct(void) { + field_counter = 0; + // FT-692 + STRUCT_SETUP(DB_LSN, file, "uint32_t %s"); + STRUCT_SETUP(DB_LSN, offset, "uint32_t %s"); + sort_and_dump_fields("db_lsn", false, NULL); } -static void print_dbt_struct (void) { +static void print_dbt_struct(void) { field_counter=0; #if 0 && DB_VERSION_MAJOR==4 && DB_VERSION_MINOR==1 STRUCT_SETUP(DBT, app_private, "void*%s"); diff --git a/storage/tokudb/PerconaFT/cmake_modules/TokuSetupCompiler.cmake b/storage/tokudb/PerconaFT/cmake_modules/TokuSetupCompiler.cmake index 0cd9a9c5..385723ae 100644 --- a/storage/tokudb/PerconaFT/cmake_modules/TokuSetupCompiler.cmake +++ b/storage/tokudb/PerconaFT/cmake_modules/TokuSetupCompiler.cmake @@ -53,7 +53,13 @@ macro(set_cflags_if_supported) endforeach(flag) endmacro(set_cflags_if_supported) +if (NOT DEFINED MYSQL_PROJECT_NAME_DOCSTRING) + set (OPTIONAL_CFLAGS "${OPTIONAL_CFLAGS} -Wmissing-format-attribute") +endif() + ## disable some warnings +## missing-format-attribute causes warnings in some MySQL include files +## if the library is built as a part of TokuDB MySQL storage engine set_cflags_if_supported( -Wno-missing-field-initializers -Wstrict-null-sentinel @@ -61,7 +67,7 @@ set_cflags_if_supported( -Wswitch -Wtrampolines -Wlogical-op - -Wmissing-format-attribute + ${OPTIONAL_CFLAGS} -Wno-error=missing-format-attribute -Wno-error=address-of-array-temporary -Wno-error=tautological-constant-out-of-range-compare @@ -143,8 +149,8 @@ set_cflags_if_supported( -Wmissing-prototypes -Wmissing-declarations -Wpointer-arith - -Wmissing-format-attribute -Wshadow + ${OPTIONAL_CFLAGS} ## other flags to try: #-Wunsafe-loop-optimizations #-Wpointer-arith diff --git a/storage/tokudb/PerconaFT/ft/cachetable/background_job_manager.cc b/storage/tokudb/PerconaFT/ft/cachetable/background_job_manager.cc index 9119a49b..c109185f 100644 --- a/storage/tokudb/PerconaFT/ft/cachetable/background_job_manager.cc +++ b/storage/tokudb/PerconaFT/ft/cachetable/background_job_manager.cc @@ -42,6 +42,9 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "cachetable/background_job_manager.h" +toku_instr_key *bjm_jobs_lock_mutex_key; +toku_instr_key *bjm_jobs_wait_key; + struct background_job_manager_struct { bool accepting_jobs; uint32_t num_jobs; @@ -49,10 +52,10 @@ struct background_job_manager_struct { toku_mutex_t jobs_lock; }; -void bjm_init(BACKGROUND_JOB_MANAGER* pbjm) { +void bjm_init(BACKGROUND_JOB_MANAGER *pbjm) { BACKGROUND_JOB_MANAGER XCALLOC(bjm); - toku_mutex_init(&bjm->jobs_lock, 0); - toku_cond_init(&bjm->jobs_wait, NULL); + toku_mutex_init(*bjm_jobs_lock_mutex_key, &bjm->jobs_lock, nullptr); + toku_cond_init(*bjm_jobs_wait_key, &bjm->jobs_wait, nullptr); bjm->accepting_jobs = true; bjm->num_jobs = 0; *pbjm = bjm; diff --git a/storage/tokudb/PerconaFT/ft/cachetable/cachetable.cc b/storage/tokudb/PerconaFT/ft/cachetable/cachetable.cc index 31aab932..ae2bb284 100644 --- a/storage/tokudb/PerconaFT/ft/cachetable/cachetable.cc +++ b/storage/tokudb/PerconaFT/ft/cachetable/cachetable.cc @@ -57,6 +57,25 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "util/status.h" #include "util/context.h" +toku_instr_key *cachetable_m_mutex_key; +toku_instr_key *cachetable_ev_thread_lock_mutex_key; + +toku_instr_key *cachetable_m_list_lock_key; +toku_instr_key *cachetable_m_pending_lock_expensive_key; +toku_instr_key *cachetable_m_pending_lock_cheap_key; +toku_instr_key *cachetable_m_lock_key; + +toku_instr_key *cachetable_value_key; +toku_instr_key *cachetable_disk_nb_rwlock_key; + +toku_instr_key *cachetable_p_refcount_wait_key; +toku_instr_key *cachetable_m_flow_control_cond_key; +toku_instr_key *cachetable_m_ev_thread_cond_key; + +toku_instr_key *cachetable_disk_nb_mutex_key; +toku_instr_key *log_internal_lock_mutex_key; +toku_instr_key *eviction_thread_key; + /////////////////////////////////////////////////////////////////////////////////// // Engine status // @@ -779,18 +798,25 @@ void pair_init(PAIR p, p->checkpoint_complete_callback = write_callback.checkpoint_complete_callback; p->write_extraargs = write_callback.write_extraargs; - p->count = 0; // Is zero the correct init value? + p->count = 0; // Is zero the correct init value? p->refcount = 0; p->num_waiting_on_refs = 0; - toku_cond_init(&p->refcount_wait, NULL); + toku_cond_init(*cachetable_p_refcount_wait_key, &p->refcount_wait, nullptr); p->checkpoint_pending = false; p->mutex = list->get_mutex_for_pair(fullhash); assert(p->mutex); - p->value_rwlock.init(p->mutex); - nb_mutex_init(&p->disk_nb_mutex); + p->value_rwlock.init(p->mutex +#ifdef TOKU_MYSQL_WITH_PFS + , + *cachetable_value_key +#endif + ); + nb_mutex_init(*cachetable_disk_nb_mutex_key, + *cachetable_disk_nb_rwlock_key, + &p->disk_nb_mutex); - p->size_evicting_estimate = 0; // Is zero the correct init value? + p->size_evicting_estimate = 0; // Is zero the correct init value? p->ev = ev; p->list = list; @@ -3229,16 +3255,26 @@ void pair_list::init() { #if defined(HAVE_PTHREAD_RWLOCKATTR_SETKIND_NP) pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP); #else - // TODO: need to figure out how to make writer-preferential rwlocks - // happen on osx +// TODO: need to figure out how to make writer-preferential rwlocks +// happen on osx #endif - toku_pthread_rwlock_init(&m_list_lock, &attr); - toku_pthread_rwlock_init(&m_pending_lock_expensive, &attr); - toku_pthread_rwlock_init(&m_pending_lock_cheap, &attr); + toku_pthread_rwlock_init(*cachetable_m_list_lock_key, &m_list_lock, &attr); + toku_pthread_rwlock_init(*cachetable_m_pending_lock_expensive_key, + &m_pending_lock_expensive, + &attr); + toku_pthread_rwlock_init( + *cachetable_m_pending_lock_cheap_key, &m_pending_lock_cheap, &attr); XCALLOC_N(m_table_size, m_table); XCALLOC_N(m_num_locks, m_mutexes); for (uint64_t i = 0; i < m_num_locks; i++) { - toku_mutex_init(&m_mutexes[i].aligned_mutex, NULL); + toku_mutex_init( +#ifdef TOKU_PFS_MUTEX_EXTENDED_CACHETABLEMMUTEX + *cachetable_m_mutex_key, +#else + toku_uninstrumented, +#endif + &m_mutexes[i].aligned_mutex, + nullptr); } } @@ -3578,9 +3614,9 @@ ENSURE_POD(evictor); // This is the function that runs eviction on its own thread. // static void *eviction_thread(void *evictor_v) { - evictor* CAST_FROM_VOIDP(evictor, evictor_v); + evictor *CAST_FROM_VOIDP(evictor, evictor_v); evictor->run_eviction_thread(); - return evictor_v; + return toku_pthread_done(evictor_v); } // @@ -3629,11 +3665,14 @@ int evictor::init(long _size_limit, pair_list* _pl, cachefile_list* _cf_list, KI m_pl = _pl; m_cf_list = _cf_list; - m_kibbutz = _kibbutz; - toku_mutex_init(&m_ev_thread_lock, NULL); - toku_cond_init(&m_flow_control_cond, NULL); - toku_cond_init(&m_ev_thread_cond, NULL); - m_num_sleepers = 0; + m_kibbutz = _kibbutz; + toku_mutex_init( + *cachetable_ev_thread_lock_mutex_key, &m_ev_thread_lock, nullptr); + toku_cond_init( + *cachetable_m_flow_control_cond_key, &m_flow_control_cond, nullptr); + toku_cond_init( + *cachetable_m_ev_thread_cond_key, &m_ev_thread_cond, nullptr); + m_num_sleepers = 0; m_ev_thread_is_running = false; m_period_in_seconds = eviction_period; @@ -3641,11 +3680,12 @@ int evictor::init(long _size_limit, pair_list* _pl, cachefile_list* _cf_list, KI int r = myinitstate_r(seed, m_random_statebuf, sizeof m_random_statebuf, &m_random_data); assert_zero(r); - // start the background thread + // start the background thread m_run_thread = true; m_num_eviction_thread_runs = 0; m_ev_thread_init = false; - r = toku_pthread_create(&m_ev_thread, NULL, eviction_thread, this); + r = toku_pthread_create( + *eviction_thread_key, &m_ev_thread, nullptr, eviction_thread, this); if (r == 0) { m_ev_thread_init = true; } @@ -4702,7 +4742,7 @@ static_assert(std::is_pod::value, "cachefile_list isn't POD"); void cachefile_list::init() { m_next_filenum_to_use.fileid = 0; m_next_hash_id_to_use = 0; - toku_pthread_rwlock_init(&m_lock, NULL); + toku_pthread_rwlock_init(*cachetable_m_lock_key, &m_lock, nullptr); m_active_filenum.create(); m_active_fileid.create(); m_stale_fileid.create(); diff --git a/storage/tokudb/PerconaFT/ft/cachetable/checkpoint.cc b/storage/tokudb/PerconaFT/ft/cachetable/checkpoint.cc index 3223ab0a..13ff5eff 100644 --- a/storage/tokudb/PerconaFT/ft/cachetable/checkpoint.cc +++ b/storage/tokudb/PerconaFT/ft/cachetable/checkpoint.cc @@ -86,8 +86,16 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "util/frwlock.h" #include "util/status.h" -void -toku_checkpoint_get_status(CACHETABLE ct, CHECKPOINT_STATUS statp) { +toku_instr_key *checkpoint_safe_mutex_key; +toku_instr_key *checkpoint_safe_rwlock_key; +toku_instr_key *multi_operation_lock_key; +toku_instr_key *low_priority_multi_operation_lock_key; + +toku_instr_key *rwlock_cond_key; +toku_instr_key *rwlock_wait_read_key; +toku_instr_key *rwlock_wait_write_key; + +void toku_checkpoint_get_status(CACHETABLE ct, CHECKPOINT_STATUS statp) { cp_status.init(); CP_STATUS_VAL(CP_PERIOD) = toku_get_checkpoint_period_unlocked(ct); *statp = cp_status; @@ -116,11 +124,14 @@ multi_operation_lock_init(void) { #if defined(HAVE_PTHREAD_RWLOCKATTR_SETKIND_NP) pthread_rwlockattr_setkind_np(&attr, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP); #else - // TODO: need to figure out how to make writer-preferential rwlocks - // happen on osx +// TODO: need to figure out how to make writer-preferential rwlocks +// happen on osx #endif - toku_pthread_rwlock_init(&multi_operation_lock, &attr); - toku_pthread_rwlock_init(&low_priority_multi_operation_lock, &attr); + toku_pthread_rwlock_init( + *multi_operation_lock_key, &multi_operation_lock, &attr); + toku_pthread_rwlock_init(*low_priority_multi_operation_lock_key, + &low_priority_multi_operation_lock, + &attr); pthread_rwlockattr_destroy(&attr); locked_mo = false; } @@ -145,10 +156,15 @@ multi_operation_checkpoint_unlock(void) { toku_pthread_rwlock_wrunlock(&low_priority_multi_operation_lock); } -static void -checkpoint_safe_lock_init(void) { - toku_mutex_init(&checkpoint_safe_mutex, NULL); - checkpoint_safe_lock.init(&checkpoint_safe_mutex); +static void checkpoint_safe_lock_init(void) { + toku_mutex_init( + *checkpoint_safe_mutex_key, &checkpoint_safe_mutex, nullptr); + checkpoint_safe_lock.init(&checkpoint_safe_mutex +#ifdef TOKU_MYSQL_WITH_PFS + , + *checkpoint_safe_rwlock_key +#endif + ); locked_cs = false; } diff --git a/storage/tokudb/PerconaFT/ft/ft-ops.cc b/storage/tokudb/PerconaFT/ft/ft-ops.cc index 07e24494..60885ed9 100644 --- a/storage/tokudb/PerconaFT/ft/ft-ops.cc +++ b/storage/tokudb/PerconaFT/ft/ft-ops.cc @@ -186,9 +186,35 @@ basement nodes, bulk fetch, and partial fetch: */ static toku_mutex_t ft_open_close_lock; - -void -toku_ft_get_status(FT_STATUS s) { +static toku_instr_key *ft_open_close_lock_mutex_key; +// FIXME: the instrumentation keys below are defined here even though they +// belong to other modules, because they are registered here. If desired, they +// can be moved to their proper modules and registration done there in a +// one-time init function +// locktree +toku_instr_key *treenode_mutex_key; +toku_instr_key *manager_mutex_key; +toku_instr_key *manager_escalation_mutex_key; +toku_instr_key *manager_escalator_mutex_key; +// src +toku_instr_key *db_txn_struct_i_txn_mutex_key; +toku_instr_key *indexer_i_indexer_lock_mutex_key; +toku_instr_key *indexer_i_indexer_estimate_lock_mutex_key; +toku_instr_key *result_i_open_dbs_rwlock_key; +// locktree +toku_instr_key *lock_request_m_wait_cond_key; +toku_instr_key *manager_m_escalator_done_key; +toku_instr_key *locktree_request_info_mutex_key; +toku_instr_key *locktree_request_info_retry_mutex_key; +toku_instr_key *locktree_request_info_retry_cv_key; + +// this is a sample probe for custom instrumentation +static toku_instr_key *fti_probe_1_key; + +// This is a sample probe for custom instrumentation +toku_instr_probe *toku_instr_probe_1; + +void toku_ft_get_status(FT_STATUS s) { ft_status.init(); *s = ft_status; @@ -2643,11 +2669,14 @@ void toku_ft_set_direct_io (bool direct_io_on) { use_direct_io = direct_io_on; } -static inline int ft_open_maybe_direct(const char *filename, int oflag, int mode) { +static inline int ft_open_maybe_direct(const char *filename, + int oflag, + int mode) { if (use_direct_io) { - return toku_os_open_direct(filename, oflag, mode); + return toku_os_open_direct( + filename, oflag, mode, *tokudb_file_data_key); } else { - return toku_os_open(filename, oflag, mode); + return toku_os_open(filename, oflag, mode, *tokudb_file_data_key); } } @@ -2721,7 +2750,7 @@ bool toku_create_subdirs_if_needed(const char *path) { if (!subdir.get()) return true; - if (toku_stat(subdir.get(), &stat) == -1) { + if (toku_stat(subdir.get(), &stat, toku_uninstrumented) == -1) { if (ENOENT == get_error_errno()) subdir_exists = false; else @@ -2933,6 +2962,8 @@ ft_handle_open(FT_HANDLE ft_h, const char *fname_in_env, int is_create, int only CACHEFILE cf = NULL; FT ft = NULL; bool did_create = false; + bool was_already_open = false; + toku_ft_open_close_lock(); if (ft_h->did_set_flags) { @@ -2944,7 +2975,6 @@ ft_handle_open(FT_HANDLE ft_h, const char *fname_in_env, int is_create, int only FILENUM reserved_filenum; reserved_filenum = use_filenum; fname_in_cwd = toku_cachetable_get_fname_in_cwd(cachetable, fname_in_env); - bool was_already_open; { int fd = -1; r = ft_open_file(fname_in_cwd, &fd); @@ -4614,20 +4644,265 @@ int toku_dump_ft(FILE *f, FT_HANDLE ft_handle) { return toku_dump_ftnode(f, ft_handle, root_key, 0, 0, 0); } + +static void toku_pfs_keys_init(const char *toku_instr_group_name) { + kibbutz_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, "kibbutz_mutex"); + minicron_p_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "minicron_p_mutex"); + queue_result_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "queue_result_mutex"); + tpool_lock_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "tpool_lock_mutex"); + workset_lock_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "workset_lock_mutex"); + bjm_jobs_lock_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "bjm_jobs_lock_mutex"); + log_internal_lock_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "log_internal_lock_mutex"); + cachetable_ev_thread_lock_mutex_key = + new toku_instr_key(toku_instr_object_type::mutex, + toku_instr_group_name, + "cachetable_ev_thread_lock_mutex"); + cachetable_disk_nb_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "cachetable_disk_nb_mutex"); + safe_file_size_lock_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "safe_file_size_lock_mutex"); + cachetable_m_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "cachetable_m_mutex_key"); + checkpoint_safe_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "checkpoint_safe_mutex"); + ft_ref_lock_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "ft_ref_lock_mutex"); + ft_open_close_lock_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "ft_open_close_lock_mutex"); + loader_error_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "loader_error_mutex"); + bfs_mutex_key = + new toku_instr_key(toku_instr_object_type::mutex, toku_instr_group_name, + "bfs_mutex"); + loader_bl_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "loader_bl_mutex"); + loader_fi_lock_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "loader_fi_lock_mutex"); + loader_out_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "loader_out_mutex"); + result_output_condition_lock_mutex_key = + new toku_instr_key(toku_instr_object_type::mutex, + toku_instr_group_name, + "result_output_condition_lock_mutex"); + block_table_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "block_table_mutex"); + rollback_log_node_cache_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "rollback_log_node_cache_mutex"); + txn_lock_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, "txn_lock_mutex"); + txn_state_lock_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "txn_state_lock_mutex"); + txn_child_manager_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "txn_child_manager_mutex"); + txn_manager_lock_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "txn_manager_lock_mutex"); + treenode_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, "treenode_mutex"); + locktree_request_info_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "locktree_request_info_mutex"); + locktree_request_info_retry_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "locktree_request_info_retry_mutex_key"); + manager_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, "manager_mutex"); + manager_escalation_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "manager_escalation_mutex"); + db_txn_struct_i_txn_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "db_txn_struct_i_txn_mutex"); + manager_escalator_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "manager_escalator_mutex"); + indexer_i_indexer_lock_mutex_key = new toku_instr_key( + toku_instr_object_type::mutex, toku_instr_group_name, + "indexer_i_indexer_lock_mutex"); + indexer_i_indexer_estimate_lock_mutex_key = + new toku_instr_key(toku_instr_object_type::mutex, + toku_instr_group_name, + "indexer_i_indexer_estimate_lock_mutex"); + + tokudb_file_data_key = new toku_instr_key( + toku_instr_object_type::file, toku_instr_group_name, "tokudb_data_file"); + tokudb_file_load_key = new toku_instr_key( + toku_instr_object_type::file, toku_instr_group_name, "tokudb_load_file"); + tokudb_file_tmp_key = new toku_instr_key( + toku_instr_object_type::file, toku_instr_group_name, "tokudb_tmp_file"); + tokudb_file_log_key = new toku_instr_key( + toku_instr_object_type::file, toku_instr_group_name, "tokudb_log_file"); + + fti_probe_1_key = + new toku_instr_key(toku_instr_object_type::mutex, toku_instr_group_name, + "fti_probe_1"); + + extractor_thread_key = new toku_instr_key( + toku_instr_object_type::thread, toku_instr_group_name, + "extractor_thread"); + fractal_thread_key = new toku_instr_key( + toku_instr_object_type::thread, toku_instr_group_name, "fractal_thread"); + io_thread_key = + new toku_instr_key(toku_instr_object_type::thread, toku_instr_group_name, + "io_thread"); + eviction_thread_key = new toku_instr_key( + toku_instr_object_type::thread, toku_instr_group_name, + "eviction_thread"); + kibbutz_thread_key = new toku_instr_key( + toku_instr_object_type::thread, toku_instr_group_name, "kibbutz_thread"); + minicron_thread_key = new toku_instr_key( + toku_instr_object_type::thread, toku_instr_group_name, + "minicron_thread"); + tp_internal_thread_key = new toku_instr_key( + toku_instr_object_type::thread, toku_instr_group_name, + "tp_internal_thread"); + + result_state_cond_key = new toku_instr_key( + toku_instr_object_type::cond, toku_instr_group_name, + "result_state_cond"); + bjm_jobs_wait_key = new toku_instr_key( + toku_instr_object_type::cond, toku_instr_group_name, "bjm_jobs_wait"); + cachetable_p_refcount_wait_key = new toku_instr_key( + toku_instr_object_type::cond, toku_instr_group_name, + "cachetable_p_refcount_wait"); + cachetable_m_flow_control_cond_key = new toku_instr_key( + toku_instr_object_type::cond, toku_instr_group_name, + "cachetable_m_flow_control_cond"); + cachetable_m_ev_thread_cond_key = new toku_instr_key( + toku_instr_object_type::cond, toku_instr_group_name, + "cachetable_m_ev_thread_cond"); + bfs_cond_key = + new toku_instr_key(toku_instr_object_type::cond, toku_instr_group_name, + "bfs_cond"); + result_output_condition_key = new toku_instr_key( + toku_instr_object_type::cond, toku_instr_group_name, + "result_output_condition"); + manager_m_escalator_done_key = new toku_instr_key( + toku_instr_object_type::cond, toku_instr_group_name, + "manager_m_escalator_done"); + lock_request_m_wait_cond_key = new toku_instr_key( + toku_instr_object_type::cond, toku_instr_group_name, + "lock_request_m_wait_cond"); + queue_result_cond_key = new toku_instr_key( + toku_instr_object_type::cond, toku_instr_group_name, + "queue_result_cond"); + ws_worker_wait_key = new toku_instr_key( + toku_instr_object_type::cond, toku_instr_group_name, "ws_worker_wait"); + rwlock_wait_read_key = new toku_instr_key( + toku_instr_object_type::cond, toku_instr_group_name, "rwlock_wait_read"); + rwlock_wait_write_key = new toku_instr_key( + toku_instr_object_type::cond, toku_instr_group_name, + "rwlock_wait_write"); + rwlock_cond_key = + new toku_instr_key(toku_instr_object_type::cond, toku_instr_group_name, + "rwlock_cond"); + tp_thread_wait_key = new toku_instr_key( + toku_instr_object_type::cond, toku_instr_group_name, "tp_thread_wait"); + tp_pool_wait_free_key = new toku_instr_key( + toku_instr_object_type::cond, toku_instr_group_name, + "tp_pool_wait_free"); + frwlock_m_wait_read_key = new toku_instr_key( + toku_instr_object_type::cond, toku_instr_group_name, + "frwlock_m_wait_read"); + kibbutz_k_cond_key = new toku_instr_key( + toku_instr_object_type::cond, toku_instr_group_name, "kibbutz_k_cond"); + minicron_p_condvar_key = new toku_instr_key( + toku_instr_object_type::cond, toku_instr_group_name, + "minicron_p_condvar"); + locktree_request_info_retry_cv_key = new toku_instr_key( + toku_instr_object_type::cond, toku_instr_group_name, + "locktree_request_info_retry_cv_key"); + + multi_operation_lock_key = new toku_instr_key( + toku_instr_object_type::rwlock, toku_instr_group_name, + "multi_operation_lock"); + low_priority_multi_operation_lock_key = + new toku_instr_key(toku_instr_object_type::rwlock, + toku_instr_group_name, + "low_priority_multi_operation_lock"); + cachetable_m_list_lock_key = new toku_instr_key( + toku_instr_object_type::rwlock, toku_instr_group_name, + "cachetable_m_list_lock"); + cachetable_m_pending_lock_expensive_key = + new toku_instr_key(toku_instr_object_type::rwlock, + toku_instr_group_name, + "cachetable_m_pending_lock_expensive"); + cachetable_m_pending_lock_cheap_key = + new toku_instr_key(toku_instr_object_type::rwlock, + toku_instr_group_name, + "cachetable_m_pending_lock_cheap"); + cachetable_m_lock_key = new toku_instr_key( + toku_instr_object_type::rwlock, toku_instr_group_name, + "cachetable_m_lock"); + result_i_open_dbs_rwlock_key = new toku_instr_key( + toku_instr_object_type::rwlock, toku_instr_group_name, + "result_i_open_dbs_rwlock"); + checkpoint_safe_rwlock_key = new toku_instr_key( + toku_instr_object_type::rwlock, toku_instr_group_name, + "checkpoint_safe_rwlock"); + cachetable_value_key = new toku_instr_key( + toku_instr_object_type::rwlock, toku_instr_group_name, + "cachetable_value"); + safe_file_size_lock_rwlock_key = new toku_instr_key( + toku_instr_object_type::rwlock, toku_instr_group_name, + "safe_file_size_lock_rwlock"); + cachetable_disk_nb_rwlock_key = new toku_instr_key( + toku_instr_object_type::rwlock, toku_instr_group_name, + "cachetable_disk_nb_rwlock"); + + toku_instr_probe_1 = new toku_instr_probe(*fti_probe_1_key); +} + int toku_ft_layer_init(void) { int r = 0; - //Portability must be initialized first + + // Portability must be initialized first r = toku_portability_init(); - if (r) { goto exit; } + if (r) { + goto exit; + } + + toku_pfs_keys_init("fti"); + r = db_env_set_toku_product_name("tokudb"); - if (r) { goto exit; } + if (r) { + goto exit; + } partitioned_counters_init(); toku_status_init(); toku_context_status_init(); toku_checkpoint_init(); toku_ft_serialize_layer_init(); - toku_mutex_init(&ft_open_close_lock, NULL); + toku_mutex_init( + *ft_open_close_lock_mutex_key, &ft_open_close_lock, nullptr); toku_scoped_malloc_init(); exit: return r; @@ -4641,7 +4916,10 @@ void toku_ft_layer_destroy(void) { toku_status_destroy(); partitioned_counters_destroy(); toku_scoped_malloc_destroy(); - //Portability must be cleaned up last + + delete toku_instr_probe_1; + + // Portability must be cleaned up last toku_portability_destroy(); } diff --git a/storage/tokudb/PerconaFT/ft/ft.cc b/storage/tokudb/PerconaFT/ft/ft.cc index 700e532d..454bf117 100644 --- a/storage/tokudb/PerconaFT/ft/ft.cc +++ b/storage/tokudb/PerconaFT/ft/ft.cc @@ -50,9 +50,10 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include #include -void -toku_reset_root_xid_that_created(FT ft, TXNID new_root_xid_that_created) { - // Reset the root_xid_that_created field to the given value. +toku_instr_key *ft_ref_lock_mutex_key; + +void toku_reset_root_xid_that_created(FT ft, TXNID new_root_xid_that_created) { + // Reset the root_xid_that_created field to the given value. // This redefines which xid created the dictionary. // hold lock around setting and clearing of dirty bit @@ -100,15 +101,11 @@ toku_ft_free (FT ft) { toku_free(ft); } -void -toku_ft_init_reflock(FT ft) { - toku_mutex_init(&ft->ft_ref_lock, NULL); +void toku_ft_init_reflock(FT ft) { + toku_mutex_init(*ft_ref_lock_mutex_key, &ft->ft_ref_lock, nullptr); } -void -toku_ft_destroy_reflock(FT ft) { - toku_mutex_destroy(&ft->ft_ref_lock); -} +void toku_ft_destroy_reflock(FT ft) { toku_mutex_destroy(&ft->ft_ref_lock); } void toku_ft_grab_reflock(FT ft) { diff --git a/storage/tokudb/PerconaFT/ft/loader/callbacks.cc b/storage/tokudb/PerconaFT/ft/loader/callbacks.cc index 6a520dba..ac69fb7e 100644 --- a/storage/tokudb/PerconaFT/ft/loader/callbacks.cc +++ b/storage/tokudb/PerconaFT/ft/loader/callbacks.cc @@ -45,6 +45,8 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "loader/loader-internal.h" #include "util/dbt.h" +toku_instr_key *loader_error_mutex_key; + static void error_callback_lock(ft_loader_error_callback loader_error) { toku_mutex_lock(&loader_error->mutex); } @@ -57,10 +59,10 @@ void ft_loader_init_error_callback(ft_loader_error_callback loader_error) { memset(loader_error, 0, sizeof *loader_error); toku_init_dbt(&loader_error->key); toku_init_dbt(&loader_error->val); - toku_mutex_init(&loader_error->mutex, NULL); + toku_mutex_init(*loader_error_mutex_key, &loader_error->mutex, nullptr); } -void ft_loader_destroy_error_callback(ft_loader_error_callback loader_error) { +void ft_loader_destroy_error_callback(ft_loader_error_callback loader_error) { toku_mutex_destroy(&loader_error->mutex); toku_destroy_dbt(&loader_error->key); toku_destroy_dbt(&loader_error->val); diff --git a/storage/tokudb/PerconaFT/ft/loader/dbufio.cc b/storage/tokudb/PerconaFT/ft/loader/dbufio.cc index 28d8d49b..9ff712bc 100644 --- a/storage/tokudb/PerconaFT/ft/loader/dbufio.cc +++ b/storage/tokudb/PerconaFT/ft/loader/dbufio.cc @@ -48,6 +48,10 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "loader/dbufio.h" #include "loader/loader-internal.h" +toku_instr_key *bfs_mutex_key; +toku_instr_key *bfs_cond_key; +toku_instr_key *io_thread_key; + struct dbufio_file { // i/o thread owns these int fd; @@ -275,39 +279,44 @@ static void* io_thread (void *v) toku_mutex_lock(&bfs->mutex); //printf("%s:%d Locked\n", __FILE__, __LINE__); while (1) { + if (paniced(bfs)) { + toku_mutex_unlock(&bfs->mutex); // ignore any error + toku_instr_delete_current_thread(); + return toku_pthread_done(nullptr); + } + // printf("n_not_done=%d\n", bfs->n_not_done); + if (bfs->n_not_done == 0) { + // all done (meaning we stored EOF (or another error) in + // error_code[0] for the file. + // printf("unlocked\n"); + toku_mutex_unlock(&bfs->mutex); + toku_instr_delete_current_thread(); + return toku_pthread_done(nullptr); + } - if (paniced(bfs)) { - toku_mutex_unlock(&bfs->mutex); // ignore any error - return 0; - } - //printf("n_not_done=%d\n", bfs->n_not_done); - if (bfs->n_not_done==0) { - // all done (meaning we stored EOF (or another error) in error_code[0] for the file. - //printf("unlocked\n"); - toku_mutex_unlock(&bfs->mutex); - return 0; - } - - struct dbufio_file *dbf = bfs->head; - if (dbf==NULL) { - // No I/O needs to be done yet. - // Wait until something happens that will wake us up. - toku_cond_wait(&bfs->cond, &bfs->mutex); - if (paniced(bfs)) { - toku_mutex_unlock(&bfs->mutex); // ignore any error - return 0; - } - // Have the lock so go around. - } else { - // Some I/O needs to be done. - //printf("%s:%d Need I/O\n", __FILE__, __LINE__); - assert(dbf->second_buf_ready == false); - assert(!dbf->io_done); - bfs->head = dbf->next; - if (bfs->head==NULL) bfs->tail=NULL; - - // Unlock the mutex now that we have ownership of dbf to allow consumers to get the mutex and perform swaps. They won't swap - // this buffer because second_buf_ready is false. + struct dbufio_file *dbf = bfs->head; + if (dbf == NULL) { + // No I/O needs to be done yet. + // Wait until something happens that will wake us up. + toku_cond_wait(&bfs->cond, &bfs->mutex); + if (paniced(bfs)) { + toku_mutex_unlock(&bfs->mutex); // ignore any error + toku_instr_delete_current_thread(); + return toku_pthread_done(nullptr); + } + // Have the lock so go around. + } else { + // Some I/O needs to be done. + // printf("%s:%d Need I/O\n", __FILE__, __LINE__); + assert(dbf->second_buf_ready == false); + assert(!dbf->io_done); + bfs->head = dbf->next; + if (bfs->head == NULL) + bfs->tail = NULL; + + // Unlock the mutex now that we have ownership of dbf to allow + // consumers to get the mutex and perform swaps. They won't swap + // this buffer because second_buf_ready is false. toku_mutex_unlock(&bfs->mutex); //printf("%s:%d Doing read fd=%d\n", __FILE__, __LINE__, dbf->fd); { @@ -338,14 +347,16 @@ static void* io_thread (void *v) //printf("%s:%d locking mutex again=%ld\n", __FILE__, __LINE__, readcode); { - toku_mutex_lock(&bfs->mutex); - if (paniced(bfs)) { - toku_mutex_unlock(&bfs->mutex); // ignore any error - return 0; - } - } - // Now that we have the mutex, we can decrement n_not_done (if applicable) and set second_buf_ready - if (readcode<=0) { + toku_mutex_lock(&bfs->mutex); + if (paniced(bfs)) { + toku_mutex_unlock(&bfs->mutex); // ignore any error + toku_instr_delete_current_thread(); + return toku_pthread_done(nullptr); + } + } + // Now that we have the mutex, we can decrement n_not_done (if + // applicable) and set second_buf_ready + if (readcode<=0) { bfs->n_not_done--; } //printf("%s:%d n_not_done=%d\n", __FILE__, __LINE__, bfs->n_not_done); @@ -376,34 +387,36 @@ int create_dbufio_fileset (DBUFIO_FILESET *bfsp, int N, int fds[/*N*/], size_t b } } } - //printf("%s:%d here\n", __FILE__, __LINE__); - if (result==0) { - toku_mutex_init(&bfs->mutex, NULL); - mutex_inited = true; + // printf("%s:%d here\n", __FILE__, __LINE__); + if (result == 0) { + toku_mutex_init(*bfs_mutex_key, &bfs->mutex, nullptr); + mutex_inited = true; } - if (result==0) { - toku_cond_init(&bfs->cond, NULL); - cond_inited = true; + if (result == 0) { + toku_cond_init(*bfs_cond_key, &bfs->cond, nullptr); + cond_inited = true; } - if (result==0) { - bfs->N = N; - bfs->n_not_done = N; - bfs->head = bfs->tail = NULL; - for (int i=0; ifiles[i].fd = fds[i]; - bfs->files[i].offset_in_buf = 0; - bfs->files[i].offset_in_uncompressed_file = 0; - bfs->files[i].next = NULL; - bfs->files[i].second_buf_ready = false; - for (int j=0; j<2; j++) { - if (result==0) { - MALLOC_N(bufsize, bfs->files[i].buf[j]); - if (bfs->files[i].buf[j]==NULL) { result=get_error_errno(); } - } - bfs->files[i].n_in_buf[j] = 0; - bfs->files[i].error_code[j] = 0; - } - bfs->files[i].io_done = false; + if (result == 0) { + bfs->N = N; + bfs->n_not_done = N; + bfs->head = bfs->tail = NULL; + for (int i = 0; i < N; i++) { + bfs->files[i].fd = fds[i]; + bfs->files[i].offset_in_buf = 0; + bfs->files[i].offset_in_uncompressed_file = 0; + bfs->files[i].next = NULL; + bfs->files[i].second_buf_ready = false; + for (int j = 0; j < 2; j++) { + if (result == 0) { + MALLOC_N(bufsize, bfs->files[i].buf[j]); + if (bfs->files[i].buf[j] == NULL) { + result = get_error_errno(); + } + } + bfs->files[i].n_in_buf[j] = 0; + bfs->files[i].error_code[j] = 0; + } + bfs->files[i].io_done = false; ssize_t r; if (bfs->compressed) { r = dbf_read_compressed(&bfs->files[i], bfs->files[i].buf[0], bufsize); @@ -430,13 +443,21 @@ int create_dbufio_fileset (DBUFIO_FILESET *bfsp, int N, int fds[/*N*/], size_t b bfs->panic = false; bfs->panic_errno = 0; } - //printf("Creating IO thread\n"); - if (result==0) { - result = toku_pthread_create(&bfs->iothread, NULL, io_thread, (void*)bfs); + // printf("Creating IO thread\n"); + if (result == 0) { + result = toku_pthread_create(*io_thread_key, + &bfs->iothread, + nullptr, + io_thread, + static_cast(bfs)); + } + if (result == 0) { + *bfsp = bfs; + return 0; } - if (result==0) { *bfsp = bfs; return 0; } // Now undo everything. - // If we got here, there is no thread (either result was zero before the thread was created, or else the thread creation itself failed. + // If we got here, there is no thread (either result was zero before the + // thread was created, or else the thread creation itself failed. if (bfs) { if (bfs->files) { // the files were allocated, so we have to free all the bufs. diff --git a/storage/tokudb/PerconaFT/ft/loader/loader-internal.h b/storage/tokudb/PerconaFT/ft/loader/loader-internal.h index 1aa2c203..6f7b0147 100644 --- a/storage/tokudb/PerconaFT/ft/loader/loader-internal.h +++ b/storage/tokudb/PerconaFT/ft/loader/loader-internal.h @@ -64,10 +64,10 @@ enum { /* These structures maintain a collection of all the open temporary files used by the loader. */ struct file_info { bool is_open; - bool is_extant; // if true, the file must be unlinked. + bool is_extant; // if true, the file must be unlinked. char *fname; - FILE *file; - uint64_t n_rows; // how many rows were written into that file + TOKU_FILE *file; + uint64_t n_rows; // how many rows were written into that file size_t buffer_size; void *buffer; }; @@ -80,11 +80,11 @@ struct file_infos { }; typedef struct fidx { int idx; } FIDX; static const FIDX FIDX_NULL __attribute__((__unused__)) = {-1}; -static int fidx_is_null (const FIDX f) __attribute__((__unused__)); -static int fidx_is_null (const FIDX f) { return f.idx==-1; } -FILE *toku_bl_fidx2file (FTLOADER bl, FIDX i); +static int fidx_is_null(const FIDX f) __attribute__((__unused__)); +static int fidx_is_null(const FIDX f) { return f.idx == -1; } +TOKU_FILE *toku_bl_fidx2file(FTLOADER bl, FIDX i); -int ft_loader_open_temp_file (FTLOADER bl, FIDX*file_idx); +int ft_loader_open_temp_file(FTLOADER bl, FIDX *file_idx); /* These data structures are used for manipulating a collection of rows in main memory. */ struct row { @@ -100,11 +100,17 @@ struct rowset { }; int init_rowset (struct rowset *rows, uint64_t memory_budget); -void destroy_rowset (struct rowset *rows); -int add_row (struct rowset *rows, DBT *key, DBT *val); - -int loader_write_row(DBT *key, DBT *val, FIDX data, FILE*, uint64_t *dataoff, struct wbuf *wb, FTLOADER bl); -int loader_read_row (FILE *f, DBT *key, DBT *val); +void destroy_rowset(struct rowset *rows); +int add_row(struct rowset *rows, DBT *key, DBT *val); + +int loader_write_row(DBT *key, + DBT *val, + FIDX data, + TOKU_FILE *, + uint64_t *dataoff, + struct wbuf *wb, + FTLOADER bl); +int loader_read_row(TOKU_FILE *f, DBT *key, DBT *val); struct merge_fileset { bool have_sorted_output; // Is there an previous key? @@ -195,12 +201,13 @@ struct ft_loader_s { bool did_reserve_memory; bool compress_intermediates; bool allow_puts; - uint64_t reserved_memory; // how much memory are we allowed to use? + uint64_t reserved_memory; // how much memory are we allowed to use? - /* To make it easier to recover from errors, we don't use FILE*, instead we use an index into the file_infos. */ + /* To make it easier to recover from errors, we don't use TOKU_FILE*, + * instead we use an index into the file_infos. */ struct file_infos file_infos; -#define PROGRESS_MAX (1<<16) +#define PROGRESS_MAX (1 << 16) int progress; // Progress runs from 0 to PROGRESS_MAX. When we call the poll function we convert to a float from 0.0 to 1.0 // We use an integer so that we can add to the progress using a fetch-and-add instruction. diff --git a/storage/tokudb/PerconaFT/ft/loader/loader.cc b/storage/tokudb/PerconaFT/ft/loader/loader.cc index 528c86a8..9528af95 100644 --- a/storage/tokudb/PerconaFT/ft/loader/loader.cc +++ b/storage/tokudb/PerconaFT/ft/loader/loader.cc @@ -62,21 +62,17 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "util/x1764.h" -static size_t (*os_fwrite_fun)(const void *,size_t,size_t,FILE*)=NULL; -void ft_loader_set_os_fwrite (size_t (*fwrite_fun)(const void*,size_t,size_t,FILE*)) { - os_fwrite_fun=fwrite_fun; -} +toku_instr_key *loader_bl_mutex_key; +toku_instr_key *loader_fi_lock_mutex_key; +toku_instr_key *loader_out_mutex_key; -static size_t do_fwrite (const void *ptr, size_t size, size_t nmemb, FILE *stream) { - if (os_fwrite_fun) { - return os_fwrite_fun(ptr, size, nmemb, stream); - } else { - return fwrite(ptr, size, nmemb, stream); - } -} +toku_instr_key *extractor_thread_key; +toku_instr_key *fractal_thread_key; +toku_instr_key *tokudb_file_tmp_key; +toku_instr_key *tokudb_file_load_key; -// 1024 is the right size_factor for production. +// 1024 is the right size_factor for production. // Different values for these sizes may be used for testing. static uint32_t size_factor = 1024; static uint32_t default_loader_nodesize = FT_DEFAULT_NODE_SIZE; @@ -98,7 +94,7 @@ toku_ft_loader_get_rowset_budget_for_testing (void) void ft_loader_lock_init(FTLOADER bl) { invariant(!bl->mutex_init); - toku_mutex_init(&bl->mutex, NULL); + toku_mutex_init(*loader_bl_mutex_key, &bl->mutex, nullptr); bl->mutex_init = true; } @@ -130,7 +126,10 @@ static int add_big_buffer(struct file_info *file) { newbuffer = true; } if (result == 0) { - int r = setvbuf(file->file, (char *) file->buffer, _IOFBF, file->buffer_size); + int r = setvbuf(file->file->file, + static_cast(file->buffer), + _IOFBF, + file->buffer_size); if (r != 0) { result = get_error_errno(); if (newbuffer) { @@ -149,9 +148,9 @@ static void cleanup_big_buffer(struct file_info *file) { } } -int ft_loader_init_file_infos (struct file_infos *fi) { +int ft_loader_init_file_infos(struct file_infos *fi) { int result = 0; - toku_mutex_init(&fi->lock, NULL); + toku_mutex_init(*loader_fi_lock_mutex_key, &fi->lock, nullptr); fi->n_files = 0; fi->n_files_limit = 1; fi->n_files_open = 0; @@ -195,11 +194,10 @@ void ft_loader_fi_destroy (struct file_infos *fi, bool is_error) fi->file_infos = NULL; } -static int open_file_add (struct file_infos *fi, - FILE *file, - char *fname, - /* out */ FIDX *idx) -{ +static int open_file_add(struct file_infos *fi, + TOKU_FILE *file, + char *fname, + /* out */ FIDX *idx) { int result = 0; toku_mutex_lock(&fi->lock); if (fi->n_files >= fi->n_files_limit) { @@ -229,11 +227,12 @@ int ft_loader_fi_reopen (struct file_infos *fi, FIDX idx, const char *mode) { int result = 0; toku_mutex_lock(&fi->lock); int i = idx.idx; - invariant(i>=0 && in_files); + invariant(i >= 0 && i < fi->n_files); invariant(!fi->file_infos[i].is_open); invariant(fi->file_infos[i].is_extant); - fi->file_infos[i].file = toku_os_fopen(fi->file_infos[i].fname, mode); - if (fi->file_infos[i].file == NULL) { + fi->file_infos[i].file = + toku_os_fopen(fi->file_infos[i].fname, mode, *tokudb_file_load_key); + if (fi->file_infos[i].file == NULL) { result = get_error_errno(); } else { fi->file_infos[i].is_open = true; @@ -306,20 +305,20 @@ int ft_loader_open_temp_file (FTLOADER bl, FIDX *file_idx) */ { int result = 0; - if (result) // debug hack + if (result) // debug hack return result; - FILE *f = NULL; + TOKU_FILE *f = NULL; int fd = -1; - char *fname = toku_strdup(bl->temp_file_template); + char *fname = toku_strdup(bl->temp_file_template); if (fname == NULL) result = get_error_errno(); else { fd = mkstemp(fname); - if (fd < 0) { + if (fd < 0) { result = get_error_errno(); } else { - f = toku_os_fdopen(fd, "r+"); - if (f == NULL) + f = toku_os_fdopen(fd, "r+", fname, *tokudb_file_tmp_key); + if (f->file == nullptr) result = get_error_errno(); else result = open_file_add(&bl->file_infos, f, fname, file_idx); @@ -338,7 +337,7 @@ int ft_loader_open_temp_file (FTLOADER bl, FIDX *file_idx) return result; } -void toku_ft_loader_internal_destroy (FTLOADER bl, bool is_error) { +void toku_ft_loader_internal_destroy(FTLOADER bl, bool is_error) { ft_loader_lock_destroy(bl); // These frees rely on the fact that if you free a NULL pointer then nothing bad happens. @@ -634,12 +633,16 @@ int toku_ft_loader_open (FTLOADER *blp, /* out */ allow_puts); if (r!=0) result = r; } - if (result==0 && allow_puts) { + if (result == 0 && allow_puts) { FTLOADER bl = *blp; - int r = toku_pthread_create(&bl->extractor_thread, NULL, extractor_thread, (void*)bl); - if (r==0) { + int r = toku_pthread_create(*extractor_thread_key, + &bl->extractor_thread, + nullptr, + extractor_thread, + static_cast(bl)); + if (r == 0) { bl->extractor_live = true; - } else { + } else { result = r; (void) toku_ft_loader_internal_destroy(bl, true); } @@ -658,17 +661,17 @@ static void ft_loader_set_panic(FTLOADER bl, int error, bool callback, int which } // One of the tests uses this. -FILE *toku_bl_fidx2file (FTLOADER bl, FIDX i) { +TOKU_FILE *toku_bl_fidx2file(FTLOADER bl, FIDX i) { toku_mutex_lock(&bl->file_infos.lock); - invariant(i.idx >=0 && i.idx < bl->file_infos.n_files); + invariant(i.idx >= 0 && i.idx < bl->file_infos.n_files); invariant(bl->file_infos.file_infos[i.idx].is_open); - FILE *result=bl->file_infos.file_infos[i.idx].file; + TOKU_FILE *result = bl->file_infos.file_infos[i.idx].file; toku_mutex_unlock(&bl->file_infos.lock); return result; } -static int bl_finish_compressed_write(FILE *stream, struct wbuf *wb) { - int r; +static int bl_finish_compressed_write(TOKU_FILE *stream, struct wbuf *wb) { + int r = 0; char *compressed_buf = NULL; const size_t data_size = wb->ndone; invariant(data_size > 0); @@ -719,31 +722,23 @@ static int bl_finish_compressed_write(FILE *stream, struct wbuf *wb) { // Mark as written wb->ndone = 0; - size_t size_to_write = total_size + 4; // Includes writing total_size + size_t size_to_write = total_size + 4; // Includes writing total_size + + r = toku_os_fwrite(compressed_buf, 1, size_to_write, stream); - { - size_t written = do_fwrite(compressed_buf, 1, size_to_write, stream); - if (written!=size_to_write) { - if (os_fwrite_fun) // if using hook to induce artificial errors (for testing) ... - r = get_maybe_error_errno(); // ... then there is no error in the stream, but there is one in errno - else - r = ferror(stream); - invariant(r!=0); - goto exit; - } - } - r = 0; -exit: if (compressed_buf) { toku_free(compressed_buf); } return r; } -static int bl_compressed_write(void *ptr, size_t nbytes, FILE *stream, struct wbuf *wb) { +static int bl_compressed_write(void *ptr, + size_t nbytes, + TOKU_FILE *stream, + struct wbuf *wb) { invariant(wb->size <= MAX_UNCOMPRESSED_BUF); size_t bytes_left = nbytes; - char *buf = (char*)ptr; + char *buf = (char *)ptr; while (bytes_left > 0) { size_t bytes_to_copy = bytes_left; @@ -766,29 +761,28 @@ static int bl_compressed_write(void *ptr, size_t nbytes, FILE *stream, struct wb return 0; } -static int bl_fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream, struct wbuf *wb, FTLOADER bl) -/* Effect: this is a wrapper for fwrite that returns 0 on success, otherwise returns an error number. +static int bl_fwrite(void *ptr, + size_t size, + size_t nmemb, + TOKU_FILE *stream, + struct wbuf *wb, + FTLOADER bl) +/* Effect: this is a wrapper for fwrite that returns 0 on success, otherwise + * returns an error number. * Arguments: * ptr the data to be writen. * size the amount of data to be written. * nmemb the number of units of size to be written. * stream write the data here. - * wb where to write uncompressed data (if we're compressing) or ignore if NULL - * bl passed so we can panic the ft_loader if something goes wrong (recording the error number). + * wb where to write uncompressed data (if we're compressing) or ignore if + * NULL + * bl passed so we can panic the ft_loader if something goes wrong + * (recording the error number). * Return value: 0 on success, an error number otherwise. */ { if (!bl->compress_intermediates || !wb) { - size_t r = do_fwrite(ptr, size, nmemb, stream); - if (r!=nmemb) { - int e; - if (os_fwrite_fun) // if using hook to induce artificial errors (for testing) ... - e = get_maybe_error_errno(); // ... then there is no error in the stream, but there is one in errno - else - e = ferror(stream); - invariant(e!=0); - return e; - } + return toku_os_fwrite(ptr, size, nmemb, stream); } else { size_t num_bytes = size * nmemb; int r = bl_compressed_write(ptr, num_bytes, stream, wb); @@ -799,8 +793,9 @@ static int bl_fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream, struct return 0; } -static int bl_fread (void *ptr, size_t size, size_t nmemb, FILE *stream) -/* Effect: this is a wrapper for fread that returns 0 on success, otherwise returns an error number. +static int bl_fread(void *ptr, size_t size, size_t nmemb, TOKU_FILE *stream) +/* Effect: this is a wrapper for fread that returns 0 on success, otherwise + * returns an error number. * Arguments: * ptr read data into here. * size size of data element to be read. @@ -809,24 +804,14 @@ static int bl_fread (void *ptr, size_t size, size_t nmemb, FILE *stream) * Return value: 0 on success, an error number otherwise. */ { - size_t r = fread(ptr, size, nmemb, stream); - if (r==0) { - if (feof(stream)) return EOF; - else { - do_error: ; - int e = ferror(stream); - // r == 0 && !feof && e == 0, how does this happen? invariant(e!=0); - return e; - } - } else if (rsize; if ((r=bl_fwrite(&dlen, sizeof(dlen), 1, datafile, wb, bl))) return r; @@ -836,8 +821,7 @@ static int bl_write_dbt (DBT *dbt, FILE* datafile, uint64_t *dataoff, struct wbu return 0; } -static int bl_read_dbt (/*in*/DBT *dbt, FILE *stream) -{ +static int bl_read_dbt(/*in*/ DBT *dbt, TOKU_FILE *stream) { int len; { int r; @@ -891,13 +875,20 @@ static int bl_read_dbt_from_dbufio (/*in*/DBT *dbt, DBUFIO_FILESET bfs, int file return result; } - -int loader_write_row(DBT *key, DBT *val, FIDX data, FILE *dataf, uint64_t *dataoff, struct wbuf *wb, FTLOADER bl) -/* Effect: Given a key and a val (both DBTs), write them to a file. Increment *dataoff so that it's up to date. +int loader_write_row(DBT *key, + DBT *val, + FIDX data, + TOKU_FILE *dataf, + uint64_t *dataoff, + struct wbuf *wb, + FTLOADER bl) +/* Effect: Given a key and a val (both DBTs), write them to a file. Increment + * *dataoff so that it's up to date. * Arguments: * key, val write these. * data the file to write them to - * dataoff a pointer to a counter that keeps track of the amount of data written so far. + * dataoff a pointer to a counter that keeps track of the amount of data + * written so far. * wb a pointer (possibly NULL) to buffer uncompressed output * bl the ft_loader (passed so we can panic if needed). * Return value: 0 on success, an error number otherwise. @@ -915,8 +906,9 @@ int loader_write_row(DBT *key, DBT *val, FIDX data, FILE *dataf, uint64_t *datao return 0; } -int loader_read_row (FILE *f, DBT *key, DBT *val) -/* Effect: Read a key value pair from a file. The DBTs must have DB_DBT_REALLOC set. +int loader_read_row(TOKU_FILE *f, DBT *key, DBT *val) +/* Effect: Read a key value pair from a file. The DBTs must have DB_DBT_REALLOC + * set. * Arguments: * f where to read it from. * key, val read it into these. @@ -1086,7 +1078,7 @@ static void* extractor_thread (void *blv) { FTLOADER bl = (FTLOADER)blv; int r = 0; while (1) { - void *item; + void *item = nullptr; { int rq = toku_queue_deq(bl->primary_rowset_queue, &item, NULL, NULL); if (rq==EOF) break; @@ -1107,14 +1099,14 @@ static void* extractor_thread (void *blv) { //printf("%s:%d extractor finishing\n", __FILE__, __LINE__); if (r == 0) { r = finish_primary_rows(bl); - if (r) + if (r) ft_loader_set_panic(bl, r, false, 0, nullptr, nullptr); - } - return NULL; + toku_instr_delete_current_thread(); + return nullptr; } -static void enqueue_for_extraction (FTLOADER bl) { +static void enqueue_for_extraction(FTLOADER bl) { //printf("%s:%d enqueing %ld items\n", __FILE__, __LINE__, bl->primary_rowset.n_rows); struct rowset *XMALLOC(enqueue_me); *enqueue_me = bl->primary_rowset; @@ -1625,11 +1617,12 @@ static int write_rowset_to_file (FTLOADER bl, FIDX sfile, const struct rowset ro struct wbuf wb; wbuf_init(&wb, uncompressed_buffer, MAX_UNCOMPRESSED_BUF); - FILE *sstream = toku_bl_fidx2file(bl, sfile); - for (size_t i=0; iprogress, bl->progress+progress_allocation); + // printf(" merge_some_files progress=%d fin at %d\n", bl->progress, + // bl->progress+progress_allocation); DBT keys[n_sources]; DBT vals[n_sources]; uint64_t dataoff[n_sources]; @@ -1942,12 +1952,18 @@ static int merge_some_files (const bool to_q, FIDX dest_data, QUEUE q, int n_sou int result = 0; DBUFIO_FILESET bfs = NULL; int *MALLOC_N(n_sources, fds); - if (fds==NULL) result=get_error_errno(); - if (result==0) { - for (int i=0; ifile); // we rely on the + // fact that when + // the files are + // closed, the fd + // is also closed. + if (r == -1) { + result = get_error_errno(); break; } fds[i] = r; @@ -2177,7 +2193,7 @@ static inline void dbout_init(struct dbout *out, FT ft) { out->current_off = 0; out->n_translations = out->n_translations_limit = 0; out->translation = NULL; - toku_mutex_init(&out->mutex, NULL); + toku_mutex_init(*loader_out_mutex_key, &out->mutex, nullptr); out->ft = ft; } @@ -2417,7 +2433,7 @@ static int toku_loader_write_ft_from_q (FTLOADER bl, assert_zero(r); return result; } - FILE *pivots_stream = toku_bl_fidx2file(bl, pivots_file); + TOKU_FILE *pivots_stream = toku_bl_fidx2file(bl, pivots_file); TXNID root_xid_that_created = TXNID_NONE; if (bl->root_xids_that_created) @@ -2704,21 +2720,35 @@ int toku_loader_write_ft_from_q_in_C (FTLOADER bl, static void* fractal_thread (void *ftav) { struct fractal_thread_args *fta = (struct fractal_thread_args *)ftav; - int r = toku_loader_write_ft_from_q (fta->bl, fta->descriptor, fta->fd, fta->progress_allocation, fta->q, fta->total_disksize_estimate, fta->which_db, fta->target_nodesize, fta->target_basementnodesize, fta->target_compression_method, fta->target_fanout); + int r = toku_loader_write_ft_from_q(fta->bl, + fta->descriptor, + fta->fd, + fta->progress_allocation, + fta->q, + fta->total_disksize_estimate, + fta->which_db, + fta->target_nodesize, + fta->target_basementnodesize, + fta->target_compression_method, + fta->target_fanout); fta->errno_result = r; - return NULL; -} - -static int loader_do_i (FTLOADER bl, - int which_db, - DB *dest_db, - ft_compare_func compare, - const DESCRIPTOR descriptor, - const char *new_fname, - int progress_allocation // how much progress do I need to add into bl->progress by the end.. - ) + toku_instr_delete_current_thread(); + return toku_pthread_done(nullptr); +} + +static int loader_do_i(FTLOADER bl, + int which_db, + DB *dest_db, + ft_compare_func compare, + const DESCRIPTOR descriptor, + const char *new_fname, + int progress_allocation // how much progress do I need + // to add into bl->progress by + // the end.. + ) /* Effect: Handle the file creating for one particular DB in the bulk loader. */ -/* Requires: The data is fully extracted, so we can do merges out of files and write the ft file. */ +/* Requires: The data is fully extracted, so we can do merges out of files and + write the ft file. */ { //printf("doing i use %d progress=%d fin at %d\n", progress_allocation, bl->progress, bl->progress+progress_allocation); struct merge_fileset *fs = &(bl->fs[which_db]); @@ -2729,10 +2759,14 @@ static int loader_do_i (FTLOADER bl, if (r) goto error; { - mode_t mode = S_IRUSR+S_IWUSR + S_IRGRP+S_IWGRP; - int fd = toku_os_open(new_fname, O_RDWR| O_CREAT | O_BINARY, mode); // #2621 + mode_t mode = S_IRUSR + S_IWUSR + S_IRGRP + S_IWGRP; + int fd = toku_os_open(new_fname, + O_RDWR | O_CREAT | O_BINARY, + mode, + *tokudb_file_load_key); // #2621 if (fd < 0) { - r = get_error_errno(); goto error; + r = get_error_errno(); + goto error; } uint32_t target_nodesize, target_basementnodesize, target_fanout; @@ -2752,24 +2786,27 @@ static int loader_do_i (FTLOADER bl, progress_allocation -= allocation_for_merge; // This structure must stay live until the join below. - struct fractal_thread_args fta = { - bl, - descriptor, - fd, - progress_allocation, - bl->fractal_queues[which_db], - bl->extracted_datasizes[which_db], - 0, - which_db, - target_nodesize, - target_basementnodesize, - target_compression_method, - target_fanout - }; - - r = toku_pthread_create(bl->fractal_threads+which_db, NULL, fractal_thread, (void*)&fta); + struct fractal_thread_args fta = {bl, + descriptor, + fd, + progress_allocation, + bl->fractal_queues[which_db], + bl->extracted_datasizes[which_db], + 0, + which_db, + target_nodesize, + target_basementnodesize, + target_compression_method, + target_fanout}; + + r = toku_pthread_create(*fractal_thread_key, + bl->fractal_threads + which_db, + nullptr, + fractal_thread, + static_cast(&fta)); if (r) { - int r2 __attribute__((__unused__)) = toku_queue_destroy(bl->fractal_queues[which_db]); + int r2 __attribute__((__unused__)) = + toku_queue_destroy(bl->fractal_queues[which_db]); // ignore r2, since we already have an error bl->fractal_queues[which_db] = nullptr; goto error; @@ -3106,7 +3143,7 @@ static int read_some_pivots (FIDX pivots_file, int n_to_read, FTLOADER bl, for (int i = 0; i < n_to_read; i++) pivots[i] = zero_dbt; - FILE *pivots_stream = toku_bl_fidx2file(bl, pivots_file); + TOKU_FILE *pivots_stream = toku_bl_fidx2file(bl, pivots_file); int result = 0; for (int i = 0; i < n_to_read; i++) { @@ -3158,8 +3195,9 @@ static int setup_nonleaf_block (int n_children, } if (result == 0) { - FILE *next_pivots_stream = toku_bl_fidx2file(bl, next_pivots_file); - int r = bl_write_dbt(&pivots[n_children-1], next_pivots_stream, NULL, nullptr, bl); + TOKU_FILE *next_pivots_stream = toku_bl_fidx2file(bl, next_pivots_file); + int r = bl_write_dbt( + &pivots[n_children - 1], next_pivots_stream, NULL, nullptr, bl); if (r) result = r; } @@ -3274,8 +3312,11 @@ static int write_nonleaves (FTLOADER bl, FIDX pivots_fidx, struct dbout *out, st // 2) We put the 15 pivots and 16 blocks into an non-leaf node. // 3) We put the 16th pivot into the next pivots file. { - int r = fseek(toku_bl_fidx2file(bl, pivots_fidx), 0, SEEK_SET); - if (r!=0) { return get_error_errno(); } + int r = + fseek(toku_bl_fidx2file(bl, pivots_fidx)->file, 0, SEEK_SET); + if (r != 0) { + return get_error_errno(); + } } FIDX next_pivots_file; @@ -3295,7 +3336,7 @@ static int write_nonleaves (FTLOADER bl, FIDX pivots_fidx, struct dbout *out, st while (sts->n_subtrees - n_subtrees_used >= n_per_block*2) { // grab the first N_PER_BLOCK and build a node. DBT *pivots; - int64_t blocknum_of_new_node; + int64_t blocknum_of_new_node = 0; struct subtree_info *subtree_info; int r = setup_nonleaf_block (n_per_block, sts, pivots_fidx, n_subtrees_used, diff --git a/storage/tokudb/PerconaFT/ft/loader/loader.h b/storage/tokudb/PerconaFT/ft/loader/loader.h index 9c1bdab1..cea2e8df 100644 --- a/storage/tokudb/PerconaFT/ft/loader/loader.h +++ b/storage/tokudb/PerconaFT/ft/loader/loader.h @@ -38,6 +38,7 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #pragma once +#include "toku_portability.h" #include "ft/txn/txn.h" #include "ft/cachetable/cachetable.h" #include "ft/comparator.h" @@ -77,8 +78,6 @@ int toku_ft_loader_abort(FTLOADER bl, bool is_error); // For test purposes only -void toku_ft_loader_set_size_factor (uint32_t factor); - -void ft_loader_set_os_fwrite (size_t (*fwrite_fun)(const void*,size_t,size_t,FILE*)); +void toku_ft_loader_set_size_factor(uint32_t factor); size_t ft_loader_leafentry_size(size_t key_size, size_t val_size, TXNID xid); diff --git a/storage/tokudb/PerconaFT/ft/logger/log-internal.h b/storage/tokudb/PerconaFT/ft/logger/log-internal.h index bee74fac..be19e134 100644 --- a/storage/tokudb/PerconaFT/ft/logger/log-internal.h +++ b/storage/tokudb/PerconaFT/ft/logger/log-internal.h @@ -70,11 +70,11 @@ struct mylock { }; static inline void ml_init(struct mylock *l) { - toku_mutex_init(&l->lock, 0); -} -static inline void ml_lock(struct mylock *l) { - toku_mutex_lock(&l->lock); + toku_mutex_init(*log_internal_lock_mutex_key, &l->lock, nullptr); } +// TODO: source location info might have be to be pulled up one caller +// to be useful +static inline void ml_lock(struct mylock *l) { toku_mutex_lock(&l->lock); } static inline void ml_unlock(struct mylock *l) { toku_mutex_unlock(&l->lock); } diff --git a/storage/tokudb/PerconaFT/ft/logger/logcursor.cc b/storage/tokudb/PerconaFT/ft/logger/logcursor.cc index f13419ae..494d3b1d 100644 --- a/storage/tokudb/PerconaFT/ft/logger/logcursor.cc +++ b/storage/tokudb/PerconaFT/ft/logger/logcursor.cc @@ -85,10 +85,10 @@ static int lc_close_cur_logfile(TOKULOGCURSOR lc) { } static toku_off_t lc_file_len(const char *name) { - toku_struct_stat buf; - int r = toku_stat(name, &buf); - assert(r == 0); - return buf.st_size; + toku_struct_stat buf; + int r = toku_stat(name, &buf, *tokudb_file_data_key); + assert(r == 0); + return buf.st_size; } // Cat the file and throw away the contents. This brings the file into the file system cache diff --git a/storage/tokudb/PerconaFT/ft/logger/logger.cc b/storage/tokudb/PerconaFT/ft/logger/logger.cc index eacec9cb..3f13fe10 100644 --- a/storage/tokudb/PerconaFT/ft/logger/logger.cc +++ b/storage/tokudb/PerconaFT/ft/logger/logger.cc @@ -49,11 +49,17 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "util/status.h" -static const int log_format_version=TOKU_LOG_VERSION; +static const int log_format_version = TOKU_LOG_VERSION; -static int open_logfile (TOKULOGGER logger); -static void logger_write_buffer (TOKULOGGER logger, LSN *fsynced_lsn); -static void delete_logfile(TOKULOGGER logger, long long index, uint32_t version); +toku_instr_key *result_output_condition_lock_mutex_key; +toku_instr_key *result_output_condition_key; +toku_instr_key *tokudb_file_log_key; + +static int open_logfile(TOKULOGGER logger); +static void logger_write_buffer(TOKULOGGER logger, LSN *fsynced_lsn); +static void delete_logfile(TOKULOGGER logger, + long long index, + uint32_t version); static void grab_output(TOKULOGGER logger, LSN *fsynced_lsn); static void release_output(TOKULOGGER logger, LSN fsynced_lsn); @@ -131,10 +137,13 @@ int toku_logger_create (TOKULOGGER *resultp) { // n_in_file is uninitialized result->write_block_size = FT_DEFAULT_NODE_SIZE; // default logging size is the same as the default ft block size toku_logfilemgr_create(&result->logfilemgr); - *resultp=result; + *resultp = result; ml_init(&result->input_lock); - toku_mutex_init(&result->output_condition_lock, NULL); - toku_cond_init(&result->output_condition, NULL); + toku_mutex_init(*result_output_condition_lock_mutex_key, + &result->output_condition_lock, + nullptr); + toku_cond_init( + *result_output_condition_key, &result->output_condition, nullptr); result->rollback_cachefile = NULL; result->output_is_available = true; toku_txn_manager_init(&result->txn_manager); @@ -300,10 +309,10 @@ int toku_logger_close(TOKULOGGER *loggerp) { grab_output(logger, &fsynced_lsn); logger_write_buffer(logger, &fsynced_lsn); if (logger->fd!=-1) { - if ( logger->write_log_files ) { + if (logger->write_log_files) { toku_file_fsync_without_accounting(logger->fd); } - r = close(logger->fd); + r = toku_os_close(logger->fd); assert(r == 0); } r = close_logdir(logger); @@ -345,9 +354,13 @@ static int close_and_open_logfile (TOKULOGGER logger, LSN *fsynced_lsn) if (logger->write_log_files) { toku_file_fsync_without_accounting(logger->fd); *fsynced_lsn = logger->written_lsn; - toku_logfilemgr_update_last_lsn(logger->logfilemgr, logger->written_lsn); // fixes t:2294 + toku_logfilemgr_update_last_lsn(logger->logfilemgr, + logger->written_lsn); // fixes t:2294 } - r = close(logger->fd); if (r!=0) return get_error_errno(); + r = toku_os_close(logger->fd); + + if (r != 0) + return get_error_errno(); return open_logfile(logger); } @@ -677,18 +690,28 @@ static int open_logfile (TOKULOGGER logger) { int fnamelen = strlen(logger->directory)+50; char fname[fnamelen]; - snprintf(fname, fnamelen, "%s/log%012lld.tokulog%d", logger->directory, logger->next_log_file_number, TOKU_LOG_VERSION); + snprintf(fname, + fnamelen, + "%s/log%012lld.tokulog%d", + logger->directory, + logger->next_log_file_number, + TOKU_LOG_VERSION); long long index = logger->next_log_file_number; if (logger->write_log_files) { - logger->fd = open(fname, O_CREAT+O_WRONLY+O_TRUNC+O_EXCL+O_BINARY, S_IRUSR+S_IWUSR); - if (logger->fd==-1) { + logger->fd = + toku_os_open(fname, + O_CREAT + O_WRONLY + O_TRUNC + O_EXCL + O_BINARY, + S_IRUSR + S_IWUSR, + *tokudb_file_log_key); + if (logger->fd == -1) { return get_error_errno(); } fsync_logdir(logger); logger->next_log_file_number++; } else { - logger->fd = open(DEV_NULL_FILE, O_WRONLY+O_BINARY); - if (logger->fd==-1) { + logger->fd = toku_os_open( + DEV_NULL_FILE, O_WRONLY + O_BINARY, S_IWUSR, *tokudb_file_log_key); + if (logger->fd == -1) { return get_error_errno(); } } @@ -834,10 +857,11 @@ int toku_logger_restart(TOKULOGGER logger, LSN lastlsn) logger_write_buffer(logger, &fsynced_lsn); // close the log file - if ( logger->write_log_files) { // fsyncs don't work to /dev/null + if (logger->write_log_files) { // fsyncs don't work to /dev/null toku_file_fsync_without_accounting(logger->fd); } - r = close(logger->fd); assert(r == 0); + r = toku_os_close(logger->fd); + assert(r == 0); logger->fd = -1; // reset the LSN's to the lastlsn when the logger was opened @@ -1237,11 +1261,13 @@ void toku_txnid2txn(TOKULOGGER logger, TXNID_PAIR txnid, TOKUTXN *result) { } // Find the earliest LSN in a log. No locks are needed. -static int peek_at_log (TOKULOGGER logger, char* filename, LSN *first_lsn) { - int fd = open(filename, O_RDONLY+O_BINARY); - if (fd<0) { +static int peek_at_log(TOKULOGGER logger, char *filename, LSN *first_lsn) { + int fd = toku_os_open( + filename, O_RDONLY + O_BINARY, S_IRUSR, *tokudb_file_log_key); + if (fd < 0) { int er = get_error_errno(); - if (logger->write_log_files) printf("couldn't open: %s\n", strerror(er)); + if (logger->write_log_files) + printf("couldn't open: %s\n", strerror(er)); return er; } enum { SKIP = 12+1+4 }; // read the 12 byte header, the first message, and the first len @@ -1258,10 +1284,13 @@ static int peek_at_log (TOKULOGGER logger, char* filename, LSN *first_lsn) { lsn = rbuf_ulonglong(&rb); } - r=close(fd); - if (r!=0) { return 0; } + r = toku_os_close(fd); + + if (r != 0) { + return 0; + } - first_lsn->lsn=lsn; + first_lsn->lsn = lsn; return 0; } diff --git a/storage/tokudb/PerconaFT/ft/logger/recover.cc b/storage/tokudb/PerconaFT/ft/logger/recover.cc index 9eaa56bd..9a9a1214 100644 --- a/storage/tokudb/PerconaFT/ft/logger/recover.cc +++ b/storage/tokudb/PerconaFT/ft/logger/recover.cc @@ -954,14 +954,14 @@ static int toku_recover_frename(struct logtype_frename *l, RECOVER_ENV renv) { std::unique_ptr new_iname_full( toku_construct_full_name(2, data_dir, l->new_iname.data), &toku_free); - if (toku_stat(old_iname_full.get(), &stat) == -1) { + if (toku_stat(old_iname_full.get(), &stat, toku_uninstrumented) == -1) { if (ENOENT == errno) old_exist = false; else return 1; } - if (toku_stat(new_iname_full.get(), &stat) == -1) { + if (toku_stat(new_iname_full.get(), &stat, toku_uninstrumented) == -1) { if (ENOENT == errno) new_exist = false; else @@ -980,7 +980,7 @@ static int toku_recover_frename(struct logtype_frename *l, RECOVER_ENV renv) { // 'stalled cachefiles' container the new file is removed // and the old file is renamed. if (old_exist && new_exist && - (toku_os_unlink(new_iname_full.get()) == -1 || + (toku_os_delete(new_iname_full.get()) == -1 || toku_os_rename(old_iname_full.get(), new_iname_full.get()) == -1 || toku_fsync_directory(old_iname_full.get()) == -1 || toku_fsync_directory(new_iname_full.get()) == -1)) @@ -1473,9 +1473,13 @@ static int do_recovery(RECOVER_ENV renv, const char *env_dir, const char *log_di { toku_struct_stat buf; - if (toku_stat(env_dir, &buf)!=0) { + if (toku_stat(env_dir, &buf, toku_uninstrumented)) { rr = get_error_errno(); - fprintf(stderr, "%.24s PerconaFT recovery error: directory does not exist: %s\n", ctime(&tnow), env_dir); + fprintf(stderr, + "%.24s PerconaFT recovery error: directory does not exist: " + "%s\n", + ctime(&tnow), + env_dir); goto errorexit; } else if (!S_ISDIR(buf.st_mode)) { fprintf(stderr, "%.24s PerconaFT recovery error: this file is supposed to be a directory, but is not: %s\n", ctime(&tnow), env_dir); diff --git a/storage/tokudb/PerconaFT/ft/serialize/block_allocator.cc b/storage/tokudb/PerconaFT/ft/serialize/block_allocator.cc index 19811373..29f6daa2 100644 --- a/storage/tokudb/PerconaFT/ft/serialize/block_allocator.cc +++ b/storage/tokudb/PerconaFT/ft/serialize/block_allocator.cc @@ -40,6 +40,7 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include +#include "toku_portability.h" #include "portability/memory.h" #include "portability/toku_assert.h" #include "portability/toku_stdint.h" diff --git a/storage/tokudb/PerconaFT/ft/serialize/block_table.cc b/storage/tokudb/PerconaFT/ft/serialize/block_table.cc index d2532134..56d51f56 100644 --- a/storage/tokudb/PerconaFT/ft/serialize/block_table.cc +++ b/storage/tokudb/PerconaFT/ft/serialize/block_table.cc @@ -54,6 +54,11 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "util/nb_mutex.h" #include "util/scoped_malloc.h" + +toku_instr_key *block_table_mutex_key; +toku_instr_key *safe_file_size_lock_mutex_key; +toku_instr_key *safe_file_size_lock_rwlock_key; + // indicates the end of a freelist static const BLOCKNUM freelist_null = {-1}; @@ -99,8 +104,10 @@ void block_table::_create_internal() { memset(&_checkpointed, 0, sizeof(struct translation)); memset(&_mutex, 0, sizeof(_mutex)); _bt_block_allocator = new BlockAllocator(); - toku_mutex_init(&_mutex, nullptr); - nb_mutex_init(&_safe_file_size_lock); + toku_mutex_init(*block_table_mutex_key, &_mutex, nullptr); + nb_mutex_init(*safe_file_size_lock_mutex_key, + *safe_file_size_lock_rwlock_key, + &_safe_file_size_lock); } // Fill in the checkpointed translation from buffer, and copy checkpointed to @@ -128,7 +135,7 @@ int block_table::create_from_buffer( _copy_translation(&_current, &_checkpointed, TRANSLATION_CURRENT); // Determine the file size - int64_t file_size; + int64_t file_size = 0; r = toku_os_get_file_size(fd, &file_size); lazy_assert_zero(r); invariant(file_size >= 0); diff --git a/storage/tokudb/PerconaFT/ft/serialize/ft-serialize.cc b/storage/tokudb/PerconaFT/ft/serialize/ft-serialize.cc index fcab9fc6..b24d72a5 100644 --- a/storage/tokudb/PerconaFT/ft/serialize/ft-serialize.cc +++ b/storage/tokudb/PerconaFT/ft/serialize/ft-serialize.cc @@ -417,8 +417,10 @@ static size_t serialize_ft_min_size(uint32_t version) { switch (version) { case FT_LAYOUT_VERSION_29: size += sizeof(uint64_t); // logrows in ft + // fallthrough case FT_LAYOUT_VERSION_28: size += sizeof(uint32_t); // fanout in ft + // fallthrough case FT_LAYOUT_VERSION_27: case FT_LAYOUT_VERSION_26: case FT_LAYOUT_VERSION_25: @@ -427,10 +429,12 @@ static size_t serialize_ft_min_size(uint32_t version) { case FT_LAYOUT_VERSION_22: case FT_LAYOUT_VERSION_21: size += sizeof(MSN); // max_msn_in_ft + // fallthrough case FT_LAYOUT_VERSION_20: case FT_LAYOUT_VERSION_19: size += 1; // compression method size += sizeof(MSN); // highest_unused_msn_for_upgrade + // fallthrough case FT_LAYOUT_VERSION_18: size += sizeof(uint64_t); // time_of_last_optimize_begin size += sizeof(uint64_t); // time_of_last_optimize_end @@ -438,9 +442,11 @@ static size_t serialize_ft_min_size(uint32_t version) { size += sizeof(MSN); // msn_at_start_of_last_completed_optimize size -= 8; // removed num_blocks_to_upgrade_14 size -= 8; // removed num_blocks_to_upgrade_13 + // fallthrough case FT_LAYOUT_VERSION_17: size += 16; invariant(sizeof(STAT64INFO_S) == 16); + // fallthrough case FT_LAYOUT_VERSION_16: case FT_LAYOUT_VERSION_15: size += 4; // basement node size @@ -448,8 +454,10 @@ static size_t serialize_ft_min_size(uint32_t version) { // num_blocks_to_upgrade, now one int each for upgrade // from 13, 14 size += 8; // time of last verification + // fallthrough case FT_LAYOUT_VERSION_14: size += 8; // TXNID that created + // fallthrough case FT_LAYOUT_VERSION_13: size += (4 // build_id + @@ -459,7 +467,7 @@ static size_t serialize_ft_min_size(uint32_t version) { + 8 // time_of_last_modification ); - // fall through + // fallthrough case FT_LAYOUT_VERSION_12: size += (+8 // "tokudata" + diff --git a/storage/tokudb/PerconaFT/ft/serialize/sub_block.cc b/storage/tokudb/PerconaFT/ft/serialize/sub_block.cc index c967d4b4..6dc1f828 100644 --- a/storage/tokudb/PerconaFT/ft/serialize/sub_block.cc +++ b/storage/tokudb/PerconaFT/ft/serialize/sub_block.cc @@ -51,6 +51,9 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "util/threadpool.h" #include "util/x1764.h" +toku_instr_key *workset_lock_mutex_key; +toku_instr_key *ws_worker_wait_key; + SUB_BLOCK sub_block_creat(void) { SUB_BLOCK XMALLOC(sb); sub_block_init(sb); diff --git a/storage/tokudb/PerconaFT/ft/serialize/workset.h b/storage/tokudb/PerconaFT/ft/serialize/workset.h index 073741fc..295eb73c 100644 --- a/storage/tokudb/PerconaFT/ft/serialize/workset.h +++ b/storage/tokudb/PerconaFT/ft/serialize/workset.h @@ -41,6 +41,8 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include #include +extern toku_instr_key *ws_worker_wait_key; + // The work struct is the base class for work to be done by some threads struct work { struct toku_list next; @@ -54,16 +56,14 @@ struct workset { toku_cond_t worker_wait; // a condition variable used to wait for all of the worker to release their reference on the workset }; -static inline void -workset_init(struct workset *ws) { - toku_mutex_init(&ws->lock, NULL); +static inline void workset_init(struct workset *ws) { + toku_mutex_init(*workset_lock_mutex_key, &ws->lock, nullptr); toku_list_init(&ws->worklist); - ws->refs = 1; // the calling thread gets a reference - toku_cond_init(&ws->worker_wait, NULL); + ws->refs = 1; // the calling thread gets a reference + toku_cond_init(*ws_worker_wait_key, &ws->worker_wait, nullptr); } -static inline void -workset_destroy(struct workset *ws) { +static inline void workset_destroy(struct workset *ws) { invariant(toku_list_empty(&ws->worklist)); toku_cond_destroy(&ws->worker_wait); toku_mutex_destroy(&ws->lock); diff --git a/storage/tokudb/PerconaFT/ft/tests/cachetable-4357.cc b/storage/tokudb/PerconaFT/ft/tests/cachetable-4357.cc index 8bbda295..0af5c818 100644 --- a/storage/tokudb/PerconaFT/ft/tests/cachetable-4357.cc +++ b/storage/tokudb/PerconaFT/ft/tests/cachetable-4357.cc @@ -71,21 +71,26 @@ cachetable_test (void) { void* v1; long s1; - r = toku_cachetable_get_and_pin( - f1, - make_blocknum(1), - toku_cachetable_hash(f1, make_blocknum(1)), - &v1, - &s1, - def_write_callback(NULL), def_fetch, def_pf_req_callback, def_pf_callback, - true, - NULL - ); + r = toku_cachetable_get_and_pin(f1, + make_blocknum(1), + toku_cachetable_hash(f1, make_blocknum(1)), + &v1, + &s1, + def_write_callback(NULL), + def_fetch, + def_pf_req_callback, + def_pf_callback, + true, + NULL); toku_pthread_t pin_nonblocking_tid; - r = toku_pthread_create(&pin_nonblocking_tid, NULL, pin_nonblocking, NULL); - assert_zero(r); + r = toku_pthread_create(toku_uninstrumented, + &pin_nonblocking_tid, + nullptr, + pin_nonblocking, + nullptr); + assert_zero(r); // sleep 3 seconds - usleep(3*1024*1024); + usleep(3 * 1024 * 1024); r = toku_test_cachetable_unpin_and_remove(f1, make_blocknum(1), NULL, NULL); assert_zero(r); diff --git a/storage/tokudb/PerconaFT/ft/tests/cachetable-4365.cc b/storage/tokudb/PerconaFT/ft/tests/cachetable-4365.cc index 9c54c086..7bee0b80 100644 --- a/storage/tokudb/PerconaFT/ft/tests/cachetable-4365.cc +++ b/storage/tokudb/PerconaFT/ft/tests/cachetable-4365.cc @@ -71,15 +71,16 @@ static void *put_same_key(void *arg) { return arg; } - toku_pthread_t put_tid; -static void test_remove_key(CACHEKEY* UU(cachekey), bool UU(for_checkpoint), void* UU(extra)) { - int r = toku_pthread_create(&put_tid, NULL, put_same_key, NULL); - assert_zero(r); +static void test_remove_key(CACHEKEY *UU(cachekey), + bool UU(for_checkpoint), + void *UU(extra)) { + int r = toku_pthread_create( + toku_uninstrumented, &put_tid, nullptr, put_same_key, nullptr); + assert_zero(r); } - static void cachetable_test (void) { const int test_limit = 12; @@ -92,21 +93,26 @@ cachetable_test (void) { void* v1; long s1; - r = toku_cachetable_get_and_pin( - f1, - make_blocknum(1), - toku_cachetable_hash(f1, make_blocknum(1)), - &v1, - &s1, - def_write_callback(NULL), def_fetch, def_pf_req_callback, def_pf_callback, - true, - NULL - ); + r = toku_cachetable_get_and_pin(f1, + make_blocknum(1), + toku_cachetable_hash(f1, make_blocknum(1)), + &v1, + &s1, + def_write_callback(nullptr), + def_fetch, + def_pf_req_callback, + def_pf_callback, + true, + nullptr); toku_pthread_t pin_nonblocking_tid; - r = toku_pthread_create(&pin_nonblocking_tid, NULL, pin_nonblocking, NULL); - assert_zero(r); + r = toku_pthread_create(toku_uninstrumented, + &pin_nonblocking_tid, + nullptr, + pin_nonblocking, + nullptr); + assert_zero(r); // sleep 3 seconds - usleep(3*1024*1024); + usleep(3 * 1024 * 1024); r = toku_test_cachetable_unpin_and_remove(f1, make_blocknum(1), test_remove_key, NULL); assert_zero(r); diff --git a/storage/tokudb/PerconaFT/ft/tests/cachetable-5097.cc b/storage/tokudb/PerconaFT/ft/tests/cachetable-5097.cc index c1b6e0a9..5ab0df88 100644 --- a/storage/tokudb/PerconaFT/ft/tests/cachetable-5097.cc +++ b/storage/tokudb/PerconaFT/ft/tests/cachetable-5097.cc @@ -153,13 +153,16 @@ cachetable_test (void) { assert(r == 0); } - // at this point, we have a dirty PAIR in the cachetable associated with cachefile f1 - // launch a thread that will put another PAIR in the cachetable, and get partial eviction started + // at this point, we have a dirty PAIR in the cachetable associated with + // cachefile f1 + // launch a thread that will put another PAIR in the cachetable, and get + // partial eviction started toku_pthread_t tid; - r = toku_pthread_create(&tid, NULL, f2_pin, NULL); + r = toku_pthread_create( + toku_uninstrumented, &tid, nullptr, f2_pin, nullptr); assert_zero(r); - usleep(2*1024*1024); + usleep(2 * 1024 * 1024); check_flush = true; toku_cachefile_close(&f1, false, ZERO_LSN); if (enable_partial_eviction) diff --git a/storage/tokudb/PerconaFT/ft/tests/cachetable-5978-2.cc b/storage/tokudb/PerconaFT/ft/tests/cachetable-5978-2.cc index b462d76e..0b5110dd 100644 --- a/storage/tokudb/PerconaFT/ft/tests/cachetable-5978-2.cc +++ b/storage/tokudb/PerconaFT/ft/tests/cachetable-5978-2.cc @@ -114,14 +114,14 @@ unpin_two (void* UU(v)) { ); assert_zero(r); - // at this point, we have p1 pinned, want to start a thread to do an unpin_and_remove - // on p1 - r = toku_pthread_create( - &unpin_and_remove_tid, - NULL, - unpin_and_remove_one, - NULL - ); + // at this point, we have p1 pinned, want to start a thread to do an + // unpin_and_remove + // on p1 + r = toku_pthread_create(toku_uninstrumented, + &unpin_and_remove_tid, + nullptr, + unpin_and_remove_one, + nullptr); assert_zero(r); // sleep to give a chance for the unpin_and_remove to get going usleep(512*1024); @@ -173,9 +173,9 @@ cachetable_test (void) { r = toku_cachetable_get_and_pin(f1, make_blocknum(2), 2, &v1, &s1, wc, fetch_two, def_pf_req_callback, def_pf_callback, true, NULL); assert_zero(r); - toku_pthread_t tid1; - r = toku_pthread_create(&tid1, NULL, repin_one, NULL); + r = toku_pthread_create( + toku_uninstrumented, &tid1, nullptr, repin_one, nullptr); assert_zero(r); void *ret; diff --git a/storage/tokudb/PerconaFT/ft/tests/cachetable-5978.cc b/storage/tokudb/PerconaFT/ft/tests/cachetable-5978.cc index ee68ab3e..a4ff6c33 100644 --- a/storage/tokudb/PerconaFT/ft/tests/cachetable-5978.cc +++ b/storage/tokudb/PerconaFT/ft/tests/cachetable-5978.cc @@ -199,9 +199,11 @@ cachetable_test (void) { toku_pthread_t tid1; toku_pthread_t tid2; - r = toku_pthread_create(&tid1, NULL, repin_one, NULL); + r = toku_pthread_create( + toku_uninstrumented, &tid1, nullptr, repin_one, nullptr); assert_zero(r); - r = toku_pthread_create(&tid2, NULL, repin_two, NULL); + r = toku_pthread_create( + toku_uninstrumented, &tid2, nullptr, repin_two, nullptr); assert_zero(r); // unpin 1 and 2 so tid1 and tid2 can make progress diff --git a/storage/tokudb/PerconaFT/ft/tests/cachetable-checkpoint-pending.cc b/storage/tokudb/PerconaFT/ft/tests/cachetable-checkpoint-pending.cc index 3dd3a15e..5e87fed7 100644 --- a/storage/tokudb/PerconaFT/ft/tests/cachetable-checkpoint-pending.cc +++ b/storage/tokudb/PerconaFT/ft/tests/cachetable-checkpoint-pending.cc @@ -158,14 +158,24 @@ static void checkpoint_pending(void) { // the checkpoint should cause n writes, but since n <= the cachetable size, // all items should be kept in the cachetable - n_flush = n_write_me = n_keep_me = n_fetch = 0; expect_value = 42; - //printf("E42\n"); + n_flush = n_write_me = n_keep_me = n_fetch = 0; + expect_value = 42; + // printf("E42\n"); toku_pthread_t checkpoint_thread, update_thread; - r = toku_pthread_create(&checkpoint_thread, NULL, do_checkpoint, NULL); assert(r==0); - r = toku_pthread_create(&update_thread, NULL, do_update, NULL); assert(r==0); - r = toku_pthread_join(checkpoint_thread, 0); assert(r==0); - r = toku_pthread_join(update_thread, 0); assert(r==0); - + r = toku_pthread_create(toku_uninstrumented, + &checkpoint_thread, + nullptr, + do_checkpoint, + nullptr); + assert(r == 0); + r = toku_pthread_create( + toku_uninstrumented, &update_thread, nullptr, do_update, nullptr); + assert(r == 0); + r = toku_pthread_join(checkpoint_thread, 0); + assert(r == 0); + r = toku_pthread_join(update_thread, 0); + assert(r == 0); + assert(n_flush == N && n_write_me == N && n_keep_me == N); // after the checkpoint, all of the items should be 43 diff --git a/storage/tokudb/PerconaFT/ft/tests/cachetable-cleaner-thread-attrs-accumulate.cc b/storage/tokudb/PerconaFT/ft/tests/cachetable-cleaner-thread-attrs-accumulate.cc index c1e7b373..dd6c674a 100644 --- a/storage/tokudb/PerconaFT/ft/tests/cachetable-cleaner-thread-attrs-accumulate.cc +++ b/storage/tokudb/PerconaFT/ft/tests/cachetable-cleaner-thread-attrs-accumulate.cc @@ -91,7 +91,7 @@ run_test (void) { const int test_limit = 1000; int r; CACHETABLE ct; - toku_mutex_init(&attr_mutex, NULL); + toku_mutex_init(toku_uninstrumented, &attr_mutex, nullptr); toku_cachetable_create(&ct, test_limit, ZERO_LSN, nullptr); const char *fname1 = TOKU_TEST_FILENAME; diff --git a/storage/tokudb/PerconaFT/ft/tests/cachetable-clone-checkpoint.cc b/storage/tokudb/PerconaFT/ft/tests/cachetable-clone-checkpoint.cc index 50bd20f4..99d595b1 100644 --- a/storage/tokudb/PerconaFT/ft/tests/cachetable-clone-checkpoint.cc +++ b/storage/tokudb/PerconaFT/ft/tests/cachetable-clone-checkpoint.cc @@ -112,14 +112,17 @@ cachetable_test (void) { CHECKPOINTER cp = toku_cachetable_get_checkpointer(ct); toku_cachetable_begin_checkpoint(cp, NULL); - clone_flush_started = false; clone_flush_completed = false; toku_pthread_t checkpoint_tid; - r = toku_pthread_create(&checkpoint_tid, NULL, run_end_checkpoint, NULL); - assert_zero(r); + r = toku_pthread_create(toku_uninstrumented, + &checkpoint_tid, + nullptr, + run_end_checkpoint, + nullptr); + assert_zero(r); - usleep(1*1024*1024); + usleep(1 * 1024 * 1024); r = toku_cachetable_get_and_pin(f1, make_blocknum(1), 1, &v1, &s1, wc, def_fetch, def_pf_req_callback, def_pf_callback, true, NULL); assert_zero(r); diff --git a/storage/tokudb/PerconaFT/ft/tests/cachetable-pin-checkpoint.cc b/storage/tokudb/PerconaFT/ft/tests/cachetable-pin-checkpoint.cc index 8a270af0..65b02aeb 100644 --- a/storage/tokudb/PerconaFT/ft/tests/cachetable-pin-checkpoint.cc +++ b/storage/tokudb/PerconaFT/ft/tests/cachetable-pin-checkpoint.cc @@ -386,19 +386,28 @@ cachetable_test (void) { run_test = true; for (int i = 0; i < NUM_MOVER_THREADS; i++) { - r = toku_pthread_create(&read_random_tid[i], NULL, read_random_numbers, NULL); + r = toku_pthread_create(toku_uninstrumented, + &read_random_tid[i], + nullptr, + read_random_numbers, + nullptr); assert_zero(r); } for (int i = 0; i < NUM_MOVER_THREADS; i++) { - r = toku_pthread_create(&move_tid[i], NULL, move_numbers, NULL); + r = toku_pthread_create(toku_uninstrumented, + &move_tid[i], + nullptr, + move_numbers, + nullptr); assert_zero(r); } - r = toku_pthread_create(&checkpoint_tid, NULL, checkpoints, NULL); - assert_zero(r); - r = toku_pthread_create(&time_tid, NULL, test_time, NULL); + r = toku_pthread_create( + toku_uninstrumented, &checkpoint_tid, nullptr, checkpoints, nullptr); + assert_zero(r); + r = toku_pthread_create( + toku_uninstrumented, &time_tid, nullptr, test_time, nullptr); assert_zero(r); - void *ret; r = toku_pthread_join(time_tid, &ret); assert_zero(r); diff --git a/storage/tokudb/PerconaFT/ft/tests/cachetable-put-checkpoint.cc b/storage/tokudb/PerconaFT/ft/tests/cachetable-put-checkpoint.cc index afc95471..4cf16784 100644 --- a/storage/tokudb/PerconaFT/ft/tests/cachetable-put-checkpoint.cc +++ b/storage/tokudb/PerconaFT/ft/tests/cachetable-put-checkpoint.cc @@ -518,19 +518,28 @@ cachetable_test (void) { run_test = true; for (int i = 0; i < NUM_MOVER_THREADS; i++) { - r = toku_pthread_create(&move_tid[i], NULL, move_numbers, NULL); + r = toku_pthread_create(toku_uninstrumented, + &move_tid[i], + nullptr, + move_numbers, + nullptr); assert_zero(r); } for (int i = 0; i < NUM_MOVER_THREADS; i++) { - r = toku_pthread_create(&merge_and_split_tid[i], NULL, merge_and_split, NULL); + r = toku_pthread_create(toku_uninstrumented, + &merge_and_split_tid[i], + nullptr, + merge_and_split, + nullptr); assert_zero(r); } - r = toku_pthread_create(&checkpoint_tid, NULL, checkpoints, NULL); - assert_zero(r); - r = toku_pthread_create(&time_tid, NULL, test_time, NULL); + r = toku_pthread_create( + toku_uninstrumented, &checkpoint_tid, nullptr, checkpoints, nullptr); + assert_zero(r); + r = toku_pthread_create( + toku_uninstrumented, &time_tid, nullptr, test_time, nullptr); assert_zero(r); - void *ret; r = toku_pthread_join(time_tid, &ret); assert_zero(r); diff --git a/storage/tokudb/PerconaFT/ft/tests/cachetable-rwlock-test.cc b/storage/tokudb/PerconaFT/ft/tests/cachetable-rwlock-test.cc index 9a62f99e..6d8bc280 100644 --- a/storage/tokudb/PerconaFT/ft/tests/cachetable-rwlock-test.cc +++ b/storage/tokudb/PerconaFT/ft/tests/cachetable-rwlock-test.cc @@ -40,24 +40,22 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. // test create and destroy -static void -test_create_destroy (void) { - struct rwlock the_rwlock, *rwlock = &the_rwlock; +static void test_create_destroy(void) { + struct st_rwlock the_rwlock, *rwlock = &the_rwlock; - rwlock_init(rwlock); + rwlock_init(toku_uninstrumented, rwlock); rwlock_destroy(rwlock); } // test read lock and unlock with no writers -static void -test_simple_read_lock (int n) { - struct rwlock the_rwlock, *rwlock = &the_rwlock; +static void test_simple_read_lock(int n) { + struct st_rwlock the_rwlock, *rwlock = &the_rwlock; - rwlock_init(rwlock); + rwlock_init(toku_uninstrumented, rwlock); assert(rwlock_readers(rwlock) == 0); int i; - for (i=1; i<=n; i++) { + for (i = 1; i <= n; i++) { rwlock_read_lock(rwlock, 0); assert(rwlock_readers(rwlock) == i); assert(rwlock_users(rwlock) == i); @@ -72,11 +70,10 @@ test_simple_read_lock (int n) { // test write lock and unlock with no readers -static void -test_simple_write_lock (void) { - struct rwlock the_rwlock, *rwlock = &the_rwlock; +static void test_simple_write_lock(void) { + struct st_rwlock the_rwlock, *rwlock = &the_rwlock; - rwlock_init(rwlock); + rwlock_init(toku_uninstrumented, rwlock); assert(rwlock_users(rwlock) == 0); rwlock_write_lock(rwlock, 0); assert(rwlock_writers(rwlock) == 1); @@ -88,19 +85,17 @@ test_simple_write_lock (void) { struct rw_event { int e; - struct rwlock the_rwlock; + struct st_rwlock the_rwlock; toku_mutex_t mutex; }; -static void -rw_event_init (struct rw_event *rwe) { +static void rw_event_init(struct rw_event *rwe) { rwe->e = 0; - rwlock_init(&rwe->the_rwlock); - toku_mutex_init(&rwe->mutex, 0); + rwlock_init(toku_uninstrumented, &rwe->the_rwlock); + toku_mutex_init(toku_uninstrumented, &rwe->mutex, nullptr); } -static void -rw_event_destroy (struct rw_event *rwe) { +static void rw_event_destroy(struct rw_event *rwe) { rwlock_destroy(&rwe->the_rwlock); toku_mutex_destroy(&rwe->mutex); } @@ -138,10 +133,12 @@ test_writer_priority (void) { toku_mutex_unlock(&rwe->mutex); toku_pthread_t tid; - r = toku_pthread_create(&tid, 0, test_writer_priority_thread, rwe); + r = toku_pthread_create( + toku_uninstrumented, &tid, 0, test_writer_priority_thread, rwe); sleep(1); toku_mutex_lock(&rwe->mutex); - rwe->e++; assert(rwe->e == 2); + rwe->e++; + assert(rwe->e == 2); toku_mutex_unlock(&rwe->mutex); sleep(1); @@ -196,10 +193,12 @@ test_single_writer (void) { toku_mutex_unlock(&rwe->mutex); toku_pthread_t tid; - r = toku_pthread_create(&tid, 0, test_single_writer_thread, rwe); + r = toku_pthread_create( + toku_uninstrumented, &tid, 0, test_single_writer_thread, rwe); sleep(1); toku_mutex_lock(&rwe->mutex); - rwe->e++; assert(rwe->e == 2); + rwe->e++; + assert(rwe->e == 2); assert(rwlock_writers(&rwe->the_rwlock) == 1); assert(rwlock_users(&rwe->the_rwlock) == 2); rwlock_write_unlock(&rwe->the_rwlock); diff --git a/storage/tokudb/PerconaFT/ft/tests/cachetable-simple-read-pin-nonblocking.cc b/storage/tokudb/PerconaFT/ft/tests/cachetable-simple-read-pin-nonblocking.cc index 8fd88287..ebe05e50 100644 --- a/storage/tokudb/PerconaFT/ft/tests/cachetable-simple-read-pin-nonblocking.cc +++ b/storage/tokudb/PerconaFT/ft/tests/cachetable-simple-read-pin-nonblocking.cc @@ -111,9 +111,20 @@ run_test (void) { toku_pthread_t fetch_tid; fetch_called = false; - r = toku_pthread_create(&fetch_tid, NULL, run_expensive_fetch, NULL); + r = toku_pthread_create( + toku_uninstrumented, &fetch_tid, nullptr, run_expensive_fetch, nullptr); sleep(1); - r = toku_cachetable_get_and_pin(f1, make_blocknum(1), 1, &v1, &s1, wc, sleep_fetch, def_pf_req_callback, def_pf_callback, false, NULL); + r = toku_cachetable_get_and_pin(f1, + make_blocknum(1), + 1, + &v1, + &s1, + wc, + sleep_fetch, + def_pf_req_callback, + def_pf_callback, + false, + NULL); assert_zero(r); assert(fetch_called); r = toku_test_cachetable_unpin(f1, make_blocknum(1), 1, CACHETABLE_CLEAN, make_pair_attr(8)); @@ -133,9 +144,20 @@ run_test (void) { toku_pthread_t pf_tid; pf_called = false; - r = toku_pthread_create(&pf_tid, NULL, run_expensive_pf, NULL); + r = toku_pthread_create( + toku_uninstrumented, &pf_tid, nullptr, run_expensive_pf, nullptr); sleep(1); - r = toku_cachetable_get_and_pin(f1, make_blocknum(1), 1, &v1, &s1, wc, sleep_fetch, def_pf_req_callback, def_pf_callback, false, NULL); + r = toku_cachetable_get_and_pin(f1, + make_blocknum(1), + 1, + &v1, + &s1, + wc, + sleep_fetch, + def_pf_req_callback, + def_pf_callback, + false, + NULL); assert_zero(r); assert(pf_called); r = toku_test_cachetable_unpin(f1, make_blocknum(1), 1, CACHETABLE_CLEAN, make_pair_attr(8)); diff --git a/storage/tokudb/PerconaFT/ft/tests/cachetable-simple-read-pin.cc b/storage/tokudb/PerconaFT/ft/tests/cachetable-simple-read-pin.cc index 63ca871a..dd5d59df 100644 --- a/storage/tokudb/PerconaFT/ft/tests/cachetable-simple-read-pin.cc +++ b/storage/tokudb/PerconaFT/ft/tests/cachetable-simple-read-pin.cc @@ -117,9 +117,20 @@ run_test (void) { toku_pthread_t fetch_tid; fetch_called = false; - r = toku_pthread_create(&fetch_tid, NULL, run_expensive_fetch, NULL); + r = toku_pthread_create( + toku_uninstrumented, &fetch_tid, nullptr, run_expensive_fetch, nullptr); sleep(1); - r = toku_cachetable_get_and_pin(f1, make_blocknum(1), 1, &v1, &s1, wc, sleep_fetch, def_pf_req_callback, def_pf_callback, false, NULL); + r = toku_cachetable_get_and_pin(f1, + make_blocknum(1), + 1, + &v1, + &s1, + wc, + sleep_fetch, + def_pf_req_callback, + def_pf_callback, + false, + NULL); assert_zero(r); assert(fetch_called); r = toku_test_cachetable_unpin(f1, make_blocknum(1), 1, CACHETABLE_CLEAN, make_pair_attr(8)); @@ -141,9 +152,20 @@ run_test (void) { toku_pthread_t pf_tid; pf_called = false; - r = toku_pthread_create(&pf_tid, NULL, run_expensive_pf, NULL); + r = toku_pthread_create( + toku_uninstrumented, &pf_tid, nullptr, run_expensive_pf, nullptr); sleep(1); - r = toku_cachetable_get_and_pin(f1, make_blocknum(1), 1, &v1, &s1, wc, sleep_fetch, def_pf_req_callback, def_pf_callback, false, NULL); + r = toku_cachetable_get_and_pin(f1, + make_blocknum(1), + 1, + &v1, + &s1, + wc, + sleep_fetch, + def_pf_req_callback, + def_pf_callback, + false, + NULL); assert_zero(r); assert(pf_called); r = toku_test_cachetable_unpin(f1, make_blocknum(1), 1, CACHETABLE_CLEAN, make_pair_attr(8)); diff --git a/storage/tokudb/PerconaFT/ft/tests/cachetable-test.cc b/storage/tokudb/PerconaFT/ft/tests/cachetable-test.cc index e4bb5fb0..64f688c4 100644 --- a/storage/tokudb/PerconaFT/ft/tests/cachetable-test.cc +++ b/storage/tokudb/PerconaFT/ft/tests/cachetable-test.cc @@ -42,15 +42,13 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. // global data, especially between the test thread and the cachetable // writeback threads -toku_mutex_t test_mutex; +toku_mutex_t test_mutex; static inline void test_mutex_init(void) { - toku_mutex_init(&test_mutex, 0); + toku_mutex_init(toku_uninstrumented, &test_mutex, nullptr); } -static inline void test_mutex_destroy(void) { - toku_mutex_destroy(&test_mutex); -} +static inline void test_mutex_destroy(void) { toku_mutex_destroy(&test_mutex); } static inline void test_mutex_lock(void) { toku_mutex_lock(&test_mutex); diff --git a/storage/tokudb/PerconaFT/ft/tests/cachetable-unpin-remove-and-checkpoint.cc b/storage/tokudb/PerconaFT/ft/tests/cachetable-unpin-remove-and-checkpoint.cc index 11baa36e..0e44bf10 100644 --- a/storage/tokudb/PerconaFT/ft/tests/cachetable-unpin-remove-and-checkpoint.cc +++ b/storage/tokudb/PerconaFT/ft/tests/cachetable-unpin-remove-and-checkpoint.cc @@ -86,11 +86,22 @@ run_test (void) { // now this should mark the pair for checkpoint CHECKPOINTER cp = toku_cachetable_get_checkpointer(ct); toku_cachetable_begin_checkpoint(cp, NULL); - r = toku_cachetable_get_and_pin(f1, make_blocknum(1), toku_cachetable_hash(f1, make_blocknum(1)), &v1, &s1, wc, def_fetch, def_pf_req_callback, def_pf_callback, true, NULL); + r = toku_cachetable_get_and_pin(f1, + make_blocknum(1), + toku_cachetable_hash(f1, make_blocknum(1)), + &v1, + &s1, + wc, + def_fetch, + def_pf_req_callback, + def_pf_callback, + true, + NULL); toku_pthread_t mytid; - r = toku_pthread_create(&mytid, NULL, run_end_chkpt, NULL); - assert(r==0); + r = toku_pthread_create( + toku_uninstrumented, &mytid, nullptr, run_end_chkpt, nullptr); + assert(r == 0); // give checkpoint thread a chance to start waiting on lock sleep(1); diff --git a/storage/tokudb/PerconaFT/ft/tests/ftloader-test-extractor-errors.cc b/storage/tokudb/PerconaFT/ft/tests/ftloader-test-extractor-errors.cc index 872b674c..4bff52ce 100644 --- a/storage/tokudb/PerconaFT/ft/tests/ftloader-test-extractor-errors.cc +++ b/storage/tokudb/PerconaFT/ft/tests/ftloader-test-extractor-errors.cc @@ -141,7 +141,7 @@ static void test_extractor(int nrows, int nrowsets, bool expect_fail, const char // setup error injection toku_set_func_malloc(my_malloc); toku_set_func_realloc(my_realloc); - ft_loader_set_os_fwrite(bad_fwrite); + toku_set_func_fwrite(bad_fwrite); toku_set_func_write(bad_write); toku_set_func_pwrite(bad_pwrite); ft_loader_set_poll_function(&loader->poll_callback, loader_poll_callback, NULL); @@ -157,7 +157,7 @@ static void test_extractor(int nrows, int nrowsets, bool expect_fail, const char toku_set_func_malloc(NULL); toku_set_func_realloc(NULL); - ft_loader_set_os_fwrite(NULL); + toku_set_func_fwrite(nullptr); toku_set_func_write(NULL); toku_set_func_pwrite(NULL); diff --git a/storage/tokudb/PerconaFT/ft/tests/ftloader-test-merge-files-dbufio.cc b/storage/tokudb/PerconaFT/ft/tests/ftloader-test-merge-files-dbufio.cc index d1aeff19..0b121316 100644 --- a/storage/tokudb/PerconaFT/ft/tests/ftloader-test-merge-files-dbufio.cc +++ b/storage/tokudb/PerconaFT/ft/tests/ftloader-test-merge-files-dbufio.cc @@ -393,13 +393,17 @@ static void test (const char *directory, bool is_error) { toku_pthread_t consumer; struct consumer_thunk cthunk = {q, 0}; { - int r = toku_pthread_create(&consumer, NULL, consumer_thread, (void*)&cthunk); - assert(r==0); + int r = toku_pthread_create(toku_uninstrumented, + &consumer, + nullptr, + consumer_thread, + static_cast(&cthunk)); + assert(r == 0); } toku_set_func_malloc_only(my_malloc); toku_set_func_realloc_only(my_realloc); - ft_loader_set_os_fwrite(bad_fwrite); + toku_set_func_fwrite(bad_fwrite); toku_set_func_write(bad_write); toku_set_func_pwrite(bad_pwrite); toku_set_func_fdopen(bad_fdopen); @@ -427,7 +431,7 @@ static void test (const char *directory, bool is_error) { toku_set_func_malloc(NULL); toku_set_func_realloc(NULL); - ft_loader_set_os_fwrite(NULL); + toku_set_func_fwrite(nullptr); toku_set_func_write(NULL); toku_set_func_pwrite(NULL); toku_set_func_fdopen(NULL); diff --git a/storage/tokudb/PerconaFT/ft/tests/ftloader-test-writer-errors.cc b/storage/tokudb/PerconaFT/ft/tests/ftloader-test-writer-errors.cc index 0784ca87..e4423319 100644 --- a/storage/tokudb/PerconaFT/ft/tests/ftloader-test-writer-errors.cc +++ b/storage/tokudb/PerconaFT/ft/tests/ftloader-test-writer-errors.cc @@ -154,7 +154,7 @@ static int write_dbfile (char *tf_template, int n, char *output_name, bool expec toku_set_func_malloc_only(my_malloc); toku_set_func_realloc_only(my_realloc); - ft_loader_set_os_fwrite(bad_fwrite); + toku_set_func_fwrite(bad_fwrite); toku_set_func_write(bad_write); toku_set_func_pwrite(bad_pwrite); ft_loader_set_error_function(&bl.error_callback, NULL, NULL); @@ -164,7 +164,7 @@ static int write_dbfile (char *tf_template, int n, char *output_name, bool expec toku_set_func_malloc_only(NULL); toku_set_func_realloc_only(NULL); - ft_loader_set_os_fwrite(NULL); + toku_set_func_fwrite(nullptr); toku_set_func_write(NULL); toku_set_func_pwrite(NULL); diff --git a/storage/tokudb/PerconaFT/ft/tests/log-test4.cc b/storage/tokudb/PerconaFT/ft/tests/log-test4.cc index a31181de..e0bbedb9 100644 --- a/storage/tokudb/PerconaFT/ft/tests/log-test4.cc +++ b/storage/tokudb/PerconaFT/ft/tests/log-test4.cc @@ -63,11 +63,14 @@ test_main (int argc __attribute__((__unused__)), r = toku_logger_close(&logger); assert(r == 0); { - toku_struct_stat statbuf; - sprintf(logname, "%s/log000000000000.tokulog%d", TOKU_TEST_FILENAME, TOKU_LOG_VERSION); - r = toku_stat(logname, &statbuf); - assert(r==0); - assert(statbuf.st_size==12+5); + toku_struct_stat statbuf; + sprintf(logname, + "%s/log000000000000.tokulog%d", + TOKU_TEST_FILENAME, + TOKU_LOG_VERSION); + r = toku_stat(logname, &statbuf, toku_uninstrumented); + assert(r == 0); + assert(statbuf.st_size == 12 + 5); } toku_os_recursive_delete(TOKU_TEST_FILENAME); return 0; diff --git a/storage/tokudb/PerconaFT/ft/tests/log-test5.cc b/storage/tokudb/PerconaFT/ft/tests/log-test5.cc index d4e31af2..fed9467a 100644 --- a/storage/tokudb/PerconaFT/ft/tests/log-test5.cc +++ b/storage/tokudb/PerconaFT/ft/tests/log-test5.cc @@ -81,14 +81,14 @@ test_main (int argc __attribute__((__unused__)), struct dirent *dirent; while ((dirent=readdir(dir))) { if (strncmp(dirent->d_name, "log", 3)!=0) continue; - char fname[TOKU_PATH_MAX+1]; - toku_path_join(fname, 2, TOKU_TEST_FILENAME, dirent->d_name); - toku_struct_stat statbuf; - r = toku_stat(fname, &statbuf); - assert(r==0); - assert(statbuf.st_size<=LSIZE+10); - } - r = closedir(dir); + char fname[TOKU_PATH_MAX + 1]; + toku_path_join(fname, 2, TOKU_TEST_FILENAME, dirent->d_name); + toku_struct_stat statbuf; + r = toku_stat(fname, &statbuf, toku_uninstrumented); + assert(r == 0); + assert(statbuf.st_size <= LSIZE + 10); + } + r = closedir(dir); assert(r==0); } toku_os_recursive_delete(TOKU_TEST_FILENAME); diff --git a/storage/tokudb/PerconaFT/ft/tests/log-test6.cc b/storage/tokudb/PerconaFT/ft/tests/log-test6.cc index 4d17488c..0e8b9456 100644 --- a/storage/tokudb/PerconaFT/ft/tests/log-test6.cc +++ b/storage/tokudb/PerconaFT/ft/tests/log-test6.cc @@ -86,11 +86,14 @@ test_main (int argc __attribute__((__unused__)), { char logname[PATH_MAX]; - toku_struct_stat statbuf; - sprintf(logname, "%s/log000000000000.tokulog%d", TOKU_TEST_FILENAME, TOKU_LOG_VERSION); - r = toku_stat(logname, &statbuf); - assert(r==0); - assert(statbuf.st_size<=LSIZE); + toku_struct_stat statbuf; + sprintf(logname, + "%s/log000000000000.tokulog%d", + TOKU_TEST_FILENAME, + TOKU_LOG_VERSION); + r = toku_stat(logname, &statbuf, toku_uninstrumented); + assert(r == 0); + assert(statbuf.st_size <= LSIZE); } toku_os_recursive_delete(TOKU_TEST_FILENAME); return 0; diff --git a/storage/tokudb/PerconaFT/ft/tests/recovery-bad-last-entry.cc b/storage/tokudb/PerconaFT/ft/tests/recovery-bad-last-entry.cc index 431ee4b5..a3c934d1 100644 --- a/storage/tokudb/PerconaFT/ft/tests/recovery-bad-last-entry.cc +++ b/storage/tokudb/PerconaFT/ft/tests/recovery-bad-last-entry.cc @@ -83,11 +83,16 @@ run_test(void) { r = toku_dup2(devnul, fileno(stderr)); assert(r==fileno(stderr)); r = close(devnul); assert(r==0); - char fname[TOKU_PATH_MAX+1]; - sprintf(fname, "%s/%s%d", TOKU_TEST_FILENAME, "log000000000000.tokulog", TOKU_LOG_VERSION); - - r = toku_stat(fname, &st); assert(r==0); - if ( st.st_size - trim > magic_begin_end_checkpoint_sz ) { + char fname[TOKU_PATH_MAX + 1]; + sprintf(fname, + "%s/%s%d", + TOKU_TEST_FILENAME, + "log000000000000.tokulog", + TOKU_LOG_VERSION); + + r = toku_stat(fname, &st, toku_uninstrumented); + assert(r == 0); + if (st.st_size - trim > magic_begin_end_checkpoint_sz) { r = truncate(fname, st.st_size - trim); CKERR(r); } diff --git a/storage/tokudb/PerconaFT/ft/tests/test-bjm.cc b/storage/tokudb/PerconaFT/ft/tests/test-bjm.cc index 97e00c42..6afe5b9f 100644 --- a/storage/tokudb/PerconaFT/ft/tests/test-bjm.cc +++ b/storage/tokudb/PerconaFT/ft/tests/test-bjm.cc @@ -71,12 +71,16 @@ static void bjm_test(void) { bjm_reset(bjm); r = bjm_add_background_job(bjm); - assert_zero(r); - toku_pthread_t tid; - r = toku_pthread_create(&tid, NULL, finish_bjm, NULL); assert_zero(r); - usleep(2*1024*1024); - // should return non-zero because tid is waiting + toku_pthread_t tid; + r = toku_pthread_create(toku_uninstrumented, + &tid, + nullptr, + finish_bjm, + nullptr); + assert_zero(r); + usleep(2 * 1024 * 1024); + // should return non-zero because tid is waiting // for background jobs to finish r = bjm_add_background_job(bjm); assert(r != 0); diff --git a/storage/tokudb/PerconaFT/ft/tests/test-checkpoint-during-flush.cc b/storage/tokudb/PerconaFT/ft/tests/test-checkpoint-during-flush.cc index 3e5d9bba..06a26614 100644 --- a/storage/tokudb/PerconaFT/ft/tests/test-checkpoint-during-flush.cc +++ b/storage/tokudb/PerconaFT/ft/tests/test-checkpoint-during-flush.cc @@ -113,10 +113,14 @@ static void flusher_callback(int state, void* extra) { if ((state == flt_flush_before_child_pin && !after_child_pin) || (state == ft_flush_aflter_child_pin && after_child_pin)) { checkpoint_called = true; - int r = toku_pthread_create(&checkpoint_tid, NULL, do_checkpoint, NULL); + int r = toku_pthread_create(toku_uninstrumented, + &checkpoint_tid, + nullptr, + do_checkpoint, + nullptr); assert_zero(r); while (!checkpoint_callback_called) { - usleep(1*1024*1024); + usleep(1 * 1024 * 1024); } } } diff --git a/storage/tokudb/PerconaFT/ft/tests/test-checkpoint-during-merge.cc b/storage/tokudb/PerconaFT/ft/tests/test-checkpoint-during-merge.cc index cb316127..1029dfef 100644 --- a/storage/tokudb/PerconaFT/ft/tests/test-checkpoint-during-merge.cc +++ b/storage/tokudb/PerconaFT/ft/tests/test-checkpoint-during-merge.cc @@ -103,10 +103,14 @@ static void flusher_callback(int state, void* extra) { } if (state == desired_state) { checkpoint_called = true; - int r = toku_pthread_create(&checkpoint_tid, NULL, do_checkpoint, NULL); + int r = toku_pthread_create(toku_uninstrumented, + &checkpoint_tid, + nullptr, + do_checkpoint, + nullptr); assert_zero(r); while (!checkpoint_callback_called) { - usleep(1*1024*1024); + usleep(1 * 1024 * 1024); } } } diff --git a/storage/tokudb/PerconaFT/ft/tests/test-checkpoint-during-rebalance.cc b/storage/tokudb/PerconaFT/ft/tests/test-checkpoint-during-rebalance.cc index 5f8485ac..208ebe3c 100644 --- a/storage/tokudb/PerconaFT/ft/tests/test-checkpoint-during-rebalance.cc +++ b/storage/tokudb/PerconaFT/ft/tests/test-checkpoint-during-rebalance.cc @@ -103,10 +103,14 @@ static void flusher_callback(int state, void* extra) { } if (state == desired_state) { checkpoint_called = true; - int r = toku_pthread_create(&checkpoint_tid, NULL, do_checkpoint, NULL); + int r = toku_pthread_create(toku_uninstrumented, + &checkpoint_tid, + nullptr, + do_checkpoint, + nullptr); assert_zero(r); while (!checkpoint_callback_called) { - usleep(1*1024*1024); + usleep(1 * 1024 * 1024); } } } diff --git a/storage/tokudb/PerconaFT/ft/tests/test-checkpoint-during-split.cc b/storage/tokudb/PerconaFT/ft/tests/test-checkpoint-during-split.cc index 70c3ba22..2b29de40 100644 --- a/storage/tokudb/PerconaFT/ft/tests/test-checkpoint-during-split.cc +++ b/storage/tokudb/PerconaFT/ft/tests/test-checkpoint-during-split.cc @@ -113,10 +113,14 @@ static void flusher_callback(int state, void* extra) { if ((state == flt_flush_before_split && !after_split) || (state == flt_flush_during_split && after_split)) { checkpoint_called = true; - int r = toku_pthread_create(&checkpoint_tid, NULL, do_checkpoint, NULL); + int r = toku_pthread_create(toku_uninstrumented, + &checkpoint_tid, + nullptr, + do_checkpoint, + nullptr); assert_zero(r); while (!checkpoint_callback_called) { - usleep(1*1024*1024); + usleep(1 * 1024 * 1024); } } } diff --git a/storage/tokudb/PerconaFT/ft/tests/test3681.cc b/storage/tokudb/PerconaFT/ft/tests/test3681.cc index e5e24a88..9e4a46e8 100644 --- a/storage/tokudb/PerconaFT/ft/tests/test3681.cc +++ b/storage/tokudb/PerconaFT/ft/tests/test3681.cc @@ -91,13 +91,35 @@ static void *startb (void *n) { return NULL; } -static void test3681 (void) { +static void test3681(void) { setup(); - toku_pthread_t a,b; - { int r; r = toku_pthread_create(&a, NULL, starta, NULL); assert(r==0); } - { int r; r = toku_pthread_create(&b, NULL, startb, NULL); assert(r==0); } - { int r; void *v; r = toku_pthread_join(a, &v); assert(r==0); assert(v==NULL); } - { int r; void *v; r = toku_pthread_join(b, &v); assert(r==0); assert(v==NULL); } + toku_pthread_t a, b; + { + int r; + r = toku_pthread_create( + toku_uninstrumented, &a, nullptr, starta, nullptr); + assert(r == 0); + } + { + int r; + r = toku_pthread_create( + toku_uninstrumented, &b, nullptr, startb, nullptr); + assert(r == 0); + } + { + int r; + void *v; + r = toku_pthread_join(a, &v); + assert(r == 0); + assert(v == NULL); + } + { + int r; + void *v; + r = toku_pthread_join(b, &v); + assert(r == 0); + assert(v == NULL); + } finish(); } diff --git a/storage/tokudb/PerconaFT/ft/txn/roll.cc b/storage/tokudb/PerconaFT/ft/txn/roll.cc index 97afd2f5..7228de06 100644 --- a/storage/tokudb/PerconaFT/ft/txn/roll.cc +++ b/storage/tokudb/PerconaFT/ft/txn/roll.cc @@ -195,14 +195,14 @@ int toku_rollback_frename(BYTESTRING old_iname, toku_cachetable_get_fname_in_cwd(cachetable, new_iname.data), &toku_free); - if (toku_stat(old_iname_full.get(), &stat) == -1) { + if (toku_stat(old_iname_full.get(), &stat, toku_uninstrumented) == -1) { if (ENOENT == errno) old_exist = false; else return 1; } - if (toku_stat(new_iname_full.get(), &stat) == -1) { + if (toku_stat(new_iname_full.get(), &stat, toku_uninstrumented) == -1) { if (ENOENT == errno || ENAMETOOLONG == errno) new_exist = false; else @@ -220,7 +220,7 @@ int toku_rollback_frename(BYTESTRING old_iname, // removed // and the new file is renamed. if (old_exist && new_exist && - (toku_os_unlink(old_iname_full.get()) == -1 || + (toku_os_delete(old_iname_full.get()) == -1 || toku_os_rename(new_iname_full.get(), old_iname_full.get()) == -1 || toku_fsync_directory(new_iname_full.get()) == -1 || toku_fsync_directory(old_iname_full.get()) == -1)) diff --git a/storage/tokudb/PerconaFT/ft/txn/rollback_log_node_cache.cc b/storage/tokudb/PerconaFT/ft/txn/rollback_log_node_cache.cc index 71b1e792..5e1ab746 100644 --- a/storage/tokudb/PerconaFT/ft/txn/rollback_log_node_cache.cc +++ b/storage/tokudb/PerconaFT/ft/txn/rollback_log_node_cache.cc @@ -41,7 +41,9 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "txn/rollback_log_node_cache.h" -void rollback_log_node_cache::init (uint32_t max_num_avail_nodes) { +toku_instr_key* rollback_log_node_cache_mutex_key; + +void rollback_log_node_cache::init(uint32_t max_num_avail_nodes) { XMALLOC_N(max_num_avail_nodes, m_avail_blocknums); m_max_num_avail = max_num_avail_nodes; m_first = 0; @@ -49,7 +51,7 @@ void rollback_log_node_cache::init (uint32_t max_num_avail_nodes) { toku_pthread_mutexattr_t attr; toku_mutexattr_init(&attr); toku_mutexattr_settype(&attr, TOKU_MUTEX_ADAPTIVE); - toku_mutex_init(&m_mutex, &attr); + toku_mutex_init(*rollback_log_node_cache_mutex_key, &m_mutex, &attr); toku_mutexattr_destroy(&attr); } diff --git a/storage/tokudb/PerconaFT/ft/txn/txn.cc b/storage/tokudb/PerconaFT/ft/txn/txn.cc index a3ce6beb..7327cbd9 100644 --- a/storage/tokudb/PerconaFT/ft/txn/txn.cc +++ b/storage/tokudb/PerconaFT/ft/txn/txn.cc @@ -45,8 +45,11 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "ft/txn/txn_manager.h" #include "util/status.h" -void -toku_txn_get_status(TXN_STATUS s) { +toku_instr_key *txn_lock_mutex_key; +toku_instr_key *txn_state_lock_mutex_key; +toku_instr_key *result_state_cond_key; + +void toku_txn_get_status(TXN_STATUS s) { txn_status.init(); *s = txn_status; } @@ -225,74 +228,74 @@ static void toku_txn_create_txn ( static txn_child_manager tcm; - struct tokutxn new_txn = { - .txnid = {.parent_id64 = TXNID_NONE, .child_id64 = TXNID_NONE }, - .snapshot_txnid64 = TXNID_NONE, - .snapshot_type = for_recovery ? TXN_SNAPSHOT_NONE : snapshot_type, - .for_recovery = for_recovery, - .logger = logger, - .parent = parent_tokutxn, - .child = NULL, - .child_manager_s = tcm, - .child_manager = NULL, - .container_db_txn = container_db_txn, - .live_root_txn_list = nullptr, - .xids = NULL, - .snapshot_next = NULL, - .snapshot_prev = NULL, - .begin_was_logged = false, - .declared_read_only = read_only, - .do_fsync = false, - .force_fsync_on_commit = false, - .do_fsync_lsn = ZERO_LSN, - .xa_xid = {0, 0, 0, ""}, - .progress_poll_fun = NULL, - .progress_poll_fun_extra = NULL, - - // You cannot initialize txn_lock a TOKU_MUTEX_INITIALIZER, because we - // will initialize it in the code below, and it cannot already - // be initialized at that point. Also, in general, you don't - // get to use PTHREAD_MUTEX_INITALIZER (which is what is inside - // TOKU_MUTEX_INITIALIZER) except in static variables, and this - // is initializing an auto variable. - // - // And we cannot simply avoid initializing these fields - // because, although it avoids -Wmissing-field-initializer - // errors under gcc, it gets other errors about non-trivial - // designated initializers not being supported. - - .txn_lock = ZERO_MUTEX_INITIALIZER, // Not TOKU_MUTEX_INITIALIZER - .open_fts = open_fts, - .roll_info = roll_info, - .state_lock = ZERO_MUTEX_INITIALIZER, // Not TOKU_MUTEX_INITIALIZER - .state_cond = ZERO_COND_INITIALIZER, // Not TOKU_COND_INITIALIZER - .state = TOKUTXN_LIVE, - .num_pin = 0, - .client_id = 0, - .client_extra = nullptr, - .start_time = time(NULL), - }; +struct tokutxn new_txn = { + .txnid = {.parent_id64 = TXNID_NONE, .child_id64 = TXNID_NONE }, + .snapshot_txnid64 = TXNID_NONE, + .snapshot_type = for_recovery ? TXN_SNAPSHOT_NONE : snapshot_type, + .for_recovery = for_recovery, + .logger = logger, + .parent = parent_tokutxn, + .child = NULL, + .child_manager_s = tcm, + .child_manager = NULL, + .container_db_txn = container_db_txn, + .live_root_txn_list = nullptr, + .xids = NULL, + .snapshot_next = NULL, + .snapshot_prev = NULL, + .begin_was_logged = false, + .declared_read_only = read_only, + .do_fsync = false, + .force_fsync_on_commit = false, + .do_fsync_lsn = ZERO_LSN, + .xa_xid = {0, 0, 0, ""}, + .progress_poll_fun = NULL, + .progress_poll_fun_extra = NULL, + + // You cannot initialize txn_lock a TOKU_MUTEX_INITIALIZER, because we + // will initialize it in the code below, and it cannot already + // be initialized at that point. Also, in general, you don't + // get to use PTHREAD_MUTEX_INITALIZER (which is what is inside + // TOKU_MUTEX_INITIALIZER) except in static variables, and this + // is initializing an auto variable. + // + // And we cannot simply avoid initializing these fields + // because, although it avoids -Wmissing-field-initializer + // errors under gcc, it gets other errors about non-trivial + // designated initializers not being supported. + + .txn_lock = ZERO_MUTEX_INITIALIZER, // Not TOKU_MUTEX_INITIALIZER + .open_fts = open_fts, + .roll_info = roll_info, + .state_lock = ZERO_MUTEX_INITIALIZER, // Not TOKU_MUTEX_INITIALIZER + .state_cond = ZERO_COND_INITIALIZER, // Not TOKU_COND_INITIALIZER + .state = TOKUTXN_LIVE, + .num_pin = 0, + .client_id = 0, + .client_extra = nullptr, + .start_time = time(NULL), +}; - TOKUTXN result = NULL; - XMEMDUP(result, &new_txn); - invalidate_xa_xid(&result->xa_xid); - if (parent_tokutxn == NULL) { - result->child_manager = &result->child_manager_s; - result->child_manager->init(result); +TOKUTXN result = NULL; +XMEMDUP(result, &new_txn); +invalidate_xa_xid(&result->xa_xid); +if (parent_tokutxn == NULL) { + result->child_manager = &result->child_manager_s; + result->child_manager->init(result); } else { result->child_manager = parent_tokutxn->child_manager; } - toku_mutex_init(&result->txn_lock, nullptr); + toku_mutex_init(*txn_lock_mutex_key, &result->txn_lock, nullptr); toku_pthread_mutexattr_t attr; toku_mutexattr_init(&attr); toku_mutexattr_settype(&attr, TOKU_MUTEX_ADAPTIVE); - toku_mutex_init(&result->state_lock, &attr); + toku_mutex_init(*txn_state_lock_mutex_key, &result->state_lock, &attr); toku_mutexattr_destroy(&attr); - toku_cond_init(&result->state_cond, nullptr); + toku_cond_init(*result_state_cond_key, &result->state_cond, nullptr); *tokutxn = result; diff --git a/storage/tokudb/PerconaFT/ft/txn/txn_child_manager.cc b/storage/tokudb/PerconaFT/ft/txn/txn_child_manager.cc index db110127..99a21331 100644 --- a/storage/tokudb/PerconaFT/ft/txn/txn_child_manager.cc +++ b/storage/tokudb/PerconaFT/ft/txn/txn_child_manager.cc @@ -39,6 +39,8 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "ft/logger/log-internal.h" #include "ft/txn/txn_child_manager.h" +toku_instr_key *txn_child_manager_mutex_key; + // // initialized a txn_child_manager, // when called, root->txnid.parent_id64 may not yet be set @@ -53,7 +55,7 @@ void txn_child_manager::init(TOKUTXN root) { toku_pthread_mutexattr_t attr; toku_mutexattr_init(&attr); toku_mutexattr_settype(&attr, TOKU_MUTEX_ADAPTIVE); - toku_mutex_init(&m_mutex, &attr); + toku_mutex_init(*txn_child_manager_mutex_key, &m_mutex, &attr); toku_mutexattr_destroy(&attr); } diff --git a/storage/tokudb/PerconaFT/ft/txn/txn_manager.cc b/storage/tokudb/PerconaFT/ft/txn/txn_manager.cc index 88eca36a..384a960b 100644 --- a/storage/tokudb/PerconaFT/ft/txn/txn_manager.cc +++ b/storage/tokudb/PerconaFT/ft/txn/txn_manager.cc @@ -56,7 +56,10 @@ void set_test_txn_sync_callback(void (*cb) (pthread_t, void *), void *extra) { } bool garbage_collection_debug = false; -static bool txn_records_snapshot(TXN_SNAPSHOT_TYPE snapshot_type, struct tokutxn *parent) { +toku_instr_key *txn_manager_lock_mutex_key; + +static bool txn_records_snapshot(TXN_SNAPSHOT_TYPE snapshot_type, + struct tokutxn *parent) { if (snapshot_type == TXN_COPIES_SNAPSHOT) { return false; } @@ -248,9 +251,10 @@ verify_snapshot_system(TXN_MANAGER txn_manager UU()) { live_root_txns_omt.destroy(); } -void toku_txn_manager_init(TXN_MANAGER* txn_managerp) { +void toku_txn_manager_init(TXN_MANAGER *txn_managerp) { TXN_MANAGER XCALLOC(txn_manager); - toku_mutex_init(&txn_manager->txn_manager_lock, NULL); + toku_mutex_init( + *txn_manager_lock_mutex_key, &txn_manager->txn_manager_lock, nullptr); txn_manager->live_root_txns.create(); txn_manager->live_root_ids.create(); txn_manager->snapshot_head = NULL; diff --git a/storage/tokudb/PerconaFT/locktree/lock_request.cc b/storage/tokudb/PerconaFT/locktree/lock_request.cc index 0151b5bd..c0829e3f 100644 --- a/storage/tokudb/PerconaFT/locktree/lock_request.cc +++ b/storage/tokudb/PerconaFT/locktree/lock_request.cc @@ -62,7 +62,7 @@ void lock_request::create(void) { m_state = state::UNINITIALIZED; m_info = nullptr; - toku_cond_init(&m_wait_cond, nullptr); + toku_cond_init(*lock_request_m_wait_cond_key, &m_wait_cond, nullptr); m_start_test_callback = nullptr; m_start_before_pending_test_callback = nullptr; diff --git a/storage/tokudb/PerconaFT/locktree/locktree.cc b/storage/tokudb/PerconaFT/locktree/locktree.cc index 2fbf078b..069aae26 100644 --- a/storage/tokudb/PerconaFT/locktree/locktree.cc +++ b/storage/tokudb/PerconaFT/locktree/locktree.cc @@ -51,7 +51,6 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. // the locktree source file instead of the header. #include "concurrent_tree.h" - namespace toku { // A locktree represents the set of row locks owned by all transactions @@ -87,12 +86,13 @@ void lt_lock_request_info::init(void) { pending_lock_requests.create(); pending_is_empty = true; ZERO_STRUCT(mutex); - toku_mutex_init(&mutex, nullptr); + toku_mutex_init(*locktree_request_info_mutex_key, &mutex, nullptr); retry_want = retry_done = 0; ZERO_STRUCT(counters); ZERO_STRUCT(retry_mutex); - toku_mutex_init(&retry_mutex, nullptr); - toku_cond_init(&retry_cv, nullptr); + toku_mutex_init( + *locktree_request_info_retry_mutex_key, &retry_mutex, nullptr); + toku_cond_init(*locktree_request_info_retry_cv_key, &retry_cv, nullptr); running_retry = false; TOKU_VALGRIND_HG_DISABLE_CHECKING(&pending_is_empty, diff --git a/storage/tokudb/PerconaFT/locktree/manager.cc b/storage/tokudb/PerconaFT/locktree/manager.cc index 91ff7c5a..6bb5c77b 100644 --- a/storage/tokudb/PerconaFT/locktree/manager.cc +++ b/storage/tokudb/PerconaFT/locktree/manager.cc @@ -56,9 +56,8 @@ void locktree_manager::create(lt_create_cb create_cb, lt_destroy_cb destroy_cb, m_lt_destroy_callback = destroy_cb; m_lt_escalate_callback = escalate_cb; m_lt_escalate_callback_extra = escalate_extra; - ZERO_STRUCT(m_mutex); - toku_mutex_init(&m_mutex, nullptr); + toku_mutex_init(*manager_mutex_key, &m_mutex, nullptr); ZERO_STRUCT(m_lt_counters); @@ -346,7 +345,8 @@ int locktree_manager::check_current_lock_constraints(bool big_txn) { void locktree_manager::escalator_init(void) { ZERO_STRUCT(m_escalation_mutex); - toku_mutex_init(&m_escalation_mutex, nullptr); + toku_mutex_init( + *manager_escalation_mutex_key, &m_escalation_mutex, nullptr); m_escalation_count = 0; m_escalation_time = 0; m_wait_escalation_count = 0; @@ -403,8 +403,8 @@ struct escalate_args { void locktree_manager::locktree_escalator::create(void) { ZERO_STRUCT(m_escalator_mutex); - toku_mutex_init(&m_escalator_mutex, nullptr); - toku_cond_init(&m_escalator_done, nullptr); + toku_mutex_init(*manager_escalator_mutex_key, &m_escalator_mutex, nullptr); + toku_cond_init(*manager_m_escalator_done_key, &m_escalator_done, nullptr); m_escalator_running = false; } diff --git a/storage/tokudb/PerconaFT/locktree/tests/locktree_escalation_1big7lt_1small.cc b/storage/tokudb/PerconaFT/locktree/tests/locktree_escalation_1big7lt_1small.cc index 6c143f96..32029b5b 100644 --- a/storage/tokudb/PerconaFT/locktree/tests/locktree_escalation_1big7lt_1small.cc +++ b/storage/tokudb/PerconaFT/locktree/tests/locktree_escalation_1big7lt_1small.cc @@ -201,12 +201,14 @@ int main(int argc, const char *argv[]) { locktree *small_lt = mgr.get_lt(dict_id, dbt_comparator, nullptr); // create the worker threads - struct big_arg big_arg = { &mgr, big_lt, n_big, 1000 }; - r = toku_pthread_create(&big_id, nullptr, big_f, &big_arg); + struct big_arg big_arg = {&mgr, big_lt, n_big, 1000}; + r = toku_pthread_create( + toku_uninstrumented, &big_id, nullptr, big_f, &big_arg); assert(r == 0); - struct small_arg small_arg = { &mgr, small_lt, 2000, 0 }; - r = toku_pthread_create(&small_id, nullptr, small_f, &small_arg); + struct small_arg small_arg = {&mgr, small_lt, 2000, 0}; + r = toku_pthread_create( + toku_uninstrumented, &small_id, nullptr, small_f, &small_arg); assert(r == 0); // wait for some escalations to occur diff --git a/storage/tokudb/PerconaFT/locktree/tests/locktree_escalation_2big_1lt.cc b/storage/tokudb/PerconaFT/locktree/tests/locktree_escalation_2big_1lt.cc index 17eb0706..ff59a7bd 100644 --- a/storage/tokudb/PerconaFT/locktree/tests/locktree_escalation_2big_1lt.cc +++ b/storage/tokudb/PerconaFT/locktree/tests/locktree_escalation_2big_1lt.cc @@ -169,8 +169,10 @@ int main(int argc, const char *argv[]) { struct arg big_arg[n_big]; pthread_t big_ids[n_big]; for (int i = 0; i < n_big; i++) { - big_arg[i] = { &mgr, lt[i % n_lt], (TXNID)(1000+i), i == 0 ? 1 : -1000000000 }; - r = toku_pthread_create(&big_ids[i], nullptr, big_f, &big_arg[i]); + big_arg[i] = { + &mgr, lt[i % n_lt], (TXNID)(1000 + i), i == 0 ? 1 : -1000000000}; + r = toku_pthread_create( + toku_uninstrumented, &big_ids[i], nullptr, big_f, &big_arg[i]); assert(r == 0); } diff --git a/storage/tokudb/PerconaFT/locktree/tests/locktree_escalation_2big_2lt.cc b/storage/tokudb/PerconaFT/locktree/tests/locktree_escalation_2big_2lt.cc index 4326e8fa..be1ddaba 100644 --- a/storage/tokudb/PerconaFT/locktree/tests/locktree_escalation_2big_2lt.cc +++ b/storage/tokudb/PerconaFT/locktree/tests/locktree_escalation_2big_2lt.cc @@ -169,8 +169,10 @@ int main(int argc, const char *argv[]) { struct arg big_arg[n_big]; pthread_t big_ids[n_big]; for (int i = 0; i < n_big; i++) { - big_arg[i] = { &mgr, lt[i % n_lt], (TXNID)(1000+i), i == 0 ? 1 : -1000000000 }; - r = toku_pthread_create(&big_ids[i], nullptr, big_f, &big_arg[i]); + big_arg[i] = { + &mgr, lt[i % n_lt], (TXNID)(1000 + i), i == 0 ? 1 : -1000000000}; + r = toku_pthread_create( + toku_uninstrumented, &big_ids[i], nullptr, big_f, &big_arg[i]); assert(r == 0); } diff --git a/storage/tokudb/PerconaFT/locktree/tests/locktree_escalation_stalls.cc b/storage/tokudb/PerconaFT/locktree/tests/locktree_escalation_stalls.cc index d146d94e..9dc9596a 100644 --- a/storage/tokudb/PerconaFT/locktree/tests/locktree_escalation_stalls.cc +++ b/storage/tokudb/PerconaFT/locktree/tests/locktree_escalation_stalls.cc @@ -182,9 +182,10 @@ int main(int argc, const char *argv[]) { locktree *lt_1 = mgr.get_lt(dict_id_1, dbt_comparator, nullptr); // create the worker threads - struct arg big_arg = { &mgr, lt_0, 1000 }; + struct arg big_arg = {&mgr, lt_0, 1000}; pthread_t big_id; - r = toku_pthread_create(&big_id, nullptr, big_f, &big_arg); + r = toku_pthread_create( + toku_uninstrumented, &big_id, nullptr, big_f, &big_arg); assert(r == 0); const int n_small = 7; @@ -192,8 +193,12 @@ int main(int argc, const char *argv[]) { struct arg small_args[n_small]; for (int i = 0; i < n_small; i++) { - small_args[i] = { &mgr, lt_1, (TXNID)(2000+i), i }; - r = toku_pthread_create(&small_ids[i], nullptr, small_f, &small_args[i]); + small_args[i] = {&mgr, lt_1, (TXNID)(2000 + i), i}; + r = toku_pthread_create(toku_uninstrumented, + &small_ids[i], + nullptr, + small_f, + &small_args[i]); assert(r == 0); } diff --git a/storage/tokudb/PerconaFT/locktree/tests/manager_parallel_locktree_get_release.cc b/storage/tokudb/PerconaFT/locktree/tests/manager_parallel_locktree_get_release.cc index ec9ef215..08ce6314 100644 --- a/storage/tokudb/PerconaFT/locktree/tests/manager_parallel_locktree_get_release.cc +++ b/storage/tokudb/PerconaFT/locktree/tests/manager_parallel_locktree_get_release.cc @@ -71,7 +71,8 @@ void manager_unit_test::test_reference_release_lt(void) { const int nthreads = 2; pthread_t ids[nthreads]; for (int i = 0; i < nthreads; i++) { - r = toku_pthread_create(&ids[i], nullptr, my_tester, &mgr); + r = toku_pthread_create( + toku_uninstrumented, &ids[i], nullptr, my_tester, &mgr); assert(r == 0); } for (int i = 0; i < nthreads; i++) { diff --git a/storage/tokudb/PerconaFT/locktree/treenode.cc b/storage/tokudb/PerconaFT/locktree/treenode.cc index 4f43291f..cc3a4969 100644 --- a/storage/tokudb/PerconaFT/locktree/treenode.cc +++ b/storage/tokudb/PerconaFT/locktree/treenode.cc @@ -38,9 +38,9 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include -void treenode::mutex_lock(void) { - toku_mutex_lock(&m_mutex); -} +// TODO: source location info might have to be pulled up one caller +// to be useful +void treenode::mutex_lock(void) { toku_mutex_lock(&m_mutex); } void treenode::mutex_unlock(void) { toku_mutex_unlock(&m_mutex); @@ -58,7 +58,7 @@ void treenode::init(const comparator *cmp) { toku_pthread_mutexattr_t attr; toku_mutexattr_init(&attr); toku_mutexattr_settype(&attr, TOKU_MUTEX_ADAPTIVE); - toku_mutex_init(&m_mutex, &attr); + toku_mutex_init(*treenode_mutex_key, &m_mutex, &attr); toku_mutexattr_destroy(&attr); m_left_child.set(nullptr); m_right_child.set(nullptr); diff --git a/storage/tokudb/PerconaFT/portability/CMakeLists.txt b/storage/tokudb/PerconaFT/portability/CMakeLists.txt index 4793db63..e5576a5d 100644 --- a/storage/tokudb/PerconaFT/portability/CMakeLists.txt +++ b/storage/tokudb/PerconaFT/portability/CMakeLists.txt @@ -8,6 +8,7 @@ set(tokuportability_srcs portability toku_assert toku_crash + toku_instr_mysql toku_path toku_pthread toku_time @@ -53,6 +54,10 @@ if (NOT DEFINED MYSQL_PROJECT_NAME_DOCSTRING) DESTINATION ${INSTALL_LIBDIR} COMPONENT tokukv_libs_shared ) +else () + set_property(SOURCE toku_pthread portability APPEND PROPERTY + COMPILE_DEFINITIONS MYSQL_TOKUDB_ENGINE=1 ) + target_link_libraries(${LIBTOKUPORTABILITY} LINK_PRIVATE mysys) endif () add_subdirectory(tests) diff --git a/storage/tokudb/PerconaFT/portability/file.cc b/storage/tokudb/PerconaFT/portability/file.cc index 0e3efc1a..485bfac8 100644 --- a/storage/tokudb/PerconaFT/portability/file.cc +++ b/storage/tokudb/PerconaFT/portability/file.cc @@ -52,9 +52,12 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "toku_path.h" #include +toku_instr_key *tokudb_file_data_key; + static int toku_assert_on_write_enospc = 0; static const int toku_write_enospc_sleep = 1; -static uint64_t toku_write_enospc_last_report; // timestamp of most recent report to error log +static uint64_t toku_write_enospc_last_report; // timestamp of most recent + // report to error log static time_t toku_write_enospc_last_time; // timestamp of most recent ENOSPC static uint32_t toku_write_enospc_current; // number of threads currently blocked on ENOSPC static uint64_t toku_write_enospc_total; // total number of times ENOSPC was returned from an attempt to write @@ -142,11 +145,17 @@ static ssize_t (*t_full_pwrite)(int, const void *, size_t, off_t); static FILE * (*t_fdopen)(int, const char *); static FILE * (*t_fopen)(const char *, const char *); static int (*t_open)(const char *, int, int); -static int (*t_fclose)(FILE *); +static int (*t_fclose)(FILE *); static ssize_t (*t_read)(int, void *, size_t); static ssize_t (*t_pread)(int, void *, size_t, off_t); +static size_t (*os_fwrite_fun)(const void *, size_t, size_t, FILE *) = nullptr; + +void toku_set_func_fwrite( + size_t (*fwrite_fun)(const void *, size_t, size_t, FILE *)) { + os_fwrite_fun = fwrite_fun; +} -void toku_set_func_write (ssize_t (*write_fun)(int, const void *, size_t)) { +void toku_set_func_write(ssize_t (*write_fun)(int, const void *, size_t)) { t_write = write_fun; } @@ -186,9 +195,63 @@ void toku_set_func_pread (ssize_t (*pread_fun)(int, void *, size_t, off_t)) { t_pread = pread_fun; } -void -toku_os_full_write (int fd, const void *buf, size_t len) { - const char *bp = (const char *) buf; +int toku_os_delete_with_source_location(const char *name, + const char *src_file, + uint src_line) { + + toku_io_instrumentation io_annotation; + toku_instr_file_name_close_begin(io_annotation, + *tokudb_file_data_key, + toku_instr_file_op::file_delete, + name, + src_file, + src_line); + const int result = unlink(name); + + /* Register the result value with the instrumentation system */ + toku_instr_file_close_end(io_annotation, result); + + return result; +} + +int toku_os_rename_with_source_location(const char *old_name, + const char *new_name, + const char *src_file, + uint src_line) { + int result; + + toku_io_instrumentation io_annotation; + toku_instr_file_name_io_begin(io_annotation, + *tokudb_file_data_key, + toku_instr_file_op::file_rename, + new_name, + 0, + src_file, + src_line); + + result = rename(old_name, new_name); + /* Regsiter the result value with the instrumentation system */ + toku_instr_file_io_end(io_annotation, 0); + + return result; +} + +void toku_os_full_write_with_source_location(int fd, + const void *buf, + size_t len, + const char *src_file, + uint src_line) { + const char *bp = (const char *)buf; + size_t bytes_written = len; + + toku_io_instrumentation io_annotation; + toku_instr_file_io_begin(io_annotation, + toku_instr_file_op::file_write, + fd, + len, + src_file, + src_line); + while (len > 0) { ssize_t r; if (t_full_write) { @@ -205,14 +268,30 @@ toku_os_full_write (int fd, const void *buf, size_t len) { } } assert(len == 0); + + /* Register the result value with the instrumentaion system */ + toku_instr_file_io_end(io_annotation, bytes_written); } -int -toku_os_write (int fd, const void *buf, size_t len) { - const char *bp = (const char *) buf; +int toku_os_write_with_source_location(int fd, + const void *buf, + size_t len, + const char *src_file, + uint src_line) { + const char *bp = (const char *)buf; int result = 0; + ssize_t r; + + size_t bytes_written = len; + toku_io_instrumentation io_annotation; + toku_instr_file_io_begin(io_annotation, + toku_instr_file_op::file_write, + fd, + len, + src_file, + src_line); + while (len > 0) { - ssize_t r; if (t_write) { r = t_write(fd, bp, len); } else { @@ -222,17 +301,33 @@ toku_os_write (int fd, const void *buf, size_t len) { result = errno; break; } - len -= r; - bp += r; + len -= r; + bp += r; } + /* Register the result value with the instrumentation system */ + toku_instr_file_io_end(io_annotation, bytes_written - len); + return result; } -void -toku_os_full_pwrite (int fd, const void *buf, size_t len, toku_off_t off) { - assert(0==((long long)buf)%512); - assert((len%512 == 0) && (off%512)==0); // to make pwrite work. - const char *bp = (const char *) buf; +void toku_os_full_pwrite_with_source_location(int fd, + const void *buf, + size_t len, + toku_off_t off, + const char *src_file, + uint src_line) { + assert(0 == ((long long)buf) % 512); + assert((len % 512 == 0) && (off % 512) == 0); // to make pwrite work. + const char *bp = (const char *)buf; + + size_t bytes_written = len; + toku_io_instrumentation io_annotation; + toku_instr_file_io_begin(io_annotation, + toku_instr_file_op::file_write, + fd, + len, + src_file, + src_line); while (len > 0) { ssize_t r; if (t_full_pwrite) { @@ -250,71 +345,209 @@ toku_os_full_pwrite (int fd, const void *buf, size_t len, toku_off_t off) { } } assert(len == 0); -} -ssize_t -toku_os_pwrite (int fd, const void *buf, size_t len, toku_off_t off) { - assert(0==((long long)buf)%512); // these asserts are to ensure that direct I/O will work. - assert(0==len %512); - assert(0==off %512); - const char *bp = (const char *) buf; + /* Register the result value with the instrumentation system */ + toku_instr_file_io_end(io_annotation, bytes_written); +} + +ssize_t toku_os_pwrite_with_source_location(int fd, + const void *buf, + size_t len, + toku_off_t off, + const char *src_file, + uint src_line) { + assert(0 == + ((long long)buf) % + 512); // these asserts are to ensure that direct I/O will work. + assert(0 == len % 512); + assert(0 == off % 512); + const char *bp = (const char *)buf; ssize_t result = 0; + ssize_t r; + + size_t bytes_written = len; + toku_io_instrumentation io_annotation; + toku_instr_file_io_begin(io_annotation, + toku_instr_file_op::file_write, + fd, + len, + src_file, + src_line); while (len > 0) { - ssize_t r; - if (t_pwrite) { - r = t_pwrite(fd, bp, len, off); - } else { - r = pwrite(fd, bp, len, off); - } + r = (t_pwrite) ? t_pwrite(fd, bp, len, off) : pwrite(fd, bp, len, off); + if (r < 0) { result = errno; break; } len -= r; - bp += r; - off += r; + bp += r; + off += r; + } + /* Register the result value with the instrumentation system */ + toku_instr_file_io_end(io_annotation, bytes_written - len); + + return result; +} + +int toku_os_fwrite_with_source_location(const void *ptr, + size_t size, + size_t nmemb, + TOKU_FILE *stream, + const char *src_file, + uint src_line) { + int result = 0; + size_t bytes_written; + + toku_io_instrumentation io_annotation; + toku_instr_file_stream_io_begin(io_annotation, + toku_instr_file_op::file_write, + *stream, + nmemb, + src_file, + src_line); + + if (os_fwrite_fun) { + bytes_written = os_fwrite_fun(ptr, size, nmemb, stream->file); + } else { + bytes_written = fwrite(ptr, size, nmemb, stream->file); + } + + if (bytes_written != nmemb) { + if (os_fwrite_fun) // if using hook to induce artificial errors (for + // testing) ... + result = get_maybe_error_errno(); // ... then there is no error in + // the stream, but there is one + // in errno + else + result = ferror(stream->file); + invariant(result != 0); // Should we assert here? + } + /* Register the result value with the instrumentation system */ + toku_instr_file_io_end(io_annotation, bytes_written); + + return result; +} + +int toku_os_fread_with_source_location(void *ptr, + size_t size, + size_t nmemb, + TOKU_FILE *stream, + const char *src_file, + uint src_line) { + int result = 0; + size_t bytes_read; + + toku_io_instrumentation io_annotation; + toku_instr_file_stream_io_begin(io_annotation, + toku_instr_file_op::file_read, + *stream, + nmemb, + src_file, + src_line); + + if ((bytes_read = fread(ptr, size, nmemb, stream->file)) != nmemb) { + if ((feof(stream->file))) + result = EOF; + else + result = ferror(stream->file); + invariant(result != 0); // Should we assert here? } + /* Register the result value with the instrumentation system */ + toku_instr_file_io_end(io_annotation, bytes_read); + return result; } -FILE * -toku_os_fdopen(int fildes, const char *mode) { - FILE * rval; - if (t_fdopen) - rval = t_fdopen(fildes, mode); - else - rval = fdopen(fildes, mode); +TOKU_FILE *toku_os_fdopen_with_source_location(int fildes, + const char *mode, + const char *filename, + const toku_instr_key &instr_key, + const char *src_file, + uint src_line) { + TOKU_FILE *XMALLOC(rval); + if (FT_LIKELY(rval != nullptr)) { + toku_io_instrumentation io_annotation; + toku_instr_file_open_begin(io_annotation, + instr_key, + toku_instr_file_op::file_stream_open, + filename, + src_file, + src_line); + + rval->file = (t_fdopen) ? t_fdopen(fildes, mode) : fdopen(fildes, mode); + toku_instr_file_stream_open_end(io_annotation, *rval); + + if (FT_UNLIKELY(rval->file == nullptr)) { + toku_free(rval); + rval = nullptr; + } + } return rval; } - -FILE * -toku_os_fopen(const char *filename, const char *mode){ - FILE * rval; - if (t_fopen) - rval = t_fopen(filename, mode); - else - rval = fopen(filename, mode); +TOKU_FILE *toku_os_fopen_with_source_location(const char *filename, + const char *mode, + const toku_instr_key &instr_key, + const char *src_file, + uint src_line) { + TOKU_FILE *XMALLOC(rval); + if (FT_UNLIKELY(rval == nullptr)) + return nullptr; + + toku_io_instrumentation io_annotation; + toku_instr_file_open_begin(io_annotation, + instr_key, + toku_instr_file_op::file_stream_open, + filename, + src_file, + src_line); + rval->file = t_fopen ? t_fopen(filename, mode) : fopen(filename, mode); + /* Register the returning "file" value with the system */ + toku_instr_file_stream_open_end(io_annotation, *rval); + + if (FT_UNLIKELY(rval->file == nullptr)) { + toku_free(rval); + rval = nullptr; + } return rval; } -int -toku_os_open(const char *path, int oflag, int mode) { - int rval; +int toku_os_open_with_source_location(const char *path, + int oflag, + int mode, + const toku_instr_key &instr_key, + const char *src_file, + uint src_line) { + int fd; + toku_io_instrumentation io_annotation; + /* register a file open or creation depending on "oflag" */ + toku_instr_file_open_begin( + io_annotation, + instr_key, + ((oflag & O_CREAT) ? toku_instr_file_op::file_create + : toku_instr_file_op::file_open), + path, + src_file, + src_line); if (t_open) - rval = t_open(path, oflag, mode); + fd = t_open(path, oflag, mode); else - rval = open(path, oflag, mode); - return rval; + fd = open(path, oflag, mode); + + toku_instr_file_open_end(io_annotation, fd); + return fd; } -int -toku_os_open_direct(const char *path, int oflag, int mode) { +int toku_os_open_direct(const char *path, + int oflag, + int mode, + const toku_instr_key &instr_key) { int rval; #if defined(HAVE_O_DIRECT) - rval = toku_os_open(path, oflag | O_DIRECT, mode); + rval = toku_os_open(path, oflag | O_DIRECT, mode, instr_key); #elif defined(HAVE_F_NOCACHE) - rval = toku_os_open(path, oflag, mode); + rval = toku_os_open(path, oflag, mode, instr_key); if (rval >= 0) { int r = fcntl(rval, F_NOCACHE, 1); if (r == -1) { @@ -327,63 +560,112 @@ toku_os_open_direct(const char *path, int oflag, int mode) { return rval; } -int -toku_os_fclose(FILE * stream) { +int toku_os_fclose_with_source_location(TOKU_FILE *stream, + const char *src_file, + uint src_line) { int rval = -1; - if (t_fclose) - rval = t_fclose(stream); - else { // if EINTR, retry until success - while (rval != 0) { - rval = fclose(stream); - if (rval && (errno != EINTR)) - break; - } + if (FT_LIKELY(stream != nullptr)) { + /* register a file stream close " */ + toku_io_instrumentation io_annotation; + toku_instr_file_stream_close_begin( + io_annotation, + toku_instr_file_op::file_stream_close, + *stream, + src_file, + src_line); + + if (t_fclose) + rval = t_fclose(stream->file); + else { // if EINTR, retry until success + while (rval != 0) { + rval = fclose(stream->file); + if (rval && (errno != EINTR)) + break; + } + } + /* Register the returning "rval" value with the system */ + toku_instr_file_close_end(io_annotation, rval); + toku_free(stream); + stream = nullptr; } return rval; } -int -toku_os_close(int fd) { // if EINTR, retry until success +int toku_os_close_with_source_location( + int fd, + const char *src_file, + uint src_line) { // if EINTR, retry until success + /* register the file close */ int r = -1; + + /* register a file descriptor close " */ + toku_io_instrumentation io_annotation; + toku_instr_file_fd_close_begin( + io_annotation, toku_instr_file_op::file_close, fd, src_file, src_line); while (r != 0) { - r = close(fd); - if (r) { - int rr = errno; - if (rr!=EINTR) printf("rr=%d (%s)\n", rr, strerror(rr)); - assert(rr==EINTR); - } + r = close(fd); + if (r) { + int rr = errno; + if (rr != EINTR) + printf("rr=%d (%s)\n", rr, strerror(rr)); + assert(rr == EINTR); + } } - return r; -} - -int toku_os_rename(const char *old_name, const char *new_name) { - return rename(old_name, new_name); -} -int toku_os_unlink(const char *path) { return unlink(path); } + /* Regsiter the returning value with the system */ + toku_instr_file_close_end(io_annotation, r); -ssize_t -toku_os_read(int fd, void *buf, size_t count) { - ssize_t r; - if (t_read) - r = t_read(fd, buf, count); - else - r = read(fd, buf, count); return r; } -ssize_t -toku_os_pread (int fd, void *buf, size_t count, off_t offset) { - assert(0==((long long)buf)%512); - assert(0==count%512); - assert(0==offset%512); - ssize_t r; +ssize_t toku_os_read_with_source_location(int fd, + void *buf, + size_t count, + const char *src_file, + uint src_line) { + ssize_t bytes_read; + + toku_io_instrumentation io_annotation; + toku_instr_file_io_begin(io_annotation, + toku_instr_file_op::file_read, + fd, + count, + src_file, + src_line); + + bytes_read = (t_read) ? t_read(fd, buf, count) : read(fd, buf, count); + + toku_instr_file_io_end(io_annotation, bytes_read); + + return bytes_read; +} + +ssize_t inline_toku_os_pread_with_source_location(int fd, + void *buf, + size_t count, + off_t offset, + const char *src_file, + uint src_line) { + assert(0 == ((long long)buf) % 512); + assert(0 == count % 512); + assert(0 == offset % 512); + ssize_t bytes_read; + + toku_io_instrumentation io_annotation; + toku_instr_file_io_begin(io_annotation, + toku_instr_file_op::file_read, + fd, + count, + src_file, + src_line); if (t_pread) { - r = t_pread(fd, buf, count, offset); + bytes_read = t_pread(fd, buf, count, offset); } else { - r = pread(fd, buf, count, offset); + bytes_read = pread(fd, buf, count, offset); } - return r; + toku_instr_file_io_end(io_annotation, bytes_read); + + return bytes_read; } void toku_os_recursive_delete(const char *path) { @@ -411,13 +693,24 @@ void toku_set_func_fsync(int (*fsync_function)(int)) { } // keep trying if fsync fails because of EINTR -static void file_fsync_internal (int fd) { +void file_fsync_internal_with_source_location(int fd, + const char *src_file, + uint src_line) { uint64_t tstart = toku_current_time_microsec(); int r = -1; uint64_t eintr_count = 0; + + toku_io_instrumentation io_annotation; + toku_instr_file_io_begin(io_annotation, + toku_instr_file_op::file_sync, + fd, + 0, + src_file, + src_line); + while (r != 0) { - if (t_fsync) { - r = t_fsync(fd); + if (t_fsync) { + r = t_fsync(fd); } else { r = fsync(fd); } @@ -429,6 +722,9 @@ static void file_fsync_internal (int fd) { toku_sync_fetch_and_add(&toku_fsync_count, 1); uint64_t duration = toku_current_time_microsec() - tstart; toku_sync_fetch_and_add(&toku_fsync_time, duration); + + toku_instr_file_io_end(io_annotation, 0); + if (duration >= toku_long_fsync_threshold) { toku_sync_fetch_and_add(&toku_long_fsync_count, 1); toku_sync_fetch_and_add(&toku_long_fsync_time, duration); diff --git a/storage/tokudb/PerconaFT/portability/memory.cc b/storage/tokudb/PerconaFT/portability/memory.cc index 5430ff84..9594158c 100644 --- a/storage/tokudb/PerconaFT/portability/memory.cc +++ b/storage/tokudb/PerconaFT/portability/memory.cc @@ -104,7 +104,13 @@ toku_memory_startup(void) { size_t lg_chunk; // log2 of the mmap threshold size_t lg_chunk_length = sizeof lg_chunk; result = mallctl_f("opt.lg_chunk", &lg_chunk, &lg_chunk_length, NULL, 0); - if (result == 0) + if (result) + { + status.mmap_threshold = 1 << 21; // Default value. + // Incompatible jemalloc change. + result = 0; + } + else status.mmap_threshold = 1 << lg_chunk; } } diff --git a/storage/tokudb/PerconaFT/portability/portability.cc b/storage/tokudb/PerconaFT/portability/portability.cc index 19f445a8..dfa5153c 100644 --- a/storage/tokudb/PerconaFT/portability/portability.cc +++ b/storage/tokudb/PerconaFT/portability/portability.cc @@ -79,6 +79,9 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "toku_os.h" #include "toku_time.h" #include "memory.h" + +#include "toku_instrumentation.h" + #include #include @@ -172,13 +175,26 @@ toku_os_get_phys_memory_size(void) { #endif } -int -toku_os_get_file_size(int fildes, int64_t *fsize) { +int toku_os_get_file_size_with_source_location(int fildes, + int64_t *fsize, + const char *src_file, + uint src_line) { toku_struct_stat sbuf; + + toku_io_instrumentation io_annotation; + toku_instr_file_io_begin(io_annotation, + toku_instr_file_op::file_stat, + fildes, + 0, + src_file, + src_line); + int r = fstat(fildes, &sbuf); - if (r==0) { + if (r == 0) { *fsize = sbuf.st_size; } + toku_instr_file_io_end(io_annotation, 0); + return r; } @@ -272,15 +288,39 @@ toku_os_get_max_process_data_size(uint64_t *maxdata) { return r; } -int -toku_stat(const char *name, toku_struct_stat *buf) { +int toku_stat_with_source_location(const char *name, + toku_struct_stat *buf, + const toku_instr_key &instr_key, + const char *src_file, + uint src_line) { + toku_io_instrumentation io_annotation; + toku_instr_file_name_io_begin(io_annotation, + instr_key, + toku_instr_file_op::file_stat, + name, + 0, + src_file, + src_line); int r = stat(name, buf); + + toku_instr_file_io_end(io_annotation, 0); return r; } -int -toku_fstat(int fd, toku_struct_stat *buf) { +int toku_os_fstat_with_source_location(int fd, + toku_struct_stat *buf, + const char *src_file, + uint src_line) { + toku_io_instrumentation io_annotation; + toku_instr_file_io_begin(io_annotation, + toku_instr_file_op::file_stat, + fd, + 0, + src_file, + src_line); + int r = fstat(fd, buf); + toku_instr_file_io_end(io_annotation, 0); return r; } @@ -427,5 +467,9 @@ void __attribute__((constructor)) toku_portability_helgrind_ignore(void); void toku_portability_helgrind_ignore(void) { TOKU_VALGRIND_HG_DISABLE_CHECKING(&toku_cached_hz, sizeof toku_cached_hz); - TOKU_VALGRIND_HG_DISABLE_CHECKING(&toku_cached_pagesize, sizeof toku_cached_pagesize); + TOKU_VALGRIND_HG_DISABLE_CHECKING(&toku_cached_pagesize, + sizeof toku_cached_pagesize); } + +static const pfs_key_t pfs_not_instrumented = 0xFFFFFFFF; +toku_instr_key toku_uninstrumented(pfs_not_instrumented); diff --git a/storage/tokudb/PerconaFT/portability/tests/rwlock_condvar.h b/storage/tokudb/PerconaFT/portability/tests/rwlock_condvar.h index 92f2fb35..d1ebc81e 100644 --- a/storage/tokudb/PerconaFT/portability/tests/rwlock_condvar.h +++ b/storage/tokudb/PerconaFT/portability/tests/rwlock_condvar.h @@ -107,10 +107,10 @@ get_waitstate(void) #endif int toku_cv_fair_rwlock_init (toku_cv_fair_rwlock_t *rwlock) { - rwlock->state=0; + rwlock->state = 0; rwlock->waiters_head = NULL; rwlock->waiters_tail = NULL; - toku_mutex_init(&rwlock->mutex, NULL); + toku_mutex_init(toku_uninstrumented, &rwlock->mutex, nullptr); return 0; } diff --git a/storage/tokudb/PerconaFT/portability/tests/test-pthread-rwlock-rdlock.cc b/storage/tokudb/PerconaFT/portability/tests/test-pthread-rwlock-rdlock.cc index 364bd7d3..62aa5205 100644 --- a/storage/tokudb/PerconaFT/portability/tests/test-pthread-rwlock-rdlock.cc +++ b/storage/tokudb/PerconaFT/portability/tests/test-pthread-rwlock-rdlock.cc @@ -48,7 +48,7 @@ int test_main(int argc __attribute__((__unused__)), char *const argv[] __attribu toku_pthread_rwlock_t rwlock; ZERO_STRUCT(rwlock); - toku_pthread_rwlock_init(&rwlock, NULL); + toku_pthread_rwlock_init(toku_uninstrumented, &rwlock, nullptr); toku_pthread_rwlock_rdlock(&rwlock); toku_pthread_rwlock_rdlock(&rwlock); toku_pthread_rwlock_rdunlock(&rwlock); diff --git a/storage/tokudb/PerconaFT/portability/tests/test-pthread-rwlock-rwr.cc b/storage/tokudb/PerconaFT/portability/tests/test-pthread-rwlock-rwr.cc index 3ca9e06b..92b30421 100644 --- a/storage/tokudb/PerconaFT/portability/tests/test-pthread-rwlock-rwr.cc +++ b/storage/tokudb/PerconaFT/portability/tests/test-pthread-rwlock-rwr.cc @@ -71,13 +71,19 @@ int test_main(int argc , char *const argv[] ) { toku_pthread_t tid; void *retptr; - toku_pthread_rwlock_init(&rwlock, NULL); - state = 37; if (verbose) printf("%s:%d\n", __FUNCTION__, __LINE__); + toku_pthread_rwlock_init(toku_uninstrumented, &rwlock, nullptr); + state = 37; + if (verbose) + printf("%s:%d\n", __FUNCTION__, __LINE__); toku_pthread_rwlock_rdlock(&rwlock); - r = toku_pthread_create(&tid, NULL, f, &rwlock); assert(r == 0); + r = toku_pthread_create(toku_uninstrumented, &tid, nullptr, f, &rwlock); + assert(r == 0); - assert(state==37); state = 42; if (verbose) printf("%s:%d\n", __FUNCTION__, __LINE__); + assert(state == 37); + state = 42; + if (verbose) + printf("%s:%d\n", __FUNCTION__, __LINE__); sleep(4); assert(state==16); state = 44; if (verbose) printf("%s:%d\n", __FUNCTION__, __LINE__); toku_pthread_rwlock_rdlock(&rwlock); diff --git a/storage/tokudb/PerconaFT/portability/tests/test-stat.cc b/storage/tokudb/PerconaFT/portability/tests/test-stat.cc index 494a17bd..57201764 100644 --- a/storage/tokudb/PerconaFT/portability/tests/test-stat.cc +++ b/storage/tokudb/PerconaFT/portability/tests/test-stat.cc @@ -47,10 +47,11 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. static void test_stat(const char *dirname, int result, int ex_errno) { int r; toku_struct_stat buf; - r = toku_stat(dirname, &buf); - //printf("stat %s %d %d\n", dirname, r, errno); fflush(stdout); - assert(r==result); - if (r!=0) assert(get_maybe_error_errno() == ex_errno); + r = toku_stat(dirname, &buf, toku_uninstrumented); + // printf("stat %s %d %d\n", dirname, r, errno); fflush(stdout); + assert(r == result); + if (r != 0) + assert(get_maybe_error_errno() == ex_errno); } int main(void) { diff --git a/storage/tokudb/PerconaFT/portability/tests/test-toku-malloc.cc b/storage/tokudb/PerconaFT/portability/tests/test-toku-malloc.cc index 1e1c7533..0d99b36b 100644 --- a/storage/tokudb/PerconaFT/portability/tests/test-toku-malloc.cc +++ b/storage/tokudb/PerconaFT/portability/tests/test-toku-malloc.cc @@ -53,10 +53,12 @@ int main(void) { int i; const int max_threads = 2; toku_pthread_t tids[max_threads]; - for (i=0; i= 5) && (MYSQL_VERSION_MINOR >= 7) + return PSI_THREAD_CALL(spawn_thread)( + key.id(), reinterpret_cast(thread), + attr, start_routine, arg); +#else + return PSI_THREAD_CALL(spawn_thread)( + key.id(), thread, attr, start_routine, arg); +#endif +} + +void toku_instr_register_current_thread(const toku_instr_key &key) { + struct PSI_thread *psi_thread = + PSI_THREAD_CALL(new_thread)(key.id(), nullptr, 0); + PSI_THREAD_CALL(set_thread)(psi_thread); +} + +void toku_instr_delete_current_thread() { + PSI_THREAD_CALL(delete_current_thread)(); +} + +// I/O instrumentation + +void toku_instr_file_open_begin(toku_io_instrumentation &io_instr, + const toku_instr_key &key, + toku_instr_file_op op, + const char *name, + const char *src_file, + int src_line) { + io_instr.locker = + PSI_FILE_CALL(get_thread_file_name_locker)( + &io_instr.state, key.id(), static_cast(op), + name, io_instr.locker); + if (io_instr.locker != nullptr) { + PSI_FILE_CALL(start_file_open_wait) + (io_instr.locker, src_file, src_line); + } +} + +void toku_instr_file_stream_open_end(toku_io_instrumentation &io_instr, + TOKU_FILE &file) { + file.key = nullptr; + if (FT_LIKELY(io_instr.locker)) { + file.key = + PSI_FILE_CALL(end_file_open_wait)(io_instr.locker, file.file); + } +} + +void toku_instr_file_open_end(toku_io_instrumentation &io_instr, int fd) { + if (FT_LIKELY(io_instr.locker)) + PSI_FILE_CALL(end_file_open_wait_and_bind_to_descriptor) + (io_instr.locker, fd); +} + +void toku_instr_file_name_close_begin(toku_io_instrumentation &io_instr, + const toku_instr_key &key, + toku_instr_file_op op, + const char *name, + const char *src_file, + int src_line) { + io_instr.locker = + PSI_FILE_CALL(get_thread_file_name_locker)( + &io_instr.state, key.id(), static_cast(op), + name, + io_instr.locker); + if (FT_LIKELY(io_instr.locker)) { + PSI_FILE_CALL(start_file_close_wait) + (io_instr.locker, src_file, src_line); + } +} + +void toku_instr_file_stream_close_begin(toku_io_instrumentation &io_instr, + toku_instr_file_op op, + const TOKU_FILE &file, + const char *src_file, + int src_line) { + io_instr.locker = nullptr; + if (FT_LIKELY(file.key)) { + io_instr.locker = PSI_FILE_CALL(get_thread_file_stream_locker)( + &io_instr.state, file.key, (PSI_file_operation)op); + if (FT_LIKELY(io_instr.locker)) { + PSI_FILE_CALL(start_file_close_wait) + (io_instr.locker, src_file, src_line); + } + } +} + +void toku_instr_file_fd_close_begin(toku_io_instrumentation &io_instr, + toku_instr_file_op op, + int fd, + const char *src_file, + int src_line) { + io_instr.locker = PSI_FILE_CALL(get_thread_file_descriptor_locker)( + &io_instr.state, fd, (PSI_file_operation)op); + if (FT_LIKELY(io_instr.locker)) { + PSI_FILE_CALL(start_file_close_wait) + (io_instr.locker, src_file, src_line); + } +} + +void toku_instr_file_close_end(const toku_io_instrumentation &io_instr, + int result) { + if (FT_LIKELY(io_instr.locker)) + PSI_FILE_CALL(end_file_close_wait) + (io_instr.locker, result); +} + +void toku_instr_file_io_begin(toku_io_instrumentation &io_instr, + toku_instr_file_op op, + int fd, + ssize_t count, + const char *src_file, + int src_line) { + io_instr.locker = PSI_FILE_CALL(get_thread_file_descriptor_locker)( + &io_instr.state, fd, (PSI_file_operation)op); + if (FT_LIKELY(io_instr.locker)) { + PSI_FILE_CALL(start_file_wait) + (io_instr.locker, count, src_file, src_line); + } +} + +void toku_instr_file_name_io_begin(toku_io_instrumentation &io_instr, + const toku_instr_key &key, + toku_instr_file_op op, + const char *name, + ssize_t count, + const char *src_file, + int src_line) { + io_instr.locker = + PSI_FILE_CALL(get_thread_file_name_locker)(&io_instr.state, + key.id(), + (PSI_file_operation)op, + name, + &io_instr.locker); + if (FT_LIKELY(io_instr.locker)) { + PSI_FILE_CALL(start_file_wait) + (io_instr.locker, count, src_file, src_line); + } +} + +void toku_instr_file_stream_io_begin(toku_io_instrumentation &io_instr, + toku_instr_file_op op, + const TOKU_FILE &file, + ssize_t count, + const char *src_file, + int src_line) { + io_instr.locker = nullptr; + if (FT_LIKELY(file.key)) { + io_instr.locker = PSI_FILE_CALL(get_thread_file_stream_locker)( + &io_instr.state, file.key, (PSI_file_operation)op); + if (FT_LIKELY(io_instr.locker)) { + PSI_FILE_CALL(start_file_wait) + (io_instr.locker, count, src_file, src_line); + } + } +} + +void toku_instr_file_io_end(toku_io_instrumentation &io_instr, ssize_t count) { + if (FT_LIKELY(io_instr.locker)) + PSI_FILE_CALL(end_file_wait) + (io_instr.locker, count); +} + +// Mutex instrumentation + +void toku_instr_mutex_init(const toku_instr_key &key, toku_mutex_t &mutex) { + mutex.psi_mutex = PSI_MUTEX_CALL(init_mutex)(key.id(), &mutex.pmutex); +#if TOKU_PTHREAD_DEBUG + mutex.instr_key_id = key.id(); +#endif +} + +void toku_instr_mutex_destroy(PSI_mutex *&mutex_instr) { + if (mutex_instr != nullptr) { + PSI_MUTEX_CALL(destroy_mutex)(mutex_instr); + mutex_instr = nullptr; + } +} + +void toku_instr_mutex_lock_start(toku_mutex_instrumentation &mutex_instr, + toku_mutex_t &mutex, + const char *src_file, + int src_line) { + mutex_instr.locker = nullptr; + if (mutex.psi_mutex) { + mutex_instr.locker = + PSI_MUTEX_CALL(start_mutex_wait)(&mutex_instr.state, + mutex.psi_mutex, + PSI_MUTEX_LOCK, + src_file, + src_line); + } +} + +void toku_instr_mutex_trylock_start(toku_mutex_instrumentation &mutex_instr, + toku_mutex_t &mutex, + const char *src_file, + int src_line) { + mutex_instr.locker = nullptr; + if (mutex.psi_mutex) { + mutex_instr.locker = + PSI_MUTEX_CALL(start_mutex_wait)(&mutex_instr.state, + mutex.psi_mutex, + PSI_MUTEX_TRYLOCK, + src_file, + src_line); + } +} + +void toku_instr_mutex_lock_end(toku_mutex_instrumentation &mutex_instr, + int pthread_mutex_lock_result) { + if (mutex_instr.locker) + PSI_MUTEX_CALL(end_mutex_wait) + (mutex_instr.locker, pthread_mutex_lock_result); +} + +void toku_instr_mutex_unlock(PSI_mutex *mutex_instr) { + if (mutex_instr) + PSI_MUTEX_CALL(unlock_mutex)(mutex_instr); +} + +// Condvar instrumentation + +void toku_instr_cond_init(const toku_instr_key &key, toku_cond_t &cond) { + cond.psi_cond = PSI_COND_CALL(init_cond)(key.id(), &cond.pcond); +#if TOKU_PTHREAD_DEBUG + cond.instr_key_id = key.id(); +#endif +} + +void toku_instr_cond_destroy(PSI_cond *&cond_instr) { + if (cond_instr != nullptr) { + PSI_COND_CALL(destroy_cond)(cond_instr); + cond_instr = nullptr; + } +} + +void toku_instr_cond_wait_start(toku_cond_instrumentation &cond_instr, + toku_instr_cond_op op, + toku_cond_t &cond, + toku_mutex_t &mutex, + const char *src_file, + int src_line) { + cond_instr.locker = nullptr; + if (cond.psi_cond) { + /* Instrumentation start */ + cond_instr.locker = + PSI_COND_CALL(start_cond_wait)(&cond_instr.state, + cond.psi_cond, + mutex.psi_mutex, + (PSI_cond_operation)op, + src_file, + src_line); + } +} + +void toku_instr_cond_wait_end(toku_cond_instrumentation &cond_instr, + int pthread_cond_wait_result) { + if (cond_instr.locker) + PSI_COND_CALL(end_cond_wait) + (cond_instr.locker, pthread_cond_wait_result); +} + +void toku_instr_cond_signal(const toku_cond_t &cond) { + if (cond.psi_cond) + PSI_COND_CALL(signal_cond)(cond.psi_cond); +} + +void toku_instr_cond_broadcast(const toku_cond_t &cond) { + if (cond.psi_cond) + PSI_COND_CALL(broadcast_cond)(cond.psi_cond); +} + +// rwlock instrumentation + +void toku_instr_rwlock_init(const toku_instr_key &key, + toku_pthread_rwlock_t &rwlock) { + rwlock.psi_rwlock = PSI_RWLOCK_CALL(init_rwlock)(key.id(), &rwlock.rwlock); +#if TOKU_PTHREAD_DEBUG + rwlock.instr_key_id = key.id(); +#endif +} + +void toku_instr_rwlock_destroy(PSI_rwlock *&rwlock_instr) { + if (rwlock_instr != nullptr) { + PSI_RWLOCK_CALL(destroy_rwlock)(rwlock_instr); + rwlock_instr = nullptr; + } +} + +void toku_instr_rwlock_rdlock_wait_start( + toku_rwlock_instrumentation &rwlock_instr, + toku_pthread_rwlock_t &rwlock, + const char *src_file, + int src_line) { + rwlock_instr.locker = nullptr; + if (rwlock.psi_rwlock) { + /* Instrumentation start */ + rwlock_instr.locker = + PSI_RWLOCK_CALL(start_rwlock_rdwait)(&rwlock_instr.state, + rwlock.psi_rwlock, + PSI_RWLOCK_READLOCK, + src_file, + src_line); + } +} + +void toku_instr_rwlock_wrlock_wait_start( + toku_rwlock_instrumentation &rwlock_instr, + toku_pthread_rwlock_t &rwlock, + const char *src_file, + int src_line) { + rwlock_instr.locker = nullptr; + if (rwlock.psi_rwlock) { + /* Instrumentation start */ + rwlock_instr.locker = + PSI_RWLOCK_CALL(start_rwlock_wrwait)(&rwlock_instr.state, + rwlock.psi_rwlock, + PSI_RWLOCK_WRITELOCK, + src_file, + src_line); + } +} + +void toku_instr_rwlock_rdlock_wait_end( + toku_rwlock_instrumentation &rwlock_instr, + int pthread_rwlock_wait_result) { + if (rwlock_instr.locker) + PSI_RWLOCK_CALL(end_rwlock_rdwait) + (rwlock_instr.locker, pthread_rwlock_wait_result); +} + +void toku_instr_rwlock_wrlock_wait_end( + toku_rwlock_instrumentation &rwlock_instr, + int pthread_rwlock_wait_result) { + if (rwlock_instr.locker) + PSI_RWLOCK_CALL(end_rwlock_wrwait) + (rwlock_instr.locker, pthread_rwlock_wait_result); +} + +void toku_instr_rwlock_unlock(toku_pthread_rwlock_t &rwlock) { + if (rwlock.psi_rwlock) + PSI_RWLOCK_CALL(unlock_rwlock)(rwlock.psi_rwlock); +} + +#endif // MYSQL_TOKUDB_ENGINE diff --git a/storage/tokudb/PerconaFT/portability/toku_instr_mysql.h b/storage/tokudb/PerconaFT/portability/toku_instr_mysql.h new file mode 100644 index 00000000..d6b0ed35 --- /dev/null +++ b/storage/tokudb/PerconaFT/portability/toku_instr_mysql.h @@ -0,0 +1,249 @@ +#ifdef TOKU_INSTR_MYSQL_H +// This file can be included only from toku_instumentation.h because +// it replaces the defintitions for the case if MySQL PFS is available +#error "toku_instr_mysql.h can be included only once" +#else // TOKU_INSTR_MYSQL_H +#define TOKU_INSTR_MYSQL_H + +#include + +// As these macros are defined in my_global.h +// and they are also defined in command line +// undefine them here to avoid compilation errors. +#undef __STDC_FORMAT_MACROS +#undef __STDC_LIMIT_MACROS +#include // PSI_file +#include // PSI_mutex + +#ifndef HAVE_PSI_MUTEX_INTERFACE +#error HAVE_PSI_MUTEX_INTERFACE required +#endif +#ifndef HAVE_PSI_RWLOCK_INTERFACE +#error HAVE_PSI_RWLOCK_INTERFACE required +#endif +#ifndef HAVE_PSI_THREAD_INTERFACE +#error HAVE_PSI_THREAD_INTERFACE required +#endif + +// Instrumentation keys + +class toku_instr_key { + private: + pfs_key_t m_id; + + public: + toku_instr_key(toku_instr_object_type type, + const char *group, + const char *name) { + switch (type) { + case toku_instr_object_type::mutex: { + PSI_mutex_info mutex_info{&m_id, name, 0}; + mysql_mutex_register(group, &mutex_info, 1); + } break; + case toku_instr_object_type::rwlock: { + PSI_rwlock_info rwlock_info{&m_id, name, 0}; + mysql_rwlock_register(group, &rwlock_info, 1); + } break; + case toku_instr_object_type::cond: { + PSI_cond_info cond_info{&m_id, name, 0}; + mysql_cond_register(group, &cond_info, 1); + } break; + case toku_instr_object_type::thread: { + PSI_thread_info thread_info{&m_id, name, 0}; + mysql_thread_register(group, &thread_info, 1); + } break; + case toku_instr_object_type::file: { + PSI_file_info file_info{&m_id, name, 0}; + mysql_file_register(group, &file_info, 1); + } break; + } + } + + explicit toku_instr_key(pfs_key_t key_id) : m_id(key_id) {} + + pfs_key_t id() const { return m_id; } +}; + +// Thread instrumentation +int toku_pthread_create(const toku_instr_key &key, + pthread_t *thread, + const pthread_attr_t *attr, + void *(*start_routine)(void *), + void *arg); +void toku_instr_register_current_thread(const toku_instr_key &key); +void toku_instr_delete_current_thread(); + +// I/O instrumentation + +enum class toku_instr_file_op { + file_stream_open = PSI_FILE_STREAM_OPEN, + file_create = PSI_FILE_CREATE, + file_open = PSI_FILE_OPEN, + file_delete = PSI_FILE_DELETE, + file_rename = PSI_FILE_RENAME, + file_read = PSI_FILE_READ, + file_write = PSI_FILE_WRITE, + file_sync = PSI_FILE_SYNC, + file_stream_close = PSI_FILE_STREAM_CLOSE, + file_close = PSI_FILE_CLOSE, + file_stat = PSI_FILE_STAT +}; + +struct toku_io_instrumentation { + struct PSI_file_locker *locker; + PSI_file_locker_state state; + + toku_io_instrumentation() : locker(nullptr) {} +}; + +void toku_instr_file_open_begin(toku_io_instrumentation &io_instr, + const toku_instr_key &key, + toku_instr_file_op op, + const char *name, + const char *src_file, + int src_line); +void toku_instr_file_stream_open_end(toku_io_instrumentation &io_instr, + TOKU_FILE &file); +void toku_instr_file_open_end(toku_io_instrumentation &io_instr, int fd); +void toku_instr_file_name_close_begin(toku_io_instrumentation &io_instr, + const toku_instr_key &key, + toku_instr_file_op op, + const char *name, + const char *src_file, + int src_line); +void toku_instr_file_stream_close_begin(toku_io_instrumentation &io_instr, + toku_instr_file_op op, + const TOKU_FILE &file, + const char *src_file, + int src_line); +void toku_instr_file_fd_close_begin(toku_io_instrumentation &io_instr, + toku_instr_file_op op, + int fd, + const char *src_file, + int src_line); +void toku_instr_file_close_end(const toku_io_instrumentation &io_instr, + int result); +void toku_instr_file_io_begin(toku_io_instrumentation &io_instr, + toku_instr_file_op op, + int fd, + ssize_t count, + const char *src_file, + int src_line); +void toku_instr_file_name_io_begin(toku_io_instrumentation &io_instr, + const toku_instr_key &key, + toku_instr_file_op op, + const char *name, + ssize_t count, + const char *src_file, + int src_line); +void toku_instr_file_stream_io_begin(toku_io_instrumentation &io_instr, + toku_instr_file_op op, + const TOKU_FILE &file, + ssize_t count, + const char *src_file, + int src_line); +void toku_instr_file_io_end(toku_io_instrumentation &io_instr, ssize_t count); + +// Mutex instrumentation + +struct toku_mutex_instrumentation { + struct PSI_mutex_locker *locker; + PSI_mutex_locker_state state; + + toku_mutex_instrumentation() : locker(nullptr) {} +}; + +void toku_instr_mutex_init(const toku_instr_key &key, toku_mutex_t &mutex); +void toku_instr_mutex_destroy(PSI_mutex *&mutex_instr); +void toku_instr_mutex_lock_start(toku_mutex_instrumentation &mutex_instr, + toku_mutex_t &mutex, + const char *src_file, + int src_line); +void toku_instr_mutex_trylock_start(toku_mutex_instrumentation &mutex_instr, + toku_mutex_t &mutex, + const char *src_file, + int src_line); +void toku_instr_mutex_lock_end(toku_mutex_instrumentation &mutex_instr, + int pthread_mutex_lock_result); +void toku_instr_mutex_unlock(PSI_mutex *mutex_instr); + +// Instrumentation probes + +class toku_instr_probe_pfs { + private: + std::unique_ptr mutex; + toku_mutex_instrumentation mutex_instr; + + public: + explicit toku_instr_probe_pfs(const toku_instr_key &key); + + ~toku_instr_probe_pfs(); + + void start_with_source_location(const char *src_file, int src_line) { + mutex_instr.locker = nullptr; + toku_instr_mutex_lock_start(mutex_instr, *mutex, src_file, src_line); + } + + void stop() { toku_instr_mutex_lock_end(mutex_instr, 0); } +}; + +typedef toku_instr_probe_pfs toku_instr_probe; + +// Condvar instrumentation + +struct toku_cond_instrumentation { + struct PSI_cond_locker *locker; + PSI_cond_locker_state state; + + toku_cond_instrumentation() : locker(nullptr) {} +}; + +enum class toku_instr_cond_op { + cond_wait = PSI_COND_WAIT, + cond_timedwait = PSI_COND_TIMEDWAIT, +}; + +void toku_instr_cond_init(const toku_instr_key &key, toku_cond_t &cond); +void toku_instr_cond_destroy(PSI_cond *&cond_instr); +void toku_instr_cond_wait_start(toku_cond_instrumentation &cond_instr, + toku_instr_cond_op op, + toku_cond_t &cond, + toku_mutex_t &mutex, + const char *src_file, + int src_line); +void toku_instr_cond_wait_end(toku_cond_instrumentation &cond_instr, + int pthread_cond_wait_result); +void toku_instr_cond_signal(const toku_cond_t &cond); +void toku_instr_cond_broadcast(const toku_cond_t &cond); + +// rwlock instrumentation + +struct toku_rwlock_instrumentation { + struct PSI_rwlock_locker *locker; + PSI_rwlock_locker_state state; + + toku_rwlock_instrumentation() : locker(nullptr) { } +}; + +void toku_instr_rwlock_init(const toku_instr_key &key, + toku_pthread_rwlock_t &rwlock); +void toku_instr_rwlock_destroy(PSI_rwlock *&rwlock_instr); +void toku_instr_rwlock_rdlock_wait_start( + toku_rwlock_instrumentation &rwlock_instr, + toku_pthread_rwlock_t &rwlock, + const char *src_file, + int src_line); +void toku_instr_rwlock_wrlock_wait_start( + toku_rwlock_instrumentation &rwlock_instr, + toku_pthread_rwlock_t &rwlock, + const char *src_file, + int src_line); +void toku_instr_rwlock_rdlock_wait_end( + toku_rwlock_instrumentation &rwlock_instr, + int pthread_rwlock_wait_result); +void toku_instr_rwlock_wrlock_wait_end( + toku_rwlock_instrumentation &rwlock_instr, + int pthread_rwlock_wait_result); +void toku_instr_rwlock_unlock(toku_pthread_rwlock_t &rwlock); + +#endif // TOKU_INSTR_MYSQL_H diff --git a/storage/tokudb/PerconaFT/portability/toku_instrumentation.h b/storage/tokudb/PerconaFT/portability/toku_instrumentation.h new file mode 100644 index 00000000..8c9390ed --- /dev/null +++ b/storage/tokudb/PerconaFT/portability/toku_instrumentation.h @@ -0,0 +1,339 @@ +#pragma once + +#include // FILE + +// Performance instrumentation object identifier type +typedef unsigned int pfs_key_t; + +enum class toku_instr_object_type { mutex, rwlock, cond, thread, file }; + +struct PSI_file; + +struct TOKU_FILE { + /** The real file. */ + FILE *file; + struct PSI_file *key; + TOKU_FILE() : file(nullptr), key(nullptr) {} +}; + +struct PSI_mutex; +struct PSI_cond; +struct PSI_rwlock; + +struct toku_mutex_t; +struct toku_cond_t; +struct toku_pthread_rwlock_t; + +class toku_instr_key; + +class toku_instr_probe_empty { + public: + explicit toku_instr_probe_empty(UU(const toku_instr_key &key)) {} + + void start_with_source_location(UU(const char *src_file), + UU(int src_line)) {} + + void stop() {} +}; + +#define TOKU_PROBE_START(p) p->start_with_source_location(__FILE__, __LINE__) +#define TOKU_PROBE_STOP(p) p->stop + +extern toku_instr_key toku_uninstrumented; + +#ifndef MYSQL_TOKUDB_ENGINE + +#include + +class toku_instr_key { + public: + toku_instr_key(UU(toku_instr_object_type type), + UU(const char *group), + UU(const char *name)) {} + + explicit toku_instr_key(UU(pfs_key_t key_id)) {} +}; + +typedef toku_instr_probe_empty toku_instr_probe; + +enum class toku_instr_file_op { + file_stream_open, + file_create, + file_open, + file_delete, + file_rename, + file_read, + file_write, + file_sync, + file_stream_close, + file_close, + file_stat +}; + +struct PSI_file {}; +struct PSI_mutex {}; + +struct toku_io_instrumentation {}; + +inline int toku_pthread_create(UU(const toku_instr_key &key), + pthread_t *thread, + const pthread_attr_t *attr, + void *(*start_routine)(void *), + void *arg) { + return pthread_create(thread, attr, start_routine, arg); +} + +inline void toku_instr_register_current_thread() {} + +inline void toku_instr_delete_current_thread() {} + +// Instrument file creation, opening, closing, and renaming +inline void toku_instr_file_open_begin(UU(toku_io_instrumentation &io_instr), + UU(const toku_instr_key &key), + UU(toku_instr_file_op op), + UU(const char *name), + UU(const char *src_file), + UU(int src_line)) {} + +inline void toku_instr_file_stream_open_end( + UU(toku_io_instrumentation &io_instr), + UU(TOKU_FILE &file)) {} + +inline void toku_instr_file_open_end(UU(toku_io_instrumentation &io_instr), + UU(int fd)) {} + +inline void toku_instr_file_name_close_begin( + UU(toku_io_instrumentation &io_instr), + UU(const toku_instr_key &key), + UU(toku_instr_file_op op), + UU(const char *name), + UU(const char *src_file), + UU(int src_line)) {} + +inline void toku_instr_file_stream_close_begin( + UU(toku_io_instrumentation &io_instr), + UU(toku_instr_file_op op), + UU(TOKU_FILE &file), + UU(const char *src_file), + UU(int src_line)) {} + +inline void toku_instr_file_fd_close_begin( + UU(toku_io_instrumentation &io_instr), + UU(toku_instr_file_op op), + UU(int fd), + UU(const char *src_file), + UU(int src_line)) {} + +inline void toku_instr_file_close_end(UU(toku_io_instrumentation &io_instr), + UU(int result)) {} + +inline void toku_instr_file_io_begin(UU(toku_io_instrumentation &io_instr), + UU(toku_instr_file_op op), + UU(int fd), + UU(unsigned int count), + UU(const char *src_file), + UU(int src_line)) {} + +inline void toku_instr_file_name_io_begin(UU(toku_io_instrumentation &io_instr), + UU(const toku_instr_key &key), + UU(toku_instr_file_op op), + UU(const char *name), + UU(unsigned int count), + UU(const char *src_file), + UU(int src_line)) {} + +inline void toku_instr_file_stream_io_begin( + UU(toku_io_instrumentation &io_instr), + UU(toku_instr_file_op op), + UU(TOKU_FILE &file), + UU(unsigned int count), + UU(const char *src_file), + UU(int src_line)) {} + +inline void toku_instr_file_io_end(UU(toku_io_instrumentation &io_instr), + UU(unsigned int count)) {} + +struct toku_mutex_t; + +struct toku_mutex_instrumentation {}; + +inline PSI_mutex *toku_instr_mutex_init(UU(const toku_instr_key &key), + UU(toku_mutex_t &mutex)) { + return nullptr; +} + +inline void toku_instr_mutex_destroy(UU(PSI_mutex *&mutex_instr)) {} + +inline void toku_instr_mutex_lock_start( + UU(toku_mutex_instrumentation &mutex_instr), + UU(toku_mutex_t &mutex), + UU(const char *src_file), + UU(int src_line)) {} + +inline void toku_instr_mutex_trylock_start( + UU(toku_mutex_instrumentation &mutex_instr), + UU(toku_mutex_t &mutex), + UU(const char *src_file), + UU(int src_line)) {} + +inline void toku_instr_mutex_lock_end( + UU(toku_mutex_instrumentation &mutex_instr), + UU(int pthread_mutex_lock_result)) {} + +inline void toku_instr_mutex_unlock(UU(PSI_mutex *mutex_instr)) {} + +struct toku_cond_instrumentation {}; + +enum class toku_instr_cond_op { + cond_wait, + cond_timedwait, +}; + +inline PSI_cond *toku_instr_cond_init(UU(const toku_instr_key &key), + UU(toku_cond_t &cond)) { + return nullptr; +} + +inline void toku_instr_cond_destroy(UU(PSI_cond *&cond_instr)) {} + +inline void toku_instr_cond_wait_start( + UU(toku_cond_instrumentation &cond_instr), + UU(toku_instr_cond_op op), + UU(toku_cond_t &cond), + UU(toku_mutex_t &mutex), + UU(const char *src_file), + UU(int src_line)) {} + +inline void toku_instr_cond_wait_end(UU(toku_cond_instrumentation &cond_instr), + UU(int pthread_cond_wait_result)) {} + +inline void toku_instr_cond_signal(UU(toku_cond_t &cond)) {} + +inline void toku_instr_cond_broadcast(UU(toku_cond_t &cond)) {} + +// rwlock instrumentation +struct toku_rwlock_instrumentation {}; + +inline PSI_rwlock *toku_instr_rwlock_init(UU(const toku_instr_key &key), + UU(toku_pthread_rwlock_t &rwlock)) { + return nullptr; +} + +inline void toku_instr_rwlock_destroy(UU(PSI_rwlock *&rwlock_instr)) {} + +inline void toku_instr_rwlock_rdlock_wait_start( + UU(toku_rwlock_instrumentation &rwlock_instr), + UU(toku_pthread_rwlock_t &rwlock), + UU(const char *src_file), + UU(int src_line)) {} + +inline void toku_instr_rwlock_wrlock_wait_start( + UU(toku_rwlock_instrumentation &rwlock_instr), + UU(toku_pthread_rwlock_t &rwlock), + UU(const char *src_file), + UU(int src_line)) {} + +inline void toku_instr_rwlock_rdlock_wait_end( + UU(toku_rwlock_instrumentation &rwlock_instr), + UU(int pthread_rwlock_wait_result)) {} + +inline void toku_instr_rwlock_wrlock_wait_end( + UU(toku_rwlock_instrumentation &rwlock_instr), + UU(int pthread_rwlock_wait_result)) {} + +inline void toku_instr_rwlock_unlock(UU(toku_pthread_rwlock_t &rwlock)) {} + +#else // MYSQL_TOKUDB_ENGINE +// There can be not only mysql but also mongodb or any other PFS stuff +#include +#endif // MYSQL_TOKUDB_ENGINE + +extern toku_instr_key toku_uninstrumented; + +extern toku_instr_probe *toku_instr_probe_1; + +// threads +extern toku_instr_key *extractor_thread_key; +extern toku_instr_key *fractal_thread_key; +extern toku_instr_key *io_thread_key; +extern toku_instr_key *eviction_thread_key; +extern toku_instr_key *kibbutz_thread_key; +extern toku_instr_key *minicron_thread_key; +extern toku_instr_key *tp_internal_thread_key; + +// Files +extern toku_instr_key *tokudb_file_data_key; +extern toku_instr_key *tokudb_file_load_key; +extern toku_instr_key *tokudb_file_tmp_key; +extern toku_instr_key *tokudb_file_log_key; + +// Mutexes +extern toku_instr_key *kibbutz_mutex_key; +extern toku_instr_key *minicron_p_mutex_key; +extern toku_instr_key *queue_result_mutex_key; +extern toku_instr_key *tpool_lock_mutex_key; +extern toku_instr_key *workset_lock_mutex_key; +extern toku_instr_key *bjm_jobs_lock_mutex_key; +extern toku_instr_key *log_internal_lock_mutex_key; +extern toku_instr_key *cachetable_ev_thread_lock_mutex_key; +extern toku_instr_key *cachetable_disk_nb_mutex_key; +extern toku_instr_key *cachetable_m_mutex_key; +extern toku_instr_key *safe_file_size_lock_mutex_key; +extern toku_instr_key *checkpoint_safe_mutex_key; +extern toku_instr_key *ft_ref_lock_mutex_key; +extern toku_instr_key *loader_error_mutex_key; +extern toku_instr_key *bfs_mutex_key; +extern toku_instr_key *loader_bl_mutex_key; +extern toku_instr_key *loader_fi_lock_mutex_key; +extern toku_instr_key *loader_out_mutex_key; +extern toku_instr_key *result_output_condition_lock_mutex_key; +extern toku_instr_key *block_table_mutex_key; +extern toku_instr_key *rollback_log_node_cache_mutex_key; +extern toku_instr_key *txn_lock_mutex_key; +extern toku_instr_key *txn_state_lock_mutex_key; +extern toku_instr_key *txn_child_manager_mutex_key; +extern toku_instr_key *txn_manager_lock_mutex_key; +extern toku_instr_key *treenode_mutex_key; +extern toku_instr_key *manager_mutex_key; +extern toku_instr_key *manager_escalation_mutex_key; +extern toku_instr_key *manager_escalator_mutex_key; +extern toku_instr_key *db_txn_struct_i_txn_mutex_key; +extern toku_instr_key *indexer_i_indexer_lock_mutex_key; +extern toku_instr_key *indexer_i_indexer_estimate_lock_mutex_key; +extern toku_instr_key *locktree_request_info_mutex_key; +extern toku_instr_key *locktree_request_info_retry_mutex_key; + +// condition vars +extern toku_instr_key *result_state_cond_key; +extern toku_instr_key *bjm_jobs_wait_key; +extern toku_instr_key *cachetable_p_refcount_wait_key; +extern toku_instr_key *cachetable_m_flow_control_cond_key; +extern toku_instr_key *cachetable_m_ev_thread_cond_key; +extern toku_instr_key *bfs_cond_key; +extern toku_instr_key *result_output_condition_key; +extern toku_instr_key *manager_m_escalator_done_key; +extern toku_instr_key *lock_request_m_wait_cond_key; +extern toku_instr_key *queue_result_cond_key; +extern toku_instr_key *ws_worker_wait_key; +extern toku_instr_key *rwlock_wait_read_key; +extern toku_instr_key *rwlock_wait_write_key; +extern toku_instr_key *rwlock_cond_key; +extern toku_instr_key *tp_thread_wait_key; +extern toku_instr_key *tp_pool_wait_free_key; +extern toku_instr_key *frwlock_m_wait_read_key; +extern toku_instr_key *kibbutz_k_cond_key; +extern toku_instr_key *minicron_p_condvar_key; +extern toku_instr_key *locktree_request_info_retry_cv_key; + +// rwlocks +extern toku_instr_key *multi_operation_lock_key; +extern toku_instr_key *low_priority_multi_operation_lock_key; +extern toku_instr_key *cachetable_m_list_lock_key; +extern toku_instr_key *cachetable_m_pending_lock_expensive_key; +extern toku_instr_key *cachetable_m_pending_lock_cheap_key; +extern toku_instr_key *cachetable_m_lock_key; +extern toku_instr_key *result_i_open_dbs_rwlock_key; +extern toku_instr_key *checkpoint_safe_rwlock_key; +extern toku_instr_key *cachetable_value_key; +extern toku_instr_key *safe_file_size_lock_rwlock_key; +extern toku_instr_key *cachetable_disk_nb_rwlock_key; diff --git a/storage/tokudb/PerconaFT/portability/toku_os.h b/storage/tokudb/PerconaFT/portability/toku_os.h index 3a0e7376..d7cfcfef 100644 --- a/storage/tokudb/PerconaFT/portability/toku_os.h +++ b/storage/tokudb/PerconaFT/portability/toku_os.h @@ -116,12 +116,10 @@ int toku_fsync_dir_by_name_without_accounting(const char *dir_name); // *free_size is set to the bytes of free space in the file system // *total_size is set to the total bytes in the file system // Return 0 on success, otherwise an error number -int toku_get_filesystem_sizes(const char *path, uint64_t *avail_size, uint64_t *free_size, uint64_t *total_size); - -// Portable linux 'stat' -int toku_stat(const char *name, toku_struct_stat *statbuf) __attribute__((__visibility__("default"))); -// Portable linux 'fstat' -int toku_fstat(int fd, toku_struct_stat *statbuf) __attribute__((__visibility__("default"))); +int toku_get_filesystem_sizes(const char *path, + uint64_t *avail_size, + uint64_t *free_size, + uint64_t *total_size); // Portable linux 'dup2' int toku_dup2(int fd, int fd2) __attribute__((__visibility__("default"))); diff --git a/storage/tokudb/PerconaFT/portability/toku_portability.h b/storage/tokudb/PerconaFT/portability/toku_portability.h index 28ea8014..1096467a 100644 --- a/storage/tokudb/PerconaFT/portability/toku_portability.h +++ b/storage/tokudb/PerconaFT/portability/toku_portability.h @@ -125,6 +125,33 @@ typedef int64_t toku_off_t; #define UU(x) x __attribute__((__unused__)) +// Branch prediction macros. +// If supported by the compiler, will hint in inctruction caching for likely +// branching. Should only be used where there is a very good idea of the correct +// branch heuristics as determined by profiling. Mostly copied from InnoDB. +// Use: +// "if (FT_LIKELY(x))" where the chances of "x" evaluating true are higher +// "if (FT_UNLIKELY(x))" where the chances of "x" evaluating false are higher +#if defined(__GNUC__) && (__GNUC__ > 2) && !defined(__INTEL_COMPILER) + +// Tell the compiler that 'expr' probably evaluates to 'constant'. +#define FT_EXPECT(expr, constant) __builtin_expect(expr, constant) + +#else + +#warning "No FT branch prediction operations in use!" +#define FT_EXPECT(expr, constant) (expr) + +#endif // defined(__GNUC__) && (__GNUC__ > 2) && ! defined(__INTEL_COMPILER) + +// Tell the compiler that cond is likely to hold +#define FT_LIKELY(cond) FT_EXPECT(bool(cond), true) + +// Tell the compiler that cond is unlikely to hold +#define FT_UNLIKELY(cond) FT_EXPECT(bool(cond), false) + +#include "toku_instrumentation.h" + #if defined(__cplusplus) extern "C" { #endif @@ -240,28 +267,272 @@ void toku_os_full_write (int fd, const void *buf, size_t len) __attribute__((__v // os_write returns 0 on success, otherwise an errno. ssize_t toku_os_pwrite (int fd, const void *buf, size_t len, toku_off_t off) __attribute__((__visibility__("default"))); -int toku_os_write (int fd, const void *buf, size_t len) __attribute__((__visibility__("default"))); +int toku_os_write(int fd, const void *buf, size_t len) + __attribute__((__visibility__("default"))); // wrappers around file system calls -FILE * toku_os_fdopen(int fildes, const char *mode); -FILE * toku_os_fopen(const char *filename, const char *mode); -int toku_os_open(const char *path, int oflag, int mode); -int toku_os_open_direct(const char *path, int oflag, int mode); -int toku_os_close(int fd); -int toku_os_fclose(FILE * stream); -int toku_os_rename(const char *old_name, const char *new_name); -int toku_os_unlink(const char *path); -ssize_t toku_os_read(int fd, void *buf, size_t count); -ssize_t toku_os_pread(int fd, void *buf, size_t count, off_t offset); void toku_os_recursive_delete(const char *path); +TOKU_FILE *toku_os_fdopen_with_source_location(int fildes, + const char *mode, + const char *filename, + const toku_instr_key &instr_key, + const char *src_file, + uint src_line); +#define toku_os_fdopen(FD, M, FN, K) \ + toku_os_fdopen_with_source_location(FD, M, FN, K, __FILE__, __LINE__) + +TOKU_FILE *toku_os_fopen_with_source_location(const char *filename, + const char *mode, + const toku_instr_key &instr_key, + const char *src_file, + uint src_line); +#define toku_os_fopen(F, M, K) \ + toku_os_fopen_with_source_location(F, M, K, __FILE__, __LINE__) + +int toku_os_open_with_source_location(const char *path, + int oflag, + int mode, + const toku_instr_key &instr_key, + const char *src_file, + uint src_line); +#define toku_os_open(FD, F, M, K) \ + toku_os_open_with_source_location(FD, F, M, K, __FILE__, __LINE__) + +int toku_os_open_direct(const char *path, + int oflag, + int mode, + const toku_instr_key &instr_key); + +int toku_os_delete_with_source_location(const char *name, + const char *src_file, + uint src_line); +#define toku_os_delete(FN) \ + toku_os_delete_with_source_location(FN, __FILE__, __LINE__) + +int toku_os_rename_with_source_location(const char *old_name, + const char *new_name, + const char *src_file, + uint src_line); +#define toku_os_rename(old_name, new_name) \ + toku_os_rename_with_source_location(old_name, new_name, __FILE__, __LINE__) + +void toku_os_full_write_with_source_location(int fd, + const void *buf, + size_t len, + const char *src_file, + uint src_line); +#define toku_os_full_write(FD, B, L) \ + toku_os_full_write_with_source_location(FD, B, L, __FILE__, __LINE__) + +int toku_os_write_with_source_location(int fd, + const void *buf, + size_t len, + const char *src_file, + uint src_line); +#define toku_os_write(FD, B, L) \ + toku_os_write_with_source_location(FD, B, L, __FILE__, __LINE__) + +void toku_os_full_pwrite_with_source_location(int fd, + const void *buf, + size_t len, + toku_off_t off, + const char *src_file, + uint src_line); +#define toku_os_full_pwrite(FD, B, L, O) \ + toku_os_full_pwrite_with_source_location(FD, B, L, O, __FILE__, __LINE__) + +ssize_t toku_os_pwrite_with_source_location(int fd, + const void *buf, + size_t len, + toku_off_t off, + const char *src_file, + uint src_line); + +#define toku_os_pwrite(FD, B, L, O) \ + toku_os_pwrite_with_source_location(FD, B, L, O, __FILE__, __LINE__) + +int toku_os_fwrite_with_source_location(const void *ptr, + size_t size, + size_t nmemb, + TOKU_FILE *stream, + const char *src_file, + uint src_line); + +#define toku_os_fwrite(P, S, N, FS) \ + toku_os_fwrite_with_source_location(P, S, N, FS, __FILE__, __LINE__) + +int toku_os_fread_with_source_location(void *ptr, + size_t size, + size_t nmemb, + TOKU_FILE *stream, + const char *src_file, + uint src_line); +#define toku_os_fread(P, S, N, FS) \ + toku_os_fread_with_source_location(P, S, N, FS, __FILE__, __LINE__) + +TOKU_FILE *toku_os_fopen_with_source_location(const char *filename, + const char *mode, + const toku_instr_key &instr_key, + const char *src_file, + uint src_line); + +int toku_os_fclose_with_source_location(TOKU_FILE *stream, + const char *src_file, + uint src_line); + +#define toku_os_fclose(FS) \ + toku_os_fclose_with_source_location(FS, __FILE__, __LINE__) + +int toku_os_close_with_source_location(int fd, + const char *src_file, + uint src_line); +#define toku_os_close(FD) \ + toku_os_close_with_source_location(FD, __FILE__, __LINE__) + +ssize_t toku_os_read_with_source_location(int fd, + void *buf, + size_t count, + const char *src_file, + uint src_line); + +#define toku_os_read(FD, B, C) \ + toku_os_read_with_source_location(FD, B, C, __FILE__, __LINE__); + +ssize_t inline_toku_os_pread_with_source_location(int fd, + void *buf, + size_t count, + off_t offset, + const char *src_file, + uint src_line); +#define toku_os_pread(FD, B, C, O) \ + inline_toku_os_pread_with_source_location(FD, B, C, O, __FILE__, __LINE__); + +void file_fsync_internal_with_source_location(int fd, + const char *src_file, + uint src_line); + +#define file_fsync_internal(FD) \ + file_fsync_internal_with_source_location(FD, __FILE__, __LINE__); + +int toku_os_get_file_size_with_source_location(int fildes, + int64_t *fsize, + const char *src_file, + uint src_line); + +#define toku_os_get_file_size(D, S) \ + toku_os_get_file_size_with_source_location(D, S, __FILE__, __LINE__) + +// TODO: should this prototype be moved to toku_os.h? +int toku_stat_with_source_location(const char *name, + toku_struct_stat *buf, + const toku_instr_key &instr_key, + const char *src_file, + uint src_line) + __attribute__((__visibility__("default"))); + +#define toku_stat(N, B, K) \ + toku_stat_with_source_location(N, B, K, __FILE__, __LINE__) + +int toku_os_fstat_with_source_location(int fd, + toku_struct_stat *buf, + const char *src_file, + uint src_line) + __attribute__((__visibility__("default"))); + +#define toku_os_fstat(FD, B) \ + toku_os_fstat_with_source_location(FD, B, __FILE__, __LINE__) + +#ifdef HAVE_PSI_FILE_INTERFACE2 +int inline_toku_os_close(int fd, const char *src_file, uint src_line); +int inline_toku_os_fclose(TOKU_FILE *stream, + const char *src_file, + uint src_line); +ssize_t inline_toku_os_read(int fd, + void *buf, + size_t count, + const char *src_file, + uint src_line); +ssize_t inline_toku_os_pread(int fd, + void *buf, + size_t count, + off_t offset, + const char *src_file, + uint src_line); +int inline_toku_os_fwrite(const void *ptr, + size_t size, + size_t nmemb, + TOKU_FILE *stream, + const char *src_file, + uint src_line); +int inline_toku_os_fread(void *ptr, + size_t size, + size_t nmemb, + TOKU_FILE *stream, + const char *src_file, + uint src_line); +int inline_toku_os_write(int fd, + const void *buf, + size_t len, + const char *src_file, + uint src_line); +ssize_t inline_toku_os_pwrite(int fd, + const void *buf, + size_t len, + toku_off_t off, + const char *src_file, + uint src_line); +void inline_toku_os_full_write(int fd, + const void *buf, + size_t len, + const char *src_file, + uint src_line); +void inline_toku_os_full_pwrite(int fd, + const void *buf, + size_t len, + toku_off_t off, + const char *src_file, + uint src_line); +int inline_toku_os_delete(const char *name, + const char *srv_file, + uint src_line); +//#else +int inline_toku_os_close(int fd); +int inline_toku_os_fclose(TOKU_FILE *stream); +ssize_t inline_toku_os_read(int fd, void *buf, size_t count); +ssize_t inline_toku_os_pread(int fd, void *buf, size_t count, off_t offset); +int inline_toku_os_fwrite(const void *ptr, + size_t size, + size_t nmemb, + TOKU_FILE *stream); +int inline_toku_os_fread(void *ptr, + size_t size, + size_t nmemb, + TOKU_FILE *stream); +int inline_toku_os_write(int fd, const void *buf, size_t len); +ssize_t inline_toku_os_pwrite(int fd, + const void *buf, + size_t len, + toku_off_t off); +void inline_toku_os_full_write(int fd, const void *buf, size_t len); +void inline_toku_os_full_pwrite(int fd, + const void *buf, + size_t len, + toku_off_t off); +int inline_toku_os_delete(const char *name); +#endif + // wrapper around fsync -void toku_file_fsync_without_accounting(int fd); void toku_file_fsync(int fd); int toku_fsync_directory(const char *fname); +void toku_file_fsync_without_accounting(int fd); // get the number of fsync calls and the fsync times (total) -void toku_get_fsync_times(uint64_t *fsync_count, uint64_t *fsync_time, uint64_t *long_fsync_threshold, uint64_t *long_fsync_count, uint64_t *long_fsync_time); +void toku_get_fsync_times(uint64_t *fsync_count, + uint64_t *fsync_time, + uint64_t *long_fsync_threshold, + uint64_t *long_fsync_count, + uint64_t *long_fsync_time); void toku_set_func_fsync (int (*fsync_function)(int)); void toku_set_func_pwrite (ssize_t (*)(int, const void *, size_t, toku_off_t)); @@ -271,9 +542,11 @@ void toku_set_func_full_write (ssize_t (*)(int, const void *, size_t)); void toku_set_func_fdopen (FILE * (*)(int, const char *)); void toku_set_func_fopen (FILE * (*)(const char *, const char *)); void toku_set_func_open (int (*)(const char *, int, int)); -void toku_set_func_fclose(int (*)(FILE*)); +void toku_set_func_fclose(int (*)(FILE *)); void toku_set_func_read(ssize_t (*)(int, void *, size_t)); -void toku_set_func_pread (ssize_t (*)(int, void *, size_t, off_t)); +void toku_set_func_pread(ssize_t (*)(int, void *, size_t, off_t)); +void toku_set_func_fwrite( + size_t (*fwrite_fun)(const void *, size_t, size_t, FILE *)); int toku_portability_init(void); void toku_portability_destroy(void); @@ -283,28 +556,3 @@ void toku_portability_destroy(void); static inline uint64_t roundup_to_multiple(uint64_t alignment, uint64_t v) { return (v + alignment - 1) & ~(alignment - 1); } - -// Branch prediction macros. -// If supported by the compiler, will hint in inctruction caching for likely -// branching. Should only be used where there is a very good idea of the correct -// branch heuristics as determined by profiling. Mostly copied from InnoDB. -// Use: -// "if (FT_LIKELY(x))" where the chances of "x" evaluating true are higher -// "if (FT_UNLIKELY(x))" where the chances of "x" evaluating false are higher -#if defined(__GNUC__) && (__GNUC__ > 2) && ! defined(__INTEL_COMPILER) - -// Tell the compiler that 'expr' probably evaluates to 'constant'. -#define FT_EXPECT(expr,constant) __builtin_expect(expr, constant) - -#else - -#warning "No FT branch prediction operations in use!" -#define FT_EXPECT(expr,constant) (expr) - -#endif // defined(__GNUC__) && (__GNUC__ > 2) && ! defined(__INTEL_COMPILER) - -// Tell the compiler that cond is likely to hold -#define FT_LIKELY(cond) FT_EXPECT(cond, 1) - -// Tell the compiler that cond is unlikely to hold -#define FT_UNLIKELY(cond) FT_EXPECT(cond, 0) diff --git a/storage/tokudb/PerconaFT/portability/toku_pthread.h b/storage/tokudb/PerconaFT/portability/toku_pthread.h index 84c27736..44de0124 100644 --- a/storage/tokudb/PerconaFT/portability/toku_pthread.h +++ b/storage/tokudb/PerconaFT/portability/toku_pthread.h @@ -42,31 +42,62 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include #include +#include "toku_portability.h" #include "toku_assert.h" +// TODO: some things moved toku_instrumentation.h, not necessarily the best +// place typedef pthread_attr_t toku_pthread_attr_t; typedef pthread_t toku_pthread_t; -typedef pthread_mutexattr_t toku_pthread_mutexattr_t; typedef pthread_mutex_t toku_pthread_mutex_t; typedef pthread_condattr_t toku_pthread_condattr_t; typedef pthread_cond_t toku_pthread_cond_t; -typedef pthread_rwlock_t toku_pthread_rwlock_t; -typedef pthread_rwlockattr_t toku_pthread_rwlockattr_t; +typedef pthread_rwlockattr_t toku_pthread_rwlockattr_t; typedef pthread_key_t toku_pthread_key_t; typedef struct timespec toku_timespec_t; -#ifndef TOKU_PTHREAD_DEBUG -# define TOKU_PTHREAD_DEBUG 0 -#endif +// TODO: break this include loop +#include +typedef pthread_mutexattr_t toku_pthread_mutexattr_t; -typedef struct toku_mutex { +struct toku_mutex_t { pthread_mutex_t pmutex; + struct PSI_mutex + *psi_mutex; /* The performance schema instrumentation hook */ #if TOKU_PTHREAD_DEBUG - pthread_t owner; // = pthread_self(); // for debugging + pthread_t owner; // = pthread_self(); // for debugging bool locked; bool valid; + pfs_key_t instr_key_id; +#endif +}; + +struct toku_cond_t { + pthread_cond_t pcond; + struct PSI_cond *psi_cond; +#if TOKU_PTHREAD_DEBUG + pfs_key_t instr_key_id; +#endif +}; + +#ifdef TOKU_PTHREAD_DEBUG +#define TOKU_COND_INITIALIZER \ + { \ + .pcond = PTHREAD_COND_INITIALIZER, .psi_cond = nullptr, \ + .instr_key_id = 0 \ + } +#else +#define TOKU_COND_INITIALIZER \ + { .pcond = PTHREAD_COND_INITIALIZER, .psi_cond = nullptr } #endif -} toku_mutex_t; + +struct toku_pthread_rwlock_t { + pthread_rwlock_t rwlock; + struct PSI_rwlock *psi_rwlock; +#if TOKU_PTHREAD_DEBUG + pfs_key_t instr_key_id; +#endif +}; typedef struct toku_mutex_aligned { toku_mutex_t aligned_mutex __attribute__((__aligned__(64))); @@ -83,45 +114,68 @@ typedef struct toku_mutex_aligned { // In general it will be a lot of busy work to make this codebase compile // cleanly with -Wmissing-field-initializers -# define ZERO_MUTEX_INITIALIZER {} +#define ZERO_MUTEX_INITIALIZER \ + {} #if TOKU_PTHREAD_DEBUG -# define TOKU_MUTEX_INITIALIZER { .pmutex = PTHREAD_MUTEX_INITIALIZER, .owner = 0, .locked = false, .valid = true } +#define TOKU_MUTEX_INITIALIZER \ + { \ + .pmutex = PTHREAD_MUTEX_INITIALIZER, .psi_mutex = nullptr, .owner = 0, \ + .locked = false, .valid = true, .instr_key_id = 0 \ + } #else -# define TOKU_MUTEX_INITIALIZER { .pmutex = PTHREAD_MUTEX_INITIALIZER } +#define TOKU_MUTEX_INITIALIZER \ + { .pmutex = PTHREAD_MUTEX_INITIALIZER, .psi_mutex = nullptr } #endif // Darwin doesn't provide adaptive mutexes #if defined(__APPLE__) -# define TOKU_MUTEX_ADAPTIVE PTHREAD_MUTEX_DEFAULT -# if TOKU_PTHREAD_DEBUG -# define TOKU_ADAPTIVE_MUTEX_INITIALIZER { .pmutex = PTHREAD_MUTEX_INITIALIZER, .owner = 0, .locked = false, .valid = true } -# else -# define TOKU_ADAPTIVE_MUTEX_INITIALIZER { .pmutex = PTHREAD_MUTEX_INITIALIZER } -# endif -#else // __FreeBSD__, __linux__, at least -# define TOKU_MUTEX_ADAPTIVE PTHREAD_MUTEX_ADAPTIVE_NP -# if TOKU_PTHREAD_DEBUG -# define TOKU_ADAPTIVE_MUTEX_INITIALIZER { .pmutex = PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP, .owner = 0, .locked = false, .valid = true } -# else -# define TOKU_ADAPTIVE_MUTEX_INITIALIZER { .pmutex = PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP } -# endif +#define TOKU_MUTEX_ADAPTIVE PTHREAD_MUTEX_DEFAULT +#if TOKU_PTHREAD_DEBUG +#define TOKU_ADAPTIVE_MUTEX_INITIALIZER \ + { \ + .pmutex = PTHREAD_MUTEX_INITIALIZER, .psi_mutex = nullptr, .owner = 0, \ + .locked = false, .valid = true, .instr_key_id = 0 \ + } +#else +#define TOKU_ADAPTIVE_MUTEX_INITIALIZER \ + { .pmutex = PTHREAD_MUTEX_INITIALIZER, .psi_mutex = nullptr } #endif - -static inline void -toku_mutex_init(toku_mutex_t *mutex, const toku_pthread_mutexattr_t *attr) { - int r = pthread_mutex_init(&mutex->pmutex, attr); - assert_zero(r); +#else // __FreeBSD__, __linux__, at least +#define TOKU_MUTEX_ADAPTIVE PTHREAD_MUTEX_ADAPTIVE_NP #if TOKU_PTHREAD_DEBUG - mutex->locked = false; - invariant(!mutex->valid); - mutex->valid = true; - mutex->owner = 0; +#define TOKU_ADAPTIVE_MUTEX_INITIALIZER \ + { \ + .pmutex = PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP, .psi_mutex = nullptr, \ + .owner = 0, .locked = false, .valid = true, .instr_key_id = 0 \ + } +#else +#define TOKU_ADAPTIVE_MUTEX_INITIALIZER \ + { .pmutex = PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP, .psi_mutex = nullptr } +#endif #endif -} -static inline void -toku_mutexattr_init(toku_pthread_mutexattr_t *attr) { +// Different OSes implement mutexes as different amounts of nested structs. +// C++ will fill out all missing values with zeroes if you provide at least one +// zero, but it needs the right amount of nesting. +#if defined(__FreeBSD__) +#define ZERO_COND_INITIALIZER \ + { 0 } +#elif defined(__APPLE__) +#define ZERO_COND_INITIALIZER \ + { \ + { 0 } \ + } +#else // __linux__, at least +#define ZERO_COND_INITIALIZER \ + { \ + { \ + { 0 } \ + } \ + } +#endif + +static inline void toku_mutexattr_init(toku_pthread_mutexattr_t *attr) { int r = pthread_mutexattr_init(attr); assert_zero(r); } @@ -138,61 +192,8 @@ toku_mutexattr_destroy(toku_pthread_mutexattr_t *attr) { assert_zero(r); } -static inline void -toku_mutex_destroy(toku_mutex_t *mutex) { #if TOKU_PTHREAD_DEBUG - invariant(mutex->valid); - mutex->valid = false; - invariant(!mutex->locked); -#endif - int r = pthread_mutex_destroy(&mutex->pmutex); - assert_zero(r); -} - -static inline void -toku_mutex_lock(toku_mutex_t *mutex) { - int r = pthread_mutex_lock(&mutex->pmutex); - assert_zero(r); -#if TOKU_PTHREAD_DEBUG - invariant(mutex->valid); - invariant(!mutex->locked); - invariant(mutex->owner == 0); - mutex->locked = true; - mutex->owner = pthread_self(); -#endif -} - -static inline int -toku_mutex_trylock(toku_mutex_t *mutex) { - int r = pthread_mutex_trylock(&mutex->pmutex); -#if TOKU_PTHREAD_DEBUG - if (r == 0) { - invariant(mutex->valid); - invariant(!mutex->locked); - invariant(mutex->owner == 0); - mutex->locked = true; - mutex->owner = pthread_self(); - } -#endif - return r; -} - -static inline void -toku_mutex_unlock(toku_mutex_t *mutex) { -#if TOKU_PTHREAD_DEBUG - invariant(mutex->owner == pthread_self()); - invariant(mutex->valid); - invariant(mutex->locked); - mutex->locked = false; - mutex->owner = 0; -#endif - int r = pthread_mutex_unlock(&mutex->pmutex); - assert_zero(r); -} - -#if TOKU_PTHREAD_DEBUG -static inline void -toku_mutex_assert_locked(const toku_mutex_t *mutex) { +static inline void toku_mutex_assert_locked(const toku_mutex_t *mutex) { invariant(mutex->locked); invariant(mutex->owner == pthread_self()); } @@ -217,40 +218,123 @@ toku_mutex_assert_unlocked(toku_mutex_t *mutex) { invariant(!mutex->locked); } #else -static inline void -toku_mutex_assert_unlocked(toku_mutex_t *mutex __attribute__((unused))) { +static inline void toku_mutex_assert_unlocked(toku_mutex_t *mutex + __attribute__((unused))) {} +#endif + +#define toku_mutex_lock(M) \ + toku_mutex_lock_with_source_location(M, __FILE__, __LINE__) + +static inline void toku_cond_init(toku_cond_t *cond, + const toku_pthread_condattr_t *attr) { + int r = pthread_cond_init(&cond->pcond, attr); + assert_zero(r); +} + +#define toku_mutex_trylock(M) \ + toku_mutex_trylock_with_source_location(M, __FILE__, __LINE__) + +inline void toku_mutex_unlock(toku_mutex_t *mutex) { +#if TOKU_PTHREAD_DEBUG + invariant(mutex->owner == pthread_self()); + invariant(mutex->valid); + invariant(mutex->locked); + mutex->locked = false; + mutex->owner = 0; +#endif + toku_instr_mutex_unlock(mutex->psi_mutex); + int r = pthread_mutex_unlock(&mutex->pmutex); + assert_zero(r); } + +inline void toku_mutex_lock_with_source_location(toku_mutex_t *mutex, + const char *src_file, + int src_line) { + + toku_mutex_instrumentation mutex_instr; + toku_instr_mutex_lock_start(mutex_instr, *mutex, src_file, src_line); + + const int r = pthread_mutex_lock(&mutex->pmutex); + toku_instr_mutex_lock_end(mutex_instr, r); + + assert_zero(r); +#if TOKU_PTHREAD_DEBUG + invariant(mutex->valid); + invariant(!mutex->locked); + invariant(mutex->owner == 0); + mutex->locked = true; + mutex->owner = pthread_self(); #endif +} -typedef struct toku_cond { - pthread_cond_t pcond; -} toku_cond_t; +inline int toku_mutex_trylock_with_source_location(toku_mutex_t *mutex, + const char *src_file, + int src_line) { -// Same considerations as for ZERO_MUTEX_INITIALIZER apply -#define ZERO_COND_INITIALIZER {} + toku_mutex_instrumentation mutex_instr; + toku_instr_mutex_trylock_start(mutex_instr, *mutex, src_file, src_line); -#define TOKU_COND_INITIALIZER {PTHREAD_COND_INITIALIZER} + const int r = pthread_mutex_lock(&mutex->pmutex); + toku_instr_mutex_lock_end(mutex_instr, r); -static inline void -toku_cond_init(toku_cond_t *cond, const toku_pthread_condattr_t *attr) { +#if TOKU_PTHREAD_DEBUG + if (r == 0) { + invariant(mutex->valid); + invariant(!mutex->locked); + invariant(mutex->owner == 0); + mutex->locked = true; + mutex->owner = pthread_self(); + } +#endif + return r; +} + +#define toku_cond_wait(C, M) \ + toku_cond_wait_with_source_location(C, M, __FILE__, __LINE__) + +#define toku_cond_timedwait(C, M, W) \ + toku_cond_timedwait_with_source_location(C, M, W, __FILE__, __LINE__) + +inline void toku_cond_init(const toku_instr_key &key, + toku_cond_t *cond, + const pthread_condattr_t *attr) { + toku_instr_cond_init(key, *cond); int r = pthread_cond_init(&cond->pcond, attr); assert_zero(r); } -static inline void -toku_cond_destroy(toku_cond_t *cond) { +inline void toku_cond_destroy(toku_cond_t *cond) { + toku_instr_cond_destroy(cond->psi_cond); int r = pthread_cond_destroy(&cond->pcond); assert_zero(r); } -static inline void -toku_cond_wait(toku_cond_t *cond, toku_mutex_t *mutex) { +inline void toku_cond_wait_with_source_location(toku_cond_t *cond, + toku_mutex_t *mutex, + const char *src_file, + uint src_line) { + #if TOKU_PTHREAD_DEBUG invariant(mutex->locked); mutex->locked = false; mutex->owner = 0; #endif - int r = pthread_cond_wait(&cond->pcond, &mutex->pmutex); + + /* Instrumentation start */ + toku_cond_instrumentation cond_instr; + toku_instr_cond_wait_start(cond_instr, + toku_instr_cond_op::cond_wait, + *cond, + *mutex, + src_file, + src_line); + + /* Instrumented code */ + const int r = pthread_cond_wait(&cond->pcond, &mutex->pmutex); + + /* Instrumentation end */ + toku_instr_cond_wait_end(cond_instr, r); + assert_zero(r); #if TOKU_PTHREAD_DEBUG invariant(!mutex->locked); @@ -259,14 +343,33 @@ toku_cond_wait(toku_cond_t *cond, toku_mutex_t *mutex) { #endif } -static inline int -toku_cond_timedwait(toku_cond_t *cond, toku_mutex_t *mutex, toku_timespec_t *wakeup_at) { +inline int toku_cond_timedwait_with_source_location(toku_cond_t *cond, + toku_mutex_t *mutex, + toku_timespec_t *wakeup_at, + const char *src_file, + uint src_line) { #if TOKU_PTHREAD_DEBUG invariant(mutex->locked); mutex->locked = false; mutex->owner = 0; #endif - int r = pthread_cond_timedwait(&cond->pcond, &mutex->pmutex, wakeup_at); + + /* Instrumentation start */ + toku_cond_instrumentation cond_instr; + toku_instr_cond_wait_start(cond_instr, + toku_instr_cond_op::cond_timedwait, + *cond, + *mutex, + src_file, + src_line); + + /* Instrumented code */ + const int r = pthread_cond_timedwait( + &cond->pcond, &mutex->pmutex, wakeup_at); + + /* Instrumentation end */ + toku_instr_cond_wait_end(cond_instr, r); + #if TOKU_PTHREAD_DEBUG invariant(!mutex->locked); mutex->locked = true; @@ -275,69 +378,116 @@ toku_cond_timedwait(toku_cond_t *cond, toku_mutex_t *mutex, toku_timespec_t *wak return r; } -static inline void -toku_cond_signal(toku_cond_t *cond) { - int r = pthread_cond_signal(&cond->pcond); +inline void toku_cond_signal(toku_cond_t *cond) { + toku_instr_cond_signal(*cond); + const int r = pthread_cond_signal(&cond->pcond); assert_zero(r); } -static inline void -toku_cond_broadcast(toku_cond_t *cond) { - int r =pthread_cond_broadcast(&cond->pcond); +inline void toku_cond_broadcast(toku_cond_t *cond) { + toku_instr_cond_broadcast(*cond); + const int r = pthread_cond_broadcast(&cond->pcond); assert_zero(r); } -int -toku_pthread_yield(void) __attribute__((__visibility__("default"))); - -static inline toku_pthread_t -toku_pthread_self(void) { - return pthread_self(); +inline void toku_mutex_init(const toku_instr_key &key, + toku_mutex_t *mutex, + const toku_pthread_mutexattr_t *attr) { +#if TOKU_PTHREAD_DEBUG + mutex->valid = true; +#endif + toku_instr_mutex_init(key, *mutex); + const int r = pthread_mutex_init(&mutex->pmutex, attr); + assert_zero(r); +#if TOKU_PTHREAD_DEBUG + mutex->locked = false; + invariant(mutex->valid); + mutex->valid = true; + mutex->owner = 0; +#endif } -static inline void -toku_pthread_rwlock_init(toku_pthread_rwlock_t *__restrict rwlock, const toku_pthread_rwlockattr_t *__restrict attr) { - int r = pthread_rwlock_init(rwlock, attr); +inline void toku_mutex_destroy(toku_mutex_t *mutex) { +#if TOKU_PTHREAD_DEBUG + invariant(mutex->valid); + mutex->valid = false; + invariant(!mutex->locked); +#endif + toku_instr_mutex_destroy(mutex->psi_mutex); + int r = pthread_mutex_destroy(&mutex->pmutex); assert_zero(r); } -static inline void -toku_pthread_rwlock_destroy(toku_pthread_rwlock_t *rwlock) { - int r = pthread_rwlock_destroy(rwlock); +#define toku_pthread_rwlock_rdlock(RW) \ + toku_pthread_rwlock_rdlock_with_source_location(RW, __FILE__, __LINE__) + +#define toku_pthread_rwlock_wrlock(RW) \ + toku_pthread_rwlock_wrlock_with_source_location(RW, __FILE__, __LINE__) + +inline void toku_pthread_rwlock_init( + const toku_instr_key &key, + toku_pthread_rwlock_t *__restrict rwlock, + const toku_pthread_rwlockattr_t *__restrict attr) { + toku_instr_rwlock_init(key, *rwlock); + int r = pthread_rwlock_init(&rwlock->rwlock, attr); assert_zero(r); } -static inline void -toku_pthread_rwlock_rdlock(toku_pthread_rwlock_t *rwlock) { - int r = pthread_rwlock_rdlock(rwlock); +inline void toku_pthread_rwlock_destroy(toku_pthread_rwlock_t *rwlock) { + toku_instr_rwlock_destroy(rwlock->psi_rwlock); + int r = pthread_rwlock_destroy(&rwlock->rwlock); assert_zero(r); } -static inline void -toku_pthread_rwlock_rdunlock(toku_pthread_rwlock_t *rwlock) { - int r = pthread_rwlock_unlock(rwlock); +inline void toku_pthread_rwlock_rdlock_with_source_location( + toku_pthread_rwlock_t *rwlock, + const char *src_file, + uint src_line) { + + /* Instrumentation start */ + toku_rwlock_instrumentation rwlock_instr; + toku_instr_rwlock_rdlock_wait_start( + rwlock_instr, *rwlock, src_file, src_line); + /* Instrumented code */ + const int r = pthread_rwlock_rdlock(&rwlock->rwlock); + + /* Instrumentation end */ + toku_instr_rwlock_rdlock_wait_end(rwlock_instr, r); + assert_zero(r); } -static inline void -toku_pthread_rwlock_wrlock(toku_pthread_rwlock_t *rwlock) { - int r = pthread_rwlock_wrlock(rwlock); +inline void toku_pthread_rwlock_wrlock_with_source_location( + toku_pthread_rwlock_t *rwlock, + const char *src_file, + uint src_line) { + + /* Instrumentation start */ + toku_rwlock_instrumentation rwlock_instr; + toku_instr_rwlock_wrlock_wait_start( + rwlock_instr, *rwlock, src_file, src_line); + /* Instrumented code */ + const int r = pthread_rwlock_wrlock(&rwlock->rwlock); + + /* Instrumentation end */ + toku_instr_rwlock_wrlock_wait_end(rwlock_instr, r); + assert_zero(r); } -static inline void -toku_pthread_rwlock_wrunlock(toku_pthread_rwlock_t *rwlock) { - int r = pthread_rwlock_unlock(rwlock); +inline void toku_pthread_rwlock_rdunlock(toku_pthread_rwlock_t *rwlock) { + toku_instr_rwlock_unlock(*rwlock); + const int r = pthread_rwlock_unlock(&rwlock->rwlock); assert_zero(r); } -static inline int -toku_pthread_create(toku_pthread_t *thread, const toku_pthread_attr_t *attr, void *(*start_function)(void *), void *arg) { - return pthread_create(thread, attr, start_function, arg); +inline void toku_pthread_rwlock_wrunlock(toku_pthread_rwlock_t *rwlock) { + toku_instr_rwlock_unlock(*rwlock); + const int r = pthread_rwlock_unlock(&rwlock->rwlock); + assert_zero(r); } -static inline int -toku_pthread_join(toku_pthread_t thread, void **value_ptr) { +static inline int toku_pthread_join(toku_pthread_t thread, void **value_ptr) { return pthread_join(thread, value_ptr); } @@ -361,7 +511,15 @@ toku_pthread_getspecific(toku_pthread_key_t key) { return pthread_getspecific(key); } -static inline int -toku_pthread_setspecific(toku_pthread_key_t key, void *data) { +static inline int toku_pthread_setspecific(toku_pthread_key_t key, void *data) { return pthread_setspecific(key, data); } + +int toku_pthread_yield(void) __attribute__((__visibility__("default"))); + +static inline toku_pthread_t toku_pthread_self(void) { return pthread_self(); } + +static inline void *toku_pthread_done(void *exit_value) { + toku_instr_delete_current_thread(); + pthread_exit(exit_value); +} diff --git a/storage/tokudb/PerconaFT/src/indexer-undo-do.cc b/storage/tokudb/PerconaFT/src/indexer-undo-do.cc index 4c7f5336..cc864027 100644 --- a/storage/tokudb/PerconaFT/src/indexer-undo-do.cc +++ b/storage/tokudb/PerconaFT/src/indexer-undo-do.cc @@ -571,6 +571,7 @@ indexer_ft_delete_committed(DB_INDEXER *indexer, DB *hotdb, DBT *hotkey, XIDS xi oldest_referenced_xid_estimate, true); toku_ft_send_delete(db_struct_i(hotdb)->ft_handle, hotkey, xids, &gc_info); + toku_ft_adjust_logical_row_count(db_struct_i(hotdb)->ft_handle->ft, -1); } } return result; @@ -616,6 +617,7 @@ indexer_ft_insert_committed(DB_INDEXER *indexer, DB *hotdb, DBT *hotkey, DBT *ho oldest_referenced_xid_estimate, true); toku_ft_send_insert(db_struct_i(hotdb)->ft_handle, hotkey, hotval, xids, FT_INSERT, &gc_info); + toku_ft_adjust_logical_row_count(db_struct_i(hotdb)->ft_handle->ft, 1); } } return result; diff --git a/storage/tokudb/PerconaFT/src/indexer.cc b/storage/tokudb/PerconaFT/src/indexer.cc index b475b08b..044ffac9 100644 --- a/storage/tokudb/PerconaFT/src/indexer.cc +++ b/storage/tokudb/PerconaFT/src/indexer.cc @@ -253,16 +253,21 @@ toku_indexer_create_indexer(DB_ENV *env, indexer->set_error_callback = toku_indexer_set_error_callback; indexer->set_poll_function = toku_indexer_set_poll_function; indexer->build = build_index; - indexer->close = close_indexer; - indexer->abort = abort_indexer; - - toku_mutex_init(&indexer->i->indexer_lock, NULL); - toku_mutex_init(&indexer->i->indexer_estimate_lock, NULL); + indexer->close = close_indexer; + indexer->abort = abort_indexer; + + toku_mutex_init( + *indexer_i_indexer_lock_mutex_key, &indexer->i->indexer_lock, nullptr); + toku_mutex_init(*indexer_i_indexer_estimate_lock_mutex_key, + &indexer->i->indexer_estimate_lock, + nullptr); toku_init_dbt(&indexer->i->position_estimate); // - // create and close a dummy loader to get redirection going for the hot indexer - // This way, if the hot index aborts, but other transactions have references to the + // create and close a dummy loader to get redirection going for the hot + // indexer + // This way, if the hot index aborts, but other transactions have references + // to the // underlying FT, then those transactions can do dummy operations on the FT // while the DB gets redirected back to an empty dictionary // diff --git a/storage/tokudb/PerconaFT/src/tests/blocking-first-empty.cc b/storage/tokudb/PerconaFT/src/tests/blocking-first-empty.cc index d9d86525..3b53911e 100644 --- a/storage/tokudb/PerconaFT/src/tests/blocking-first-empty.cc +++ b/storage/tokudb/PerconaFT/src/tests/blocking-first-empty.cc @@ -99,12 +99,14 @@ static void *blocking_first_thread(void *arg) { static void run_test(DB_ENV *db_env, DB *db, int nthreads, uint64_t nrows, long sleeptime) { int r; toku_pthread_t tids[nthreads]; - struct blocking_first_args a = { db_env, db, nrows, sleeptime }; - for (int i = 0; i < nthreads-1; i++) { - r = toku_pthread_create(&tids[i], NULL, blocking_first_thread, &a); assert(r == 0); + struct blocking_first_args a = {db_env, db, nrows, sleeptime}; + for (int i = 0; i < nthreads - 1; i++) { + r = toku_pthread_create( + toku_uninstrumented, &tids[i], nullptr, blocking_first_thread, &a); + assert(r == 0); } blocking_first(db_env, db, nrows, sleeptime); - for (int i = 0; i < nthreads-1; i++) { + for (int i = 0; i < nthreads - 1; i++) { void *ret; r = toku_pthread_join(tids[i], &ret); assert(r == 0); } diff --git a/storage/tokudb/PerconaFT/src/tests/blocking-first.cc b/storage/tokudb/PerconaFT/src/tests/blocking-first.cc index 9f3f8f4e..c104eabd 100644 --- a/storage/tokudb/PerconaFT/src/tests/blocking-first.cc +++ b/storage/tokudb/PerconaFT/src/tests/blocking-first.cc @@ -116,12 +116,14 @@ static void *blocking_first_thread(void *arg) { static void run_test(DB_ENV *db_env, DB *db, int nthreads, uint64_t nrows, long sleeptime) { int r; toku_pthread_t tids[nthreads]; - struct blocking_first_args a = { db_env, db, nrows, sleeptime }; - for (int i = 0; i < nthreads-1; i++) { - r = toku_pthread_create(&tids[i], NULL, blocking_first_thread, &a); assert(r == 0); + struct blocking_first_args a = {db_env, db, nrows, sleeptime}; + for (int i = 0; i < nthreads - 1; i++) { + r = toku_pthread_create( + toku_uninstrumented, &tids[i], nullptr, blocking_first_thread, &a); + assert(r == 0); } blocking_first(db_env, db, nrows, sleeptime); - for (int i = 0; i < nthreads-1; i++) { + for (int i = 0; i < nthreads - 1; i++) { void *ret; r = toku_pthread_join(tids[i], &ret); assert(r == 0); } diff --git a/storage/tokudb/PerconaFT/src/tests/blocking-last.cc b/storage/tokudb/PerconaFT/src/tests/blocking-last.cc index a62d83eb..3a702e3f 100644 --- a/storage/tokudb/PerconaFT/src/tests/blocking-last.cc +++ b/storage/tokudb/PerconaFT/src/tests/blocking-last.cc @@ -116,12 +116,14 @@ static void *blocking_last_thread(void *arg) { static void run_test(DB_ENV *db_env, DB *db, int nthreads, uint64_t nrows, long sleeptime) { int r; toku_pthread_t tids[nthreads]; - struct blocking_last_args a = { db_env, db, nrows, sleeptime }; - for (int i = 0; i < nthreads-1; i++) { - r = toku_pthread_create(&tids[i], NULL, blocking_last_thread, &a); assert(r == 0); + struct blocking_last_args a = {db_env, db, nrows, sleeptime}; + for (int i = 0; i < nthreads - 1; i++) { + r = toku_pthread_create( + toku_uninstrumented, &tids[i], nullptr, blocking_last_thread, &a); + assert(r == 0); } blocking_last(db_env, db, nrows, sleeptime); - for (int i = 0; i < nthreads-1; i++) { + for (int i = 0; i < nthreads - 1; i++) { void *ret; r = toku_pthread_join(tids[i], &ret); assert(r == 0); } diff --git a/storage/tokudb/PerconaFT/src/tests/blocking-next-prev-deadlock.cc b/storage/tokudb/PerconaFT/src/tests/blocking-next-prev-deadlock.cc index bd5697ba..781708cc 100644 --- a/storage/tokudb/PerconaFT/src/tests/blocking-next-prev-deadlock.cc +++ b/storage/tokudb/PerconaFT/src/tests/blocking-next-prev-deadlock.cc @@ -181,12 +181,14 @@ static void *blocking_next_thread(void *arg) { static void run_test(DB_ENV *db_env, DB *db, int nthreads, uint64_t nrows, long sleeptime) { int r; toku_pthread_t tids[nthreads]; - struct blocking_next_args a = { db_env, db, nrows, sleeptime }; - for (int i = 0; i < nthreads-1; i++) { - r = toku_pthread_create(&tids[i], NULL, blocking_next_thread, &a); assert(r == 0); + struct blocking_next_args a = {db_env, db, nrows, sleeptime}; + for (int i = 0; i < nthreads - 1; i++) { + r = toku_pthread_create( + toku_uninstrumented, &tids[i], nullptr, blocking_next_thread, &a); + assert(r == 0); } blocking_prev(db_env, db, nrows, sleeptime); - for (int i = 0; i < nthreads-1; i++) { + for (int i = 0; i < nthreads - 1; i++) { void *ret; r = toku_pthread_join(tids[i], &ret); assert(r == 0); } diff --git a/storage/tokudb/PerconaFT/src/tests/blocking-next-prev.cc b/storage/tokudb/PerconaFT/src/tests/blocking-next-prev.cc index 729473bb..aa179e88 100644 --- a/storage/tokudb/PerconaFT/src/tests/blocking-next-prev.cc +++ b/storage/tokudb/PerconaFT/src/tests/blocking-next-prev.cc @@ -188,12 +188,14 @@ static void *blocking_next_thread(void *arg) { static void run_test(DB_ENV *db_env, DB *db, int nthreads, uint64_t nrows, long sleeptime) { int r; toku_pthread_t tids[nthreads]; - struct blocking_next_args a = { db_env, db, nrows, sleeptime }; - for (int i = 0; i < nthreads-1; i++) { - r = toku_pthread_create(&tids[i], NULL, blocking_next_thread, &a); assert(r == 0); + struct blocking_next_args a = {db_env, db, nrows, sleeptime}; + for (int i = 0; i < nthreads - 1; i++) { + r = toku_pthread_create( + toku_uninstrumented, &tids[i], nullptr, blocking_next_thread, &a); + assert(r == 0); } blocking_prev(db_env, db, nrows, sleeptime); - for (int i = 0; i < nthreads-1; i++) { + for (int i = 0; i < nthreads - 1; i++) { void *ret; r = toku_pthread_join(tids[i], &ret); assert(r == 0); } diff --git a/storage/tokudb/PerconaFT/src/tests/blocking-prelock-range.cc b/storage/tokudb/PerconaFT/src/tests/blocking-prelock-range.cc index 8821b39a..38875a2f 100644 --- a/storage/tokudb/PerconaFT/src/tests/blocking-prelock-range.cc +++ b/storage/tokudb/PerconaFT/src/tests/blocking-prelock-range.cc @@ -140,12 +140,17 @@ int test_main(int argc, char * const argv[]) { r = db->open(db, NULL, db_filename, NULL, DB_BTREE, DB_CREATE|DB_AUTO_COMMIT|DB_THREAD, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); assert(r == 0); toku_pthread_t tids[nthreads]; - struct blocking_range_lock_args a = { db_env, db, nrows, sleeptime }; - for (int i = 0; i < nthreads-1; i++) { - r = toku_pthread_create(&tids[i], NULL, blocking_range_lock_thread, &a); assert(r == 0); + struct blocking_range_lock_args a = {db_env, db, nrows, sleeptime}; + for (int i = 0; i < nthreads - 1; i++) { + r = toku_pthread_create(toku_uninstrumented, + &tids[i], + nullptr, + blocking_range_lock_thread, + &a); + assert(r == 0); } blocking_range_lock(db_env, db, nrows, sleeptime); - for (int i = 0; i < nthreads-1; i++) { + for (int i = 0; i < nthreads - 1; i++) { void *ret; r = toku_pthread_join(tids[i], &ret); assert(r == 0); } diff --git a/storage/tokudb/PerconaFT/src/tests/blocking-put-timeout.cc b/storage/tokudb/PerconaFT/src/tests/blocking-put-timeout.cc index a31e173f..bf4a8a24 100644 --- a/storage/tokudb/PerconaFT/src/tests/blocking-put-timeout.cc +++ b/storage/tokudb/PerconaFT/src/tests/blocking-put-timeout.cc @@ -57,8 +57,8 @@ struct test_seq { static void test_seq_init(struct test_seq *seq) { seq->state = 0; - toku_mutex_init(&seq->lock, NULL); - toku_cond_init(&seq->cv, NULL); + toku_mutex_init(toku_uninstrumented, &seq->lock, nullptr); + toku_cond_init(toku_uninstrumented, &seq->cv, nullptr); } static void test_seq_destroy(struct test_seq *seq) { @@ -172,13 +172,18 @@ int test_main(int argc, char * const argv[]) { r = db->open(db, NULL, db_filename, NULL, DB_BTREE, DB_CREATE|DB_AUTO_COMMIT|DB_THREAD, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); assert(r == 0); // run test - struct test_seq seq; ZERO_STRUCT(seq); test_seq_init(&seq); + struct test_seq seq; + ZERO_STRUCT(seq); + test_seq_init(&seq); toku_pthread_t t_a_id; - struct t_a_args t_a_args = { db_env, db, &seq }; - r = toku_pthread_create(&t_a_id, NULL, t_a_thread, &t_a_args); assert(r == 0); + struct t_a_args t_a_args = {db_env, db, &seq}; + r = toku_pthread_create( + toku_uninstrumented, &t_a_id, nullptr, t_a_thread, &t_a_args); + assert(r == 0); t_b(db_env, db, &seq); void *ret; - r = toku_pthread_join(t_a_id, &ret); assert(r == 0); + r = toku_pthread_join(t_a_id, &ret); + assert(r == 0); test_seq_destroy(&seq); // close env diff --git a/storage/tokudb/PerconaFT/src/tests/blocking-put-wakeup.cc b/storage/tokudb/PerconaFT/src/tests/blocking-put-wakeup.cc index 615cdb5d..dba7962d 100644 --- a/storage/tokudb/PerconaFT/src/tests/blocking-put-wakeup.cc +++ b/storage/tokudb/PerconaFT/src/tests/blocking-put-wakeup.cc @@ -58,8 +58,8 @@ struct test_seq { static void test_seq_init(struct test_seq *seq) { seq->state = 0; - toku_mutex_init(&seq->lock, NULL); - toku_cond_init(&seq->cv, NULL); + toku_mutex_init(toku_uninstrumented, &seq->lock, nullptr); + toku_cond_init(toku_uninstrumented, &seq->cv, nullptr); } static void test_seq_destroy(struct test_seq *seq) { @@ -167,13 +167,18 @@ int test_main(int argc, char * const argv[]) { r = db->open(db, NULL, db_filename, NULL, DB_BTREE, DB_CREATE|DB_AUTO_COMMIT|DB_THREAD, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); assert(r == 0); // run test - struct test_seq seq; ZERO_STRUCT(seq); test_seq_init(&seq); + struct test_seq seq; + ZERO_STRUCT(seq); + test_seq_init(&seq); toku_pthread_t t_a_id; - struct t_a_args t_a_args = { db_env, db, &seq }; - r = toku_pthread_create(&t_a_id, NULL, t_a_thread, &t_a_args); assert(r == 0); + struct t_a_args t_a_args = {db_env, db, &seq}; + r = toku_pthread_create( + toku_uninstrumented, &t_a_id, nullptr, t_a_thread, &t_a_args); + assert(r == 0); t_b(db_env, db, &seq); void *ret; - r = toku_pthread_join(t_a_id, &ret); assert(r == 0); + r = toku_pthread_join(t_a_id, &ret); + assert(r == 0); test_seq_destroy(&seq); // close env diff --git a/storage/tokudb/PerconaFT/src/tests/blocking-put.cc b/storage/tokudb/PerconaFT/src/tests/blocking-put.cc index 0fa56325..95481062 100644 --- a/storage/tokudb/PerconaFT/src/tests/blocking-put.cc +++ b/storage/tokudb/PerconaFT/src/tests/blocking-put.cc @@ -139,12 +139,14 @@ int test_main(int argc, char * const argv[]) { r = db->open(db, NULL, db_filename, NULL, DB_BTREE, DB_CREATE|DB_AUTO_COMMIT|DB_THREAD, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); assert(r == 0); toku_pthread_t tids[nthreads]; - struct blocking_put_args a = { db_env, db, nrows, sleeptime }; - for (int i = 0; i < nthreads-1; i++) { - r = toku_pthread_create(&tids[i], NULL, blocking_put_thread, &a); assert(r == 0); + struct blocking_put_args a = {db_env, db, nrows, sleeptime}; + for (int i = 0; i < nthreads - 1; i++) { + r = toku_pthread_create( + toku_uninstrumented, &tids[i], nullptr, blocking_put_thread, &a); + assert(r == 0); } blocking_put(db_env, db, nrows, sleeptime); - for (int i = 0; i < nthreads-1; i++) { + for (int i = 0; i < nthreads - 1; i++) { void *ret; r = toku_pthread_join(tids[i], &ret); assert(r == 0); } diff --git a/storage/tokudb/PerconaFT/src/tests/blocking-set-range-0.cc b/storage/tokudb/PerconaFT/src/tests/blocking-set-range-0.cc index a0e03ab3..7c2e7b0f 100644 --- a/storage/tokudb/PerconaFT/src/tests/blocking-set-range-0.cc +++ b/storage/tokudb/PerconaFT/src/tests/blocking-set-range-0.cc @@ -126,12 +126,15 @@ static void *blocking_set_range_thread(void *arg) { static void run_test(DB_ENV *db_env, DB *db, int nthreads, uint64_t nrows, long sleeptime, uint64_t the_key) { int r; toku_pthread_t tids[nthreads]; - struct blocking_set_range_args a = { db_env, db, nrows, sleeptime, the_key }; - for (int i = 0; i < nthreads-1; i++) { - r = toku_pthread_create(&tids[i], NULL, blocking_set_range_thread, &a); assert(r == 0); + struct blocking_set_range_args a = {db_env, db, nrows, sleeptime, the_key}; + for (int i = 0; i < nthreads - 1; i++) { + r = toku_pthread_create( + toku_uninstrumented, &tids[i], nullptr, + blocking_set_range_thread, &a); + assert(r == 0); } blocking_set_range(db_env, db, nrows, sleeptime, the_key); - for (int i = 0; i < nthreads-1; i++) { + for (int i = 0; i < nthreads - 1; i++) { void *ret; r = toku_pthread_join(tids[i], &ret); assert(r == 0); } diff --git a/storage/tokudb/PerconaFT/src/tests/blocking-set-range-n.cc b/storage/tokudb/PerconaFT/src/tests/blocking-set-range-n.cc index 056d74db..54a5846e 100644 --- a/storage/tokudb/PerconaFT/src/tests/blocking-set-range-n.cc +++ b/storage/tokudb/PerconaFT/src/tests/blocking-set-range-n.cc @@ -121,12 +121,15 @@ static void *blocking_set_range_thread(void *arg) { static void run_test(DB_ENV *db_env, DB *db, int nthreads, uint64_t nrows, long sleeptime, uint64_t the_key) { int r; toku_pthread_t tids[nthreads]; - struct blocking_set_range_args a = { db_env, db, nrows, sleeptime, the_key }; - for (int i = 0; i < nthreads-1; i++) { - r = toku_pthread_create(&tids[i], NULL, blocking_set_range_thread, &a); assert(r == 0); + struct blocking_set_range_args a = {db_env, db, nrows, sleeptime, the_key}; + for (int i = 0; i < nthreads - 1; i++) { + r = toku_pthread_create( + toku_uninstrumented, &tids[i], nullptr, + blocking_set_range_thread, &a); + assert(r == 0); } blocking_set_range(db_env, db, nrows, sleeptime, the_key); - for (int i = 0; i < nthreads-1; i++) { + for (int i = 0; i < nthreads - 1; i++) { void *ret; r = toku_pthread_join(tids[i], &ret); assert(r == 0); } diff --git a/storage/tokudb/PerconaFT/src/tests/blocking-set-range-reverse-0.cc b/storage/tokudb/PerconaFT/src/tests/blocking-set-range-reverse-0.cc index 1e7fca85..59e58254 100644 --- a/storage/tokudb/PerconaFT/src/tests/blocking-set-range-reverse-0.cc +++ b/storage/tokudb/PerconaFT/src/tests/blocking-set-range-reverse-0.cc @@ -126,12 +126,15 @@ static void *blocking_set_range_thread(void *arg) { static void run_test(DB_ENV *db_env, DB *db, int nthreads, uint64_t nrows, long sleeptime, uint64_t the_key) { int r; toku_pthread_t tids[nthreads]; - struct blocking_set_range_args a = { db_env, db, nrows, sleeptime, the_key }; - for (int i = 0; i < nthreads-1; i++) { - r = toku_pthread_create(&tids[i], NULL, blocking_set_range_thread, &a); assert(r == 0); + struct blocking_set_range_args a = {db_env, db, nrows, sleeptime, the_key}; + for (int i = 0; i < nthreads - 1; i++) { + r = toku_pthread_create( + toku_uninstrumented, &tids[i], nullptr, + blocking_set_range_thread, &a); + assert(r == 0); } blocking_set_range(db_env, db, nrows, sleeptime, the_key); - for (int i = 0; i < nthreads-1; i++) { + for (int i = 0; i < nthreads - 1; i++) { void *ret; r = toku_pthread_join(tids[i], &ret); assert(r == 0); } diff --git a/storage/tokudb/PerconaFT/src/tests/blocking-set.cc b/storage/tokudb/PerconaFT/src/tests/blocking-set.cc index ba649898..aa433c87 100644 --- a/storage/tokudb/PerconaFT/src/tests/blocking-set.cc +++ b/storage/tokudb/PerconaFT/src/tests/blocking-set.cc @@ -182,12 +182,14 @@ int test_main(int argc, char * const argv[]) { populate(db_env, db, nrows); toku_pthread_t tids[nthreads]; - struct blocking_set_args a = { db_env, db, nrows, sleeptime }; - for (int i = 0; i < nthreads-1; i++) { - r = toku_pthread_create(&tids[i], NULL, blocking_set_thread, &a); assert(r == 0); + struct blocking_set_args a = {db_env, db, nrows, sleeptime}; + for (int i = 0; i < nthreads - 1; i++) { + r = toku_pthread_create( + toku_uninstrumented, &tids[i], nullptr, blocking_set_thread, &a); + assert(r == 0); } blocking_set(db_env, db, nrows, sleeptime); - for (int i = 0; i < nthreads-1; i++) { + for (int i = 0; i < nthreads - 1; i++) { void *ret; r = toku_pthread_join(tids[i], &ret); assert(r == 0); } diff --git a/storage/tokudb/PerconaFT/src/tests/blocking-table-lock.cc b/storage/tokudb/PerconaFT/src/tests/blocking-table-lock.cc index 9ae33c56..0953a4e8 100644 --- a/storage/tokudb/PerconaFT/src/tests/blocking-table-lock.cc +++ b/storage/tokudb/PerconaFT/src/tests/blocking-table-lock.cc @@ -133,12 +133,17 @@ int test_main(int argc, char * const argv[]) { r = db->open(db, NULL, db_filename, NULL, DB_BTREE, DB_CREATE|DB_AUTO_COMMIT|DB_THREAD, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); assert(r == 0); toku_pthread_t tids[nthreads]; - struct blocking_table_lock_args a = { db_env, db, nrows, sleeptime }; - for (int i = 0; i < nthreads-1; i++) { - r = toku_pthread_create(&tids[i], NULL, blocking_table_lock_thread, &a); assert(r == 0); + struct blocking_table_lock_args a = {db_env, db, nrows, sleeptime}; + for (int i = 0; i < nthreads - 1; i++) { + r = toku_pthread_create(toku_uninstrumented, + &tids[i], + nullptr, + blocking_table_lock_thread, + &a); + assert(r == 0); } blocking_table_lock(db_env, db, nrows, sleeptime); - for (int i = 0; i < nthreads-1; i++) { + for (int i = 0; i < nthreads - 1; i++) { void *ret; r = toku_pthread_join(tids[i], &ret); assert(r == 0); } diff --git a/storage/tokudb/PerconaFT/src/tests/checkpoint_fairness.cc b/storage/tokudb/PerconaFT/src/tests/checkpoint_fairness.cc index be82f8c3..f62dfbc7 100644 --- a/storage/tokudb/PerconaFT/src/tests/checkpoint_fairness.cc +++ b/storage/tokudb/PerconaFT/src/tests/checkpoint_fairness.cc @@ -113,10 +113,14 @@ int test_main(int argc, char * const argv[]) { { int chk_r = db->open(db, NULL, "db", NULL, DB_BTREE, DB_CREATE|DB_AUTO_COMMIT, 0666); CKERR(chk_r); } pthread_t thds[n_threads]; - int ids[n_threads]; - for (int i=0; i(dictionaries)); + CKERR(r); + // this thead will scribble over dictionary 0 before crash to verify + // that + // post-checkpoint inserts are not in the database + DB* db = dictionaries[0].db; + if (iter & 1) + scribble(db, iter); + else + thin_out(db, iter); + uint32_t delay = myrandom(); + delay &= + 0xFFF; // select lower 12 bits, shifted up 8 for random number ... + delay = delay << 8; // ... uniformly distributed between 0 and 1M ... + usleep(delay); // ... to sleep up to one second (1M usec) + drop_dead(); } else { for (i = 0; i < NUM_DICTIONARIES; i++) { diff --git a/storage/tokudb/PerconaFT/src/tests/db-put-simple-deadlock-threads.cc b/storage/tokudb/PerconaFT/src/tests/db-put-simple-deadlock-threads.cc index ada46bd7..e5bcc6af 100644 --- a/storage/tokudb/PerconaFT/src/tests/db-put-simple-deadlock-threads.cc +++ b/storage/tokudb/PerconaFT/src/tests/db-put-simple-deadlock-threads.cc @@ -57,8 +57,8 @@ struct test_seq { static void test_seq_init(struct test_seq *seq) { seq->state = 0; - toku_mutex_init(&seq->lock, NULL); - toku_cond_init(&seq->cv, NULL); + toku_mutex_init(toku_uninstrumented, &seq->lock, nullptr); + toku_cond_init(toku_uninstrumented, &seq->cv, nullptr); } static void test_seq_destroy(struct test_seq *seq) { @@ -146,8 +146,9 @@ static void simple_deadlock(DB_ENV *db_env, DB *db, int do_txn, int n) { struct test_seq test_seq; ZERO_STRUCT(test_seq); test_seq_init(&test_seq); toku_pthread_t tid; - struct run_txn_b_arg arg = { &test_seq, txn_b, db, n}; - r = toku_pthread_create(&tid, NULL, run_txn_b, &arg); + struct run_txn_b_arg arg = {&test_seq, txn_b, db, n}; + r = toku_pthread_create( + toku_uninstrumented, &tid, nullptr, run_txn_b, &arg); test_seq_sleep(&test_seq, 0); insert_row(db, txn_a, htonl(0), 0, 0); diff --git a/storage/tokudb/PerconaFT/src/tests/db-put-simple-lockwait.cc b/storage/tokudb/PerconaFT/src/tests/db-put-simple-lockwait.cc index 365ea39e..0fbe8515 100644 --- a/storage/tokudb/PerconaFT/src/tests/db-put-simple-lockwait.cc +++ b/storage/tokudb/PerconaFT/src/tests/db-put-simple-lockwait.cc @@ -95,10 +95,11 @@ static void simple_lockwait(DB_ENV *db_env, DB *db, int do_txn, int nrows, int n insert_row(db, txns[0], htonl(0), 0, 0); toku_pthread_t tids[ntxns]; - for (int i = 1 ; i < ntxns; i++) { + for (int i = 1; i < ntxns; i++) { struct insert_one_arg *XMALLOC(arg); - *arg = (struct insert_one_arg) { txns[i], db}; - r = toku_pthread_create(&tids[i], NULL, insert_one, arg); + *arg = (struct insert_one_arg){txns[i], db}; + r = toku_pthread_create( + toku_uninstrumented, &tids[i], nullptr, insert_one, arg); } sleep(10); diff --git a/storage/tokudb/PerconaFT/src/tests/db-put-update-deadlock.cc b/storage/tokudb/PerconaFT/src/tests/db-put-update-deadlock.cc index 3660f11d..7a968058 100644 --- a/storage/tokudb/PerconaFT/src/tests/db-put-update-deadlock.cc +++ b/storage/tokudb/PerconaFT/src/tests/db-put-update-deadlock.cc @@ -128,10 +128,12 @@ static void update_deadlock(DB_ENV *db_env, DB *db, int do_txn, int nrows, int n // get write locks toku_pthread_t tids[ntxns]; - for (int i = 0 ; i < ntxns; i++) { + for (int i = 0; i < ntxns; i++) { struct write_one_arg *XMALLOC(arg); - *arg = (struct write_one_arg) { txns[i], db, (int) htonl((i + 1) % ntxns), 0}; - r = toku_pthread_create(&tids[i], NULL, write_one_f, arg); + *arg = + (struct write_one_arg){txns[i], db, (int)htonl((i + 1) % ntxns), 0}; + r = toku_pthread_create( + toku_uninstrumented, &tids[i], nullptr, write_one_f, arg); } #else // get read locks @@ -141,10 +143,11 @@ static void update_deadlock(DB_ENV *db_env, DB *db, int do_txn, int nrows, int n // get write locks toku_pthread_t tids[ntxns]; - for (int i = 0 ; i < ntxns; i++) { + for (int i = 0; i < ntxns; i++) { struct write_one_arg *XMALLOC(arg); - *arg = (struct write_one_arg) { txns[i], db, (int) htonl(0), 0}; - r = toku_pthread_create(&tids[i], NULL, write_one_f, arg); + *arg = (struct write_one_arg){txns[i], db, (int)htonl(0), 0}; + r = toku_pthread_create( + toku_uninstrumented, &tids[i], nullptr, write_one_f, arg); } #endif diff --git a/storage/tokudb/PerconaFT/src/tests/filesize.cc b/storage/tokudb/PerconaFT/src/tests/filesize.cc index 6ab22245..9dfeea13 100644 --- a/storage/tokudb/PerconaFT/src/tests/filesize.cc +++ b/storage/tokudb/PerconaFT/src/tests/filesize.cc @@ -170,11 +170,9 @@ get_file_pathname(void) { if (verbose) printf("path = %s\n", path); } - -static int -getsizeM(void) { +static int getsizeM(void) { toku_struct_stat buf; - int r = toku_stat(path, &buf); + int r = toku_stat(path, &buf, toku_uninstrumented); CKERR(r); int sizeM = (int)buf.st_size >> 20; check_fragmentation(); diff --git a/storage/tokudb/PerconaFT/src/tests/hotindexer-bw.cc b/storage/tokudb/PerconaFT/src/tests/hotindexer-bw.cc index 82471f30..5336bc33 100644 --- a/storage/tokudb/PerconaFT/src/tests/hotindexer-bw.cc +++ b/storage/tokudb/PerconaFT/src/tests/hotindexer-bw.cc @@ -302,12 +302,19 @@ static void test_indexer(DB *src, DB **dbs) CKERR(r); toku_mutex_unlock(&put_lock); - // start threads doing additional inserts - no lock issues since indexer already created - r = toku_pthread_create(&client_threads[0], 0, client, (void *)&client_specs[0]); CKERR(r); -// r = toku_pthread_create(&client_threads[1], 0, client, (void *)&client_specs[1]); CKERR(r); + // start threads doing additional inserts - no lock issues since indexer + // already created + r = toku_pthread_create(toku_uninstrumented, + &client_threads[0], + nullptr, + client, + static_cast(&client_specs[0])); + CKERR(r); + // r = toku_pthread_create(toku_uninstrumented, &client_threads[1], 0, + // client, (void *)&client_specs[1]); CKERR(r); struct timeval start, now; - if ( verbose ) { + if (verbose) { printf("test_indexer build\n"); gettimeofday(&start,0); } @@ -342,14 +349,13 @@ static void test_indexer(DB *src, DB **dbs) if ( verbose ) printf("test_indexer done\n"); } - -static void run_test(void) -{ +static void run_test(void) { int r; - toku_mutex_init(&put_lock, NULL); + toku_mutex_init(toku_uninstrumented, &put_lock, nullptr); toku_os_recursive_delete(TOKU_TEST_FILENAME); - r = toku_os_mkdir(TOKU_TEST_FILENAME, S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r); - char logname[TOKU_PATH_MAX+1]; + r = toku_os_mkdir(TOKU_TEST_FILENAME, S_IRWXU + S_IRWXG + S_IRWXO); + CKERR(r); + char logname[TOKU_PATH_MAX + 1]; r = toku_os_mkdir(toku_path_join(logname, 2, TOKU_TEST_FILENAME, "log"), S_IRWXU+S_IRWXG+S_IRWXO); CKERR(r); r = db_env_create(&env, 0); CKERR(r); diff --git a/storage/tokudb/PerconaFT/src/tests/hotindexer-multiclient.cc b/storage/tokudb/PerconaFT/src/tests/hotindexer-multiclient.cc index eefc621f..004a19ec 100644 --- a/storage/tokudb/PerconaFT/src/tests/hotindexer-multiclient.cc +++ b/storage/tokudb/PerconaFT/src/tests/hotindexer-multiclient.cc @@ -303,13 +303,25 @@ static void test_indexer(DB *src, DB **dbs) r = indexer->set_poll_function(indexer, poll_print, NULL); CKERR(r); - // start threads doing additional inserts - no lock issues since indexer already created - r = toku_pthread_create(&client_threads[0], 0, client, (void *)&client_specs[0]); CKERR(r); - r = toku_pthread_create(&client_threads[1], 0, client, (void *)&client_specs[1]); CKERR(r); -// r = toku_pthread_create(&client_threads[2], 0, client, (void *)&client_specs[2]); CKERR(r); + // start threads doing additional inserts - no lock issues since indexer + // already created + r = toku_pthread_create(toku_uninstrumented, + &client_threads[0], + nullptr, + client, + static_cast(&client_specs[0])); + CKERR(r); + r = toku_pthread_create(toku_uninstrumented, + &client_threads[1], + nullptr, + client, + static_cast(&client_specs[1])); + CKERR(r); + // r = toku_pthread_create(toku_uninstrumented, &client_threads[2], 0, + // client, (void *)&client_specs[2]); CKERR(r); struct timeval start, now; - if ( verbose ) { + if (verbose) { printf("test_indexer build\n"); gettimeofday(&start,0); } diff --git a/storage/tokudb/PerconaFT/src/tests/hotindexer-put-abort.cc b/storage/tokudb/PerconaFT/src/tests/hotindexer-put-abort.cc index 27501291..f4dd9c53 100644 --- a/storage/tokudb/PerconaFT/src/tests/hotindexer-put-abort.cc +++ b/storage/tokudb/PerconaFT/src/tests/hotindexer-put-abort.cc @@ -142,11 +142,14 @@ run_test(void) { } // run the indexer - struct indexer_arg indexer_arg = { env, src_db, 1, &dest_db }; + struct indexer_arg indexer_arg = {env, src_db, 1, &dest_db}; toku_pthread_t pid; - r = toku_pthread_create(&pid, NULL, indexer_thread, &indexer_arg); assert_zero(r); + r = toku_pthread_create( + toku_uninstrumented, &pid, nullptr, indexer_thread, &indexer_arg); + assert_zero(r); - r = txn->abort(txn); assert_zero(r); + r = txn->abort(txn); + assert_zero(r); void *ret; r = toku_pthread_join(pid, &ret); assert_zero(r); diff --git a/storage/tokudb/PerconaFT/src/tests/hotindexer-put-commit.cc b/storage/tokudb/PerconaFT/src/tests/hotindexer-put-commit.cc index 59b40037..99c9bf30 100644 --- a/storage/tokudb/PerconaFT/src/tests/hotindexer-put-commit.cc +++ b/storage/tokudb/PerconaFT/src/tests/hotindexer-put-commit.cc @@ -166,12 +166,16 @@ run_test(void) { } // run the indexer - struct indexer_arg indexer_arg = { env, src_db, 1, &dest_db }; + struct indexer_arg indexer_arg = {env, src_db, 1, &dest_db}; toku_pthread_t pid; - r = toku_pthread_create(&pid, NULL, indexer_thread, &indexer_arg); assert_zero(r); - - if (verbose) fprintf(stderr, "commit start\n"); - r = txn->commit(txn, 0); assert_zero(r); + r = toku_pthread_create( + toku_uninstrumented, &pid, nullptr, indexer_thread, &indexer_arg); + assert_zero(r); + + if (verbose) + fprintf(stderr, "commit start\n"); + r = txn->commit(txn, 0); + assert_zero(r); if (verbose) fprintf(stderr, "commit end\n"); void *ret; diff --git a/storage/tokudb/PerconaFT/src/tests/hotindexer-with-queries.cc b/storage/tokudb/PerconaFT/src/tests/hotindexer-with-queries.cc index a0be49c1..2bc60142 100644 --- a/storage/tokudb/PerconaFT/src/tests/hotindexer-with-queries.cc +++ b/storage/tokudb/PerconaFT/src/tests/hotindexer-with-queries.cc @@ -114,10 +114,12 @@ static void query_only(DB *src) client_init(); // start thread doing query - r = toku_pthread_create(client_thread, 0, client, (void *)src); + r = toku_pthread_create( + toku_uninstrumented, client_thread, nullptr, + client, static_cast(src)); CKERR(r); - r = toku_pthread_join(*client_thread, &t0); + r = toku_pthread_join(*client_thread, &t0); CKERR(r); client_cleanup(); @@ -150,10 +152,13 @@ static void test_indexer(DB *src, DB **dbs) CKERR(r); // start thread doing query - r = toku_pthread_create(client_thread, 0, client, (void *)src); CKERR(r); + r = toku_pthread_create( + toku_uninstrumented, client_thread, nullptr, + client, static_cast(src)); + CKERR(r); struct timeval start, now; - if ( verbose ) { + if (verbose) { printf("test_indexer build\n"); gettimeofday(&start,0); } diff --git a/storage/tokudb/PerconaFT/src/tests/locktree_escalation_stalls.cc b/storage/tokudb/PerconaFT/src/tests/locktree_escalation_stalls.cc index b4874472..e6c1b18b 100644 --- a/storage/tokudb/PerconaFT/src/tests/locktree_escalation_stalls.cc +++ b/storage/tokudb/PerconaFT/src/tests/locktree_escalation_stalls.cc @@ -191,17 +191,22 @@ static void run_test(uint64_t max_i, int n_small) { env, big_db, max_i, big_test, }; toku_pthread_t big_id; - r = toku_pthread_create(&big_id, NULL, test_f, &big_test_args); + r = toku_pthread_create( + toku_uninstrumented, &big_id, nullptr, test_f, &big_test_args); assert(r == 0); struct test_args small_test_args[n_small]; toku_pthread_t small_id[n_small]; for (int i = 0; i < n_small; i++) { - small_test_args[i] = { env, small_db, max_i, small_test }; - r = toku_pthread_create(&small_id[i], NULL, test_f, &small_test_args[i]); + small_test_args[i] = {env, small_db, max_i, small_test}; + r = toku_pthread_create(toku_uninstrumented, + &small_id[i], + nullptr, + test_f, + &small_test_args[i]); assert(r == 0); } - + void *big_ret; r = toku_pthread_join(big_id, &big_ret); assert(r == 0); diff --git a/storage/tokudb/PerconaFT/src/tests/recover-test_crash_in_flusher_thread.h b/storage/tokudb/PerconaFT/src/tests/recover-test_crash_in_flusher_thread.h index 0ed68207..5c10d0cb 100644 --- a/storage/tokudb/PerconaFT/src/tests/recover-test_crash_in_flusher_thread.h +++ b/storage/tokudb/PerconaFT/src/tests/recover-test_crash_in_flusher_thread.h @@ -70,13 +70,18 @@ static void *do_checkpoint_and_crash(void *arg) { static void flt_callback(int flt_state, void* extra) { cnt++; if (verbose) printf("flt_state!! %d\n", flt_state); - if (cnt > 0 && !starting_a_chkpt && flt_state == state_to_crash) { - starting_a_chkpt = true; - if (verbose) printf("flt_state %d\n", flt_state); - int r = toku_pthread_create(&checkpoint_tid, NULL, do_checkpoint_and_crash, extra); - assert(r==0); - usleep(2*1000*1000); - } + if (cnt > 0 && !starting_a_chkpt && flt_state == state_to_crash) { + starting_a_chkpt = true; + if (verbose) + printf("flt_state %d\n", flt_state); + int r = toku_pthread_create(toku_uninstrumented, + &checkpoint_tid, + nullptr, + do_checkpoint_and_crash, + extra); + assert(r == 0); + usleep(2 * 1000 * 1000); + } } diff --git a/storage/tokudb/PerconaFT/src/tests/recovery_stress.cc b/storage/tokudb/PerconaFT/src/tests/recovery_stress.cc index b1f5f98a..1646030c 100644 --- a/storage/tokudb/PerconaFT/src/tests/recovery_stress.cc +++ b/storage/tokudb/PerconaFT/src/tests/recovery_stress.cc @@ -515,19 +515,8 @@ static void run_test (int iter) { // if requesting crash, randomly do other non-committed acts, then "drop_dead" if (iter > 0) { - if (verbose) printf("dying\n"); -#if 0 - // separate thread will perform random acts on other dictionaries (not 0) - r = toku_pthread_create(&thread, 0, random_acts, (void *) dictionaries); - CKERR(r); - // this thead will scribble over dictionary 0 before crash to verify that - // post-checkpoint inserts are not in the database - DB* db = dictionaries[0].db; - if (iter & 1) - scribble(db, iter); - else - thin_out(db, iter); -#endif + if (verbose) + printf("dying\n"); uint32_t delay = myrandom(); delay &= 0xFFF; // select lower 12 bits, shifted up 8 for random number ... delay = delay << 8; // ... uniformly distributed between 0 and 1M ... diff --git a/storage/tokudb/PerconaFT/src/tests/stress_openclose.h b/storage/tokudb/PerconaFT/src/tests/stress_openclose.h index 3f10bfe8..3a55ca44 100644 --- a/storage/tokudb/PerconaFT/src/tests/stress_openclose.h +++ b/storage/tokudb/PerconaFT/src/tests/stress_openclose.h @@ -245,19 +245,16 @@ stress_table(DB_ENV *env, DB **dbp, struct cli_args *cli_args) { // which they can choose a random db to either touch or query XMALLOC_N(num_buckets, buckets); for (int i = 0; i < num_buckets; i++) { - struct db_bucket bucket = { - .env = env, - .db = dbp[i], - .is_open = true - }; + struct db_bucket bucket = {.env = env, .db = dbp[i], .is_open = true}; buckets[i] = bucket; - toku_mutex_init(&buckets[i].mutex, NULL); + toku_mutex_init(toku_uninstrumented, &buckets[i].mutex, nullptr); } // run all of the query and update workers. they may randomly open // and close the dbs in each db_bucket to be some random dictionary, // so when they're done we'll have to clean up the mess so this // stress test can exit gracefully expecting db[i] = the ith db - //verbose_printf("stressing %d tables using %d update threads, %d query threads\n", + // verbose_printf("stressing %d tables using %d update threads, %d query + // threads\n", // num_buckets, update_threads, query_threads); verbose_printf("stressing %d tables using %d update threads\n", num_buckets, update_threads); diff --git a/storage/tokudb/PerconaFT/src/tests/test3039.cc b/storage/tokudb/PerconaFT/src/tests/test3039.cc index 54a2b3bf..6c38fa13 100644 --- a/storage/tokudb/PerconaFT/src/tests/test3039.cc +++ b/storage/tokudb/PerconaFT/src/tests/test3039.cc @@ -184,30 +184,36 @@ void do_threads (unsigned long long N, int do_nonlocal) { toku_pthread_t ths[2]; struct reader_thread_state rstates[2] = {{.elapsed_time = 0.0, .n_did_read = 0, - .n_to_read = (long long signed) N, - .do_local = 1, - .finish = 0}, + .n_to_read = (long long signed)N, + .do_local = 1, + .finish = 0}, {.elapsed_time = 0.0, .n_did_read = 0, .n_to_read = -1, - .do_local = 0, - .finish = 0}}; + .do_local = 0, + .finish = 0}}; int n_to_create = do_nonlocal ? 2 : 1; - for (int i=0; i(&rstates[i])); + CKERR(r); } - for (int i=0; i. + +---------------------------------------- + + PerconaFT is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License, version 3, + as published by the Free Software Foundation. + + PerconaFT 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with PerconaFT. If not, see . +======= */ + +#ident \ + "Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved." + +#include "test.h" +// to verify the DB_LOCKING_READ works to lock the read rows for snapshot +// isolaton. +// we create a db, then init a read transaction with repeatable-read isolation +// and +// locking read flag, then we start another transaction to grab the write lock. +// DB_LOCKING_READ is defined here to just make the before and after tests work +// (before +// test did not have DB_LOCKING_READ flag). +#if !defined(DB_LOCKING_READ) +#define DB_LOCKING_READ 0 +#endif +static int prelock_range(DBC *cursor, int left, int right) { + DBT key_left; + dbt_init(&key_left, &left, sizeof left); + DBT key_right; + dbt_init(&key_right, &right, sizeof right); + int r = cursor->c_set_bounds(cursor, &key_left, &key_right, true, 0); + return r; +} + +static void test_read_write_range(DB_ENV *env, + DB *db, + uint32_t iso_flags, + int expect_r) { + int r; + + DB_TXN *txn_a = NULL; + r = env->txn_begin(env, NULL, &txn_a, iso_flags); + assert_zero(r); + DB_TXN *txn_b = NULL; + r = env->txn_begin(env, NULL, &txn_b, iso_flags); + assert_zero(r); + + DBC *cursor_a = NULL; + r = db->cursor(db, txn_a, &cursor_a, DB_LOCKING_READ); + assert_zero(r); + DBC *cursor_b = NULL; + r = db->cursor(db, txn_b, &cursor_b, DB_RMW); + assert_zero(r); + + r = prelock_range(cursor_a, htonl(10), htonl(100)); + assert_zero(r); + r = prelock_range(cursor_b, htonl(50), htonl(200)); + assert(r == expect_r); + + r = cursor_a->c_close(cursor_a); + assert_zero(r); + r = cursor_b->c_close(cursor_b); + assert_zero(r); + + r = txn_a->commit(txn_a, 0); + assert_zero(r); + r = txn_b->commit(txn_b, 0); + assert_zero(r); +} + +static void test_read_write_point(DB_ENV *env, + DB *db, + uint32_t iso_flags, + int expect_r) { + int r; + + DB_TXN *txn1 = NULL; + r = env->txn_begin(env, NULL, &txn1, iso_flags); + assert_zero(r); + + DB_TXN *txn2 = NULL; + r = env->txn_begin(env, NULL, &txn2, iso_flags); + assert_zero(r); + + DBC *c1 = NULL; + r = db->cursor(db, txn1, &c1, DB_LOCKING_READ); + assert_zero(r); + + DBC *c2 = NULL; + r = db->cursor(db, txn2, &c2, DB_RMW); + assert_zero(r); + + int k = htonl(42); + DBT key; + dbt_init(&key, &k, sizeof k); + DBT val; + memset(&val, 0, sizeof val); + r = c1->c_get(c1, &key, &val, DB_SET); + assert_zero(r); + + r = c2->c_get(c2, &key, &val, DB_SET); + assert(r == expect_r); + + r = c1->c_close(c1); + assert_zero(r); + r = c2->c_close(c2); + assert_zero(r); + + r = txn1->commit(txn1, 0); + assert_zero(r); + r = txn2->commit(txn2, 0); + assert_zero(r); +} + +int test_main(int argc, char *const argv[]) { + int r; + + const char *env_dir = TOKU_TEST_FILENAME; + const char *db_filename = "lockingreadtest"; + + parse_args(argc, argv); + + char rm_cmd[strlen(env_dir) + strlen("rm -rf ") + 1]; + snprintf(rm_cmd, sizeof(rm_cmd), "rm -rf %s", env_dir); + r = system(rm_cmd); + assert_zero(r); + + r = toku_os_mkdir(env_dir, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH); + assert_zero(r); + + DB_ENV *env = NULL; + r = db_env_create(&env, 0); + assert_zero(r); + int env_open_flags = DB_CREATE | DB_PRIVATE | DB_INIT_MPOOL | DB_INIT_TXN | + DB_INIT_LOCK | DB_INIT_LOG; + r = env->open( + env, env_dir, env_open_flags, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + assert_zero(r); + + // create the db + DB *db = NULL; + r = db_create(&db, env, 0); + assert_zero(r); + DB_TXN *create_txn = NULL; + r = env->txn_begin(env, NULL, &create_txn, 0); + assert_zero(r); + r = db->open(db, + create_txn, + db_filename, + NULL, + DB_BTREE, + DB_CREATE, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + assert_zero(r); + r = create_txn->commit(create_txn, 0); + assert_zero(r); + + // add a record + + DB_TXN *write_txn = NULL; + r = env->txn_begin(env, NULL, &write_txn, 0); + assert_zero(r); + + int k = htonl(42); + int v = 42; + DBT key; + dbt_init(&key, &k, sizeof k); + DBT val; + dbt_init(&val, &v, sizeof v); + r = db->put(db, write_txn, &key, &val, DB_NOOVERWRITE); + assert_zero(r); + r = write_txn->commit(write_txn, 0); + assert_zero(r); + + test_read_write_range(env, db, DB_TXN_SNAPSHOT, DB_LOCK_NOTGRANTED); + test_read_write_point(env, db, DB_TXN_SNAPSHOT, DB_LOCK_NOTGRANTED); + + r = db->close(db, 0); + assert_zero(r); + + r = env->close(env, 0); + assert_zero(r); + return 0; +} diff --git a/storage/tokudb/PerconaFT/src/tests/test_3645.cc b/storage/tokudb/PerconaFT/src/tests/test_3645.cc index bb5566b0..e1fa37be 100644 --- a/storage/tokudb/PerconaFT/src/tests/test_3645.cc +++ b/storage/tokudb/PerconaFT/src/tests/test_3645.cc @@ -239,33 +239,61 @@ test_evictions (void) { // make the forward fast scanner myargs[0].fast = true; myargs[0].fwd = true; - { int chk_r = toku_pthread_create(&mytids[0], NULL, scan_db, &myargs[0]); CKERR(chk_r); } + { + int chk_r = toku_pthread_create( + toku_uninstrumented, &mytids[0], nullptr, scan_db, &myargs[0]); + CKERR(chk_r); + } // make the forward slow scanner myargs[1].fast = false; myargs[1].fwd = true; - { int chk_r = toku_pthread_create(&mytids[1], NULL, scan_db, &myargs[1]); CKERR(chk_r); } + { + int chk_r = toku_pthread_create( + toku_uninstrumented, &mytids[1], nullptr, scan_db, &myargs[1]); + CKERR(chk_r); + } // make the backward fast scanner myargs[2].fast = true; myargs[2].fwd = false; - { int chk_r = toku_pthread_create(&mytids[2], NULL, scan_db, &myargs[2]); CKERR(chk_r); } + { + int chk_r = toku_pthread_create( + toku_uninstrumented, &mytids[2], nullptr, scan_db, &myargs[2]); + CKERR(chk_r); + } // make the backward slow scanner myargs[3].fast = false; myargs[3].fwd = false; - { int chk_r = toku_pthread_create(&mytids[3], NULL, scan_db, &myargs[3]); CKERR(chk_r); } + { + int chk_r = toku_pthread_create( + toku_uninstrumented, &mytids[3], nullptr, scan_db, &myargs[3]); + CKERR(chk_r); + } // make the guy that updates the db - { int chk_r = toku_pthread_create(&mytids[4], NULL, update_db, &myargs[4]); CKERR(chk_r); } + { + int chk_r = toku_pthread_create( + toku_uninstrumented, &mytids[4], nullptr, update_db, &myargs[4]); + CKERR(chk_r); + } // make the guy that does point queries - { int chk_r = toku_pthread_create(&mytids[5], NULL, ptquery_db, &myargs[5]); CKERR(chk_r); } + { + int chk_r = toku_pthread_create( + toku_uninstrumented, &mytids[5], nullptr, ptquery_db, &myargs[5]); + CKERR(chk_r); + } // make the guy that sleeps - { int chk_r = toku_pthread_create(&mytids[6], NULL, test_time, NULL); CKERR(chk_r); } - - for (uint32_t i = 0; i < sizeof(myargs)/sizeof(myargs[0]); i++) { + { + int chk_r = toku_pthread_create( + toku_uninstrumented, &mytids[6], nullptr, test_time, nullptr); + CKERR(chk_r); + } + + for (uint32_t i = 0; i < sizeof(myargs) / sizeof(myargs[0]); i++) { void *ret; r = toku_pthread_join(mytids[i], &ret); assert_zero(r); } diff --git a/storage/tokudb/PerconaFT/src/tests/test_4015.cc b/storage/tokudb/PerconaFT/src/tests/test_4015.cc index dc18242b..1231e3b4 100644 --- a/storage/tokudb/PerconaFT/src/tests/test_4015.cc +++ b/storage/tokudb/PerconaFT/src/tests/test_4015.cc @@ -151,10 +151,18 @@ int test_main(int argc, char * const argv[]) { { int chk_r = db->open(db, NULL, "db", NULL, DB_BTREE, DB_CREATE, 0666); CKERR(chk_r); } DBT desc; dbt_init(&desc, "foo", sizeof("foo")); - IN_TXN_COMMIT(env, NULL, txn, 0, - { int chk_r = db->change_descriptor(db, txn, &desc, DB_UPDATE_CMP_DESCRIPTOR); CKERR(chk_r); }); + IN_TXN_COMMIT(env, NULL, txn, 0, { + int chk_r = + db->change_descriptor(db, txn, &desc, DB_UPDATE_CMP_DESCRIPTOR); + CKERR(chk_r); + }); pthread_t thd; - { int chk_r = toku_pthread_create(&thd, NULL, startA, NULL); CKERR(chk_r); } + { + int chk_r = + toku_pthread_create( + toku_uninstrumented, &thd, nullptr, startA, nullptr); + CKERR(chk_r); + } startB(); diff --git a/storage/tokudb/PerconaFT/src/tests/test_abort1.cc b/storage/tokudb/PerconaFT/src/tests/test_abort1.cc index 55449610..7b603648 100644 --- a/storage/tokudb/PerconaFT/src/tests/test_abort1.cc +++ b/storage/tokudb/PerconaFT/src/tests/test_abort1.cc @@ -87,10 +87,12 @@ test_db_open_aborts (void) { CKERR2(r, DB_NOTFOUND); } toku_struct_stat statbuf; - char filename[TOKU_PATH_MAX+1]; - r = toku_stat(toku_path_join(filename, 2, TOKU_TEST_FILENAME, "foo.db"), &statbuf); - assert(r!=0); - assert(errno==ENOENT); + char filename[TOKU_PATH_MAX + 1]; + r = toku_stat(toku_path_join(filename, 2, TOKU_TEST_FILENAME, "foo.db"), + &statbuf, + toku_uninstrumented); + assert(r != 0); + assert(errno == ENOENT); } r=env->close(env, 0); assert(r==0); @@ -153,10 +155,12 @@ test_db_put_aborts (void) { CAST_FROM_VOIDP(filename, iname.data); assert(filename); } - toku_struct_stat statbuf; - char fullfile[TOKU_PATH_MAX+1]; - r = toku_stat(toku_path_join(fullfile, 2, TOKU_TEST_FILENAME, filename), &statbuf); - assert(r==0); + toku_struct_stat statbuf; + char fullfile[TOKU_PATH_MAX + 1]; + r = toku_stat(toku_path_join(fullfile, 2, TOKU_TEST_FILENAME, filename), + &statbuf, + toku_uninstrumented); + assert(r == 0); toku_free(filename); } // But the item should not be in it. diff --git a/storage/tokudb/PerconaFT/src/tests/test_abort4.cc b/storage/tokudb/PerconaFT/src/tests/test_abort4.cc index e67efb46..e797fc64 100644 --- a/storage/tokudb/PerconaFT/src/tests/test_abort4.cc +++ b/storage/tokudb/PerconaFT/src/tests/test_abort4.cc @@ -160,10 +160,12 @@ verify_and_tear_down(int close_first) { CAST_FROM_VOIDP(filename, iname.data); assert(filename); } - toku_struct_stat statbuf; - char fullfile[TOKU_PATH_MAX+1]; - r = toku_stat(toku_path_join(fullfile, 2, TOKU_TEST_FILENAME, filename), &statbuf); - assert(r==0); + toku_struct_stat statbuf; + char fullfile[TOKU_PATH_MAX + 1]; + r = toku_stat(toku_path_join(fullfile, 2, TOKU_TEST_FILENAME, filename), + &statbuf, + toku_uninstrumented); + assert(r == 0); toku_free(filename); } CKERR(r); diff --git a/storage/tokudb/PerconaFT/src/tests/test_abort5.cc b/storage/tokudb/PerconaFT/src/tests/test_abort5.cc index 728afcce..d5d056d5 100644 --- a/storage/tokudb/PerconaFT/src/tests/test_abort5.cc +++ b/storage/tokudb/PerconaFT/src/tests/test_abort5.cc @@ -191,10 +191,12 @@ verify_and_tear_down(int close_first) { CAST_FROM_VOIDP(filename, iname.data); assert(filename); } - toku_struct_stat statbuf; - char fullfile[TOKU_PATH_MAX+1]; - r = toku_stat(toku_path_join(fullfile, 2, TOKU_TEST_FILENAME, filename), &statbuf); - assert(r==0); + toku_struct_stat statbuf; + char fullfile[TOKU_PATH_MAX + 1]; + r = toku_stat(toku_path_join(fullfile, 2, TOKU_TEST_FILENAME, filename), + &statbuf, + toku_uninstrumented); + assert(r == 0); toku_free(filename); } if (close_first) { diff --git a/storage/tokudb/PerconaFT/src/tests/test_forkjoin.cc b/storage/tokudb/PerconaFT/src/tests/test_forkjoin.cc index 910cf46e..766372a1 100644 --- a/storage/tokudb/PerconaFT/src/tests/test_forkjoin.cc +++ b/storage/tokudb/PerconaFT/src/tests/test_forkjoin.cc @@ -48,12 +48,13 @@ f (void *arg) { return arg; } -int -test_main(int argc, char *const argv[]) { +int test_main(int argc, char *const argv[]) { parse_args(argc, argv); toku_pthread_t t; - int r = toku_pthread_create(&t, 0, f, 0); assert(r == 0); + int r = toku_pthread_create(toku_uninstrumented, &t, nullptr, f, nullptr); + assert(r == 0); void *ret; - r = toku_pthread_join(t, &ret); assert(r == 0); + r = toku_pthread_join(t, &ret); + assert(r == 0); return 0; } diff --git a/storage/tokudb/PerconaFT/src/tests/test_groupcommit_count.cc b/storage/tokudb/PerconaFT/src/tests/test_groupcommit_count.cc index 414ddd2b..35104c2a 100644 --- a/storage/tokudb/PerconaFT/src/tests/test_groupcommit_count.cc +++ b/storage/tokudb/PerconaFT/src/tests/test_groupcommit_count.cc @@ -87,12 +87,16 @@ test_groupcommit (int nthreads) { int i; toku_pthread_t threads[nthreads]; int whichthread[nthreads]; - for (i=0; iclose(db, 0); assert(r==0); diff --git a/storage/tokudb/PerconaFT/src/tests/test_groupcommit_perf.cc b/storage/tokudb/PerconaFT/src/tests/test_groupcommit_perf.cc index 94eaf2a0..6f872d10 100644 --- a/storage/tokudb/PerconaFT/src/tests/test_groupcommit_perf.cc +++ b/storage/tokudb/PerconaFT/src/tests/test_groupcommit_perf.cc @@ -84,12 +84,16 @@ test_groupcommit (int nthreads) { int i; toku_pthread_t threads[nthreads]; int whichthread[nthreads]; - for (i=0; itxn_begin(env, 0, &tid, 0); CKERR(r); diff --git a/storage/tokudb/PerconaFT/src/tests/test_iterate_pending_lock_requests.cc b/storage/tokudb/PerconaFT/src/tests/test_iterate_pending_lock_requests.cc index f2bf0a2c..66471a74 100644 --- a/storage/tokudb/PerconaFT/src/tests/test_iterate_pending_lock_requests.cc +++ b/storage/tokudb/PerconaFT/src/tests/test_iterate_pending_lock_requests.cc @@ -112,12 +112,17 @@ int test_main(int UU(argc), char *const UU(argv[])) { acquire_lock(txn1, magic_key); acquire_lock_extra e1(txn2, magic_key); - r = toku_pthread_create(&thread1, NULL, acquire_lock_thread, &e1); CKERR(r); + r = toku_pthread_create( + toku_uninstrumented, &thread1, nullptr, acquire_lock_thread, &e1); + CKERR(r); acquire_lock_extra e2(txn3, magic_key); - r = toku_pthread_create(&thread2, NULL, acquire_lock_thread, &e2); CKERR(r); + r = toku_pthread_create( + toku_uninstrumented, &thread2, nullptr, acquire_lock_thread, &e2); + CKERR(r); sleep(1); - r = env->iterate_pending_lock_requests(env, iterate_callback, NULL); CKERR(r); + r = env->iterate_pending_lock_requests(env, iterate_callback, NULL); + CKERR(r); invariant(iterate_callback_called == 2); void *v; diff --git a/storage/tokudb/PerconaFT/src/tests/test_lock_timeout_callback.cc b/storage/tokudb/PerconaFT/src/tests/test_lock_timeout_callback.cc index 75ea49ec..571bae69 100644 --- a/storage/tokudb/PerconaFT/src/tests/test_lock_timeout_callback.cc +++ b/storage/tokudb/PerconaFT/src/tests/test_lock_timeout_callback.cc @@ -118,7 +118,8 @@ int test_main(int UU(argc), char *const UU(argv[])) { acquire_lock(txn2, magic_key + 1); toku_pthread_t thread; acquire_lock_extra e(txn1, magic_key + 1); - r = toku_pthread_create(&thread, NULL, acquire_lock_thread, &e); + r = toku_pthread_create( + toku_uninstrumented, &thread, nullptr, acquire_lock_thread, &e); usleep(100000); acquire_lock(txn2, magic_key); invariant(callback_calls == 2); diff --git a/storage/tokudb/PerconaFT/src/tests/test_log1.cc b/storage/tokudb/PerconaFT/src/tests/test_log1.cc index 65fa1d83..5473a8e3 100644 --- a/storage/tokudb/PerconaFT/src/tests/test_log1.cc +++ b/storage/tokudb/PerconaFT/src/tests/test_log1.cc @@ -87,10 +87,12 @@ static void make_db (bool close_env) { r=tid->commit(tid, 0); assert(r==0); r=db->close(db, 0); assert(r==0); { - toku_struct_stat statbuf; - char fullfile[TOKU_PATH_MAX+1]; - r = toku_stat(toku_path_join(fullfile, 2, TOKU_TEST_FILENAME, filename), &statbuf); - assert(r==0); + toku_struct_stat statbuf; + char fullfile[TOKU_PATH_MAX + 1]; + r = toku_stat(toku_path_join(fullfile, 2, TOKU_TEST_FILENAME, filename), + &statbuf, + toku_uninstrumented); + assert(r == 0); toku_free(filename); } if (close_env) { diff --git a/storage/tokudb/PerconaFT/src/tests/test_log1_abort.cc b/storage/tokudb/PerconaFT/src/tests/test_log1_abort.cc index 92c3657a..c66409fb 100644 --- a/storage/tokudb/PerconaFT/src/tests/test_log1_abort.cc +++ b/storage/tokudb/PerconaFT/src/tests/test_log1_abort.cc @@ -80,11 +80,13 @@ test_main (int UU(argc), char UU(*const argv[])) { r=env->close(env, 0); assert(r==0); { - toku_struct_stat statbuf; - char filename[TOKU_PATH_MAX+1]; - r = toku_stat(toku_path_join(filename, 2, TOKU_TEST_FILENAME, "foo.db"), &statbuf); - assert(r==-1); - assert(errno==ENOENT); + toku_struct_stat statbuf; + char filename[TOKU_PATH_MAX + 1]; + r = toku_stat(toku_path_join(filename, 2, TOKU_TEST_FILENAME, "foo.db"), + &statbuf, + toku_uninstrumented); + assert(r == -1); + assert(errno == ENOENT); } return 0; } diff --git a/storage/tokudb/PerconaFT/src/tests/test_logmax.cc b/storage/tokudb/PerconaFT/src/tests/test_logmax.cc index e5de0a5d..133eb36d 100644 --- a/storage/tokudb/PerconaFT/src/tests/test_logmax.cc +++ b/storage/tokudb/PerconaFT/src/tests/test_logmax.cc @@ -50,14 +50,19 @@ check_logmax (int max) { struct dirent *ent; while ((ent=readdir(dir))) { if ((ent->d_type==DT_REG || ent->d_type==DT_UNKNOWN) && strncmp(ent->d_name, "log", 3)==0) { - // It is a "log*" file - char full_fname[TOKU_PATH_MAX+1]; - toku_struct_stat sbuf; - int r = toku_stat(toku_path_join(full_fname, 2, TOKU_TEST_FILENAME, ent->d_name), &sbuf); - assert(r==0); - if (verbose) - printf("%s is of size %" PRId64 "\n", ent->d_name, (int64_t)sbuf.st_size); - if (sbuf.st_size > max) any_too_big=1; + // It is a "log*" file + char full_fname[TOKU_PATH_MAX + 1]; + toku_struct_stat sbuf; + int r = toku_stat( + toku_path_join(full_fname, 2, TOKU_TEST_FILENAME, ent->d_name), + &sbuf, + toku_uninstrumented); + assert(r == 0); + if (verbose) + printf("%s is of size %" PRId64 "\n", + ent->d_name, + (int64_t)sbuf.st_size); + if (sbuf.st_size > max) any_too_big=1; } } assert(!any_too_big); diff --git a/storage/tokudb/PerconaFT/src/tests/test_multiple_checkpoints_block_commit.cc b/storage/tokudb/PerconaFT/src/tests/test_multiple_checkpoints_block_commit.cc index 66e9f4a5..da53a7bf 100644 --- a/storage/tokudb/PerconaFT/src/tests/test_multiple_checkpoints_block_commit.cc +++ b/storage/tokudb/PerconaFT/src/tests/test_multiple_checkpoints_block_commit.cc @@ -101,10 +101,17 @@ static void run_test(void) { toku_pthread_t chkpt1_tid; toku_pthread_t chkpt2_tid; - - { int chk_r = toku_pthread_create(&chkpt1_tid, NULL, run_checkpoint, NULL); CKERR(chk_r); } - { int chk_r = toku_pthread_create(&chkpt2_tid, NULL, run_checkpoint, NULL); CKERR(chk_r); } - usleep(2*1024*1024); + { + int chk_r = toku_pthread_create( + toku_uninstrumented, &chkpt1_tid, nullptr, run_checkpoint, nullptr); + CKERR(chk_r); + } + { + int chk_r = toku_pthread_create( + toku_uninstrumented, &chkpt2_tid, nullptr, run_checkpoint, nullptr); + CKERR(chk_r); + } + usleep(2 * 1024 * 1024); struct timeval tstart; gettimeofday(&tstart, NULL); DB_TXN *txn = NULL; diff --git a/storage/tokudb/PerconaFT/src/tests/test_stress_hot_indexing.cc b/storage/tokudb/PerconaFT/src/tests/test_stress_hot_indexing.cc index e0bf0d2e..6395f591 100644 --- a/storage/tokudb/PerconaFT/src/tests/test_stress_hot_indexing.cc +++ b/storage/tokudb/PerconaFT/src/tests/test_stress_hot_indexing.cc @@ -312,12 +312,11 @@ stress_table(DB_ENV *env, DB **dbp, struct cli_args *cli_args) { run_workers(myargs, num_threads, cli_args->num_seconds, false, cli_args); } -int -test_main(int argc, char *const argv[]) { +int test_main(int argc, char *const argv[]) { gid_count = 0; memset(hi_gid, 0, sizeof(hi_gid)); - toku_mutex_init(&hi_lock, NULL); - toku_mutex_init(&fops_lock, NULL); + toku_mutex_init(toku_uninstrumented, &hi_lock, nullptr); + toku_mutex_init(toku_uninstrumented, &fops_lock, nullptr); hot_db = NULL; struct cli_args args = get_default_args(); // let's make default checkpointing period really slow diff --git a/storage/tokudb/PerconaFT/src/tests/test_thread_insert.cc b/storage/tokudb/PerconaFT/src/tests/test_thread_insert.cc index 0d5245e8..a266de63 100644 --- a/storage/tokudb/PerconaFT/src/tests/test_thread_insert.cc +++ b/storage/tokudb/PerconaFT/src/tests/test_thread_insert.cc @@ -150,10 +150,13 @@ test_main(int argc, char *const argv[]) { work[i].endno = n; } - if (verbose) printf("pid:%d\n", toku_os_getpid()); + if (verbose) + printf("pid:%d\n", toku_os_getpid()); - for (i=1; iclose(env, 0); assert(r == 0); diff --git a/storage/tokudb/PerconaFT/src/tests/threaded_stress_test_helpers.h b/storage/tokudb/PerconaFT/src/tests/threaded_stress_test_helpers.h index f2baccee..e232f327 100644 --- a/storage/tokudb/PerconaFT/src/tests/threaded_stress_test_helpers.h +++ b/storage/tokudb/PerconaFT/src/tests/threaded_stress_test_helpers.h @@ -469,11 +469,11 @@ static int get_commit_flags(struct cli_args *args) { } struct worker_extra { - struct arg* thread_arg; + struct arg *thread_arg; toku_mutex_t *operation_lock_mutex; - struct rwlock *operation_lock; + struct st_rwlock *operation_lock; uint64_t *counters; - int64_t pad[4]; // pad to 64 bytes + int64_t pad[4]; // pad to 64 bytes }; static void lock_worker_op(struct worker_extra* we) { @@ -1772,11 +1772,12 @@ static int run_workers( ) { int r; - const struct perf_formatter *perf_formatter = &perf_formatters[cli_args->perf_output_format]; + const struct perf_formatter *perf_formatter = + &perf_formatters[cli_args->perf_output_format]; toku_mutex_t mutex = ZERO_MUTEX_INITIALIZER; - toku_mutex_init(&mutex, nullptr); - struct rwlock rwlock; - rwlock_init(&rwlock); + toku_mutex_init(toku_uninstrumented, &mutex, nullptr); + struct st_rwlock rwlock; + rwlock_init(toku_uninstrumented, &rwlock); toku_pthread_t tids[num_threads]; toku_pthread_t time_tid; if (cli_args->print_performance) { @@ -1798,15 +1799,26 @@ static int run_workers( worker_extra[i].thread_arg = &thread_args[i]; worker_extra[i].operation_lock = &rwlock; worker_extra[i].operation_lock_mutex = &mutex; - XCALLOC_N((int) NUM_OPERATION_TYPES, worker_extra[i].counters); + XCALLOC_N((int)NUM_OPERATION_TYPES, worker_extra[i].counters); TOKU_DRD_IGNORE_VAR(worker_extra[i].counters); - { int chk_r = toku_pthread_create(&tids[i], nullptr, worker, &worker_extra[i]); CKERR(chk_r); } + { + int chk_r = toku_pthread_create(toku_uninstrumented, + &tids[i], + nullptr, + worker, + &worker_extra[i]); + CKERR(chk_r); + } if (verbose) - printf("%lu created\n", (unsigned long) tids[i]); + printf("%lu created\n", (unsigned long)tids[i]); + } + { + int chk_r = toku_pthread_create( + toku_uninstrumented, &time_tid, nullptr, test_time, &tte); + CKERR(chk_r); } - { int chk_r = toku_pthread_create(&time_tid, nullptr, test_time, &tte); CKERR(chk_r); } if (verbose) - printf("%lu created\n", (unsigned long) time_tid); + printf("%lu created\n", (unsigned long)time_tid); void *ret; r = toku_pthread_join(time_tid, &ret); assert_zero(r); @@ -1817,17 +1829,22 @@ static int run_workers( // threads (i.e. there is some runaway thread). struct sleep_and_crash_extra sac_extra; ZERO_STRUCT(sac_extra); - toku_mutex_init(&sac_extra.mutex, nullptr); - toku_cond_init(&sac_extra.cond, nullptr); + toku_mutex_init(toku_uninstrumented, &sac_extra.mutex, nullptr); + toku_cond_init(toku_uninstrumented, &sac_extra.cond, nullptr); sac_extra.seconds = cli_args->join_timeout; sac_extra.is_setup = false; sac_extra.threads_have_joined = false; toku_mutex_lock(&sac_extra.mutex); toku_pthread_t sac_thread; - r = toku_pthread_create(&sac_thread, nullptr, sleep_and_crash, &sac_extra); + r = toku_pthread_create(toku_uninstrumented, + &sac_thread, + nullptr, + sleep_and_crash, + &sac_extra); assert_zero(r); - // Wait for sleep_and_crash thread to get set up, spinning is ok, this should be quick. + // Wait for sleep_and_crash thread to get set up, spinning is ok, this + // should be quick. while (!sac_extra.is_setup) { toku_mutex_unlock(&sac_extra.mutex); r = toku_pthread_yield(); diff --git a/storage/tokudb/PerconaFT/src/tests/txn_manager_handle_snapshot_atomicity.cc b/storage/tokudb/PerconaFT/src/tests/txn_manager_handle_snapshot_atomicity.cc index 30cc16d7..469e78f4 100644 --- a/storage/tokudb/PerconaFT/src/tests/txn_manager_handle_snapshot_atomicity.cc +++ b/storage/tokudb/PerconaFT/src/tests/txn_manager_handle_snapshot_atomicity.cc @@ -52,8 +52,8 @@ struct test_sync { static void test_sync_init(struct test_sync *UU(sync)) { #if TOKU_DEBUG_TXN_SYNC sync->state = 0; - toku_mutex_init(&sync->lock, NULL); - toku_cond_init(&sync->cv, NULL); + toku_mutex_init(toku_uninstrumented, &sync->lock, nullptr); + toku_cond_init(toku_uninstrumented, &sync->cv, nullptr); #endif } diff --git a/storage/tokudb/PerconaFT/src/ydb.cc b/storage/tokudb/PerconaFT/src/ydb.cc index 1edfe9c8..41f48d4e 100644 --- a/storage/tokudb/PerconaFT/src/ydb.cc +++ b/storage/tokudb/PerconaFT/src/ydb.cc @@ -227,7 +227,7 @@ env_fs_poller(void *arg) { int in_red; // set true to prevent certain operations (returning ENOSPC) // get the fs sizes for the home dir - uint64_t avail_size, total_size; + uint64_t avail_size = 0, total_size = 0; r = toku_get_filesystem_sizes(env->i->dir, &avail_size, NULL, &total_size); assert(r == 0); in_yellow = (avail_size < 2 * env_fs_redzone(env, total_size)); @@ -643,7 +643,7 @@ static int validate_env(DB_ENV *env, path = toku_construct_full_name( 2, env->i->dir, toku_product_name_strings.environmentdictionary); assert(path); - r = toku_stat(path, &buf); + r = toku_stat(path, &buf, toku_uninstrumented); if (r == 0) { expect_newenv = false; // persistent info exists } else { @@ -668,7 +668,7 @@ static int validate_env(DB_ENV *env, path = toku_construct_full_name( 2, env->i->dir, toku_product_name_strings.rollback_cachefile); assert(path); - r = toku_stat(path, &buf); + r = toku_stat(path, &buf, toku_uninstrumented); if (r == 0) { if (expect_newenv) // rollback cachefile exists, but persistent env // is missing @@ -710,7 +710,7 @@ static int validate_env(DB_ENV *env, path = toku_construct_full_name( 2, env->i->dir, toku_product_name_strings.fileopsdirectory); assert(path); - r = toku_stat(path, &buf); + r = toku_stat(path, &buf, toku_uninstrumented); if (r == 0) { if (expect_newenv) // fileops directory exists, but persistent env // is missing @@ -856,10 +856,11 @@ env_open(DB_ENV * env, const char *home, uint32_t flags, int mode) { // Verify that the home exists. toku_struct_stat buf; - r = toku_stat(home, &buf); + r = toku_stat(home, &buf, toku_uninstrumented); if (r != 0) { int e = get_error_errno(); - r = toku_ydb_do_error(env, e, "Error from toku_stat(\"%s\",...)\n", home); + r = toku_ydb_do_error( + env, e, "Error from toku_stat(\"%s\",...)\n", home); goto cleanup; } unused_flags &= ~DB_PRIVATE; @@ -875,13 +876,22 @@ env_open(DB_ENV * env, const char *home, uint32_t flags, int mode) { env->i->open_flags = flags; env->i->open_mode = mode; + // Instrumentation probe start + TOKU_PROBE_START(toku_instr_probe_1); + env_setup_real_data_dir(env); env_setup_real_log_dir(env); env_setup_real_tmp_dir(env); - r = toku_single_process_lock(env->i->dir, "environment", &env->i->envdir_lockfd); - if (r!=0) goto cleanup; - r = toku_single_process_lock(env->i->real_data_dir, "data", &env->i->datadir_lockfd); + // Instrumentation probe stop + toku_instr_probe_1->stop(); + + r = toku_single_process_lock( + env->i->dir, "environment", &env->i->envdir_lockfd); + if (r != 0) + goto cleanup; + r = toku_single_process_lock( + env->i->real_data_dir, "data", &env->i->datadir_lockfd); if (r!=0) goto cleanup; r = toku_single_process_lock(env->i->real_log_dir, "logs", &env->i->logdir_lockfd); if (r!=0) goto cleanup; @@ -2931,7 +2941,8 @@ toku_env_create(DB_ENV ** envp, uint32_t flags) { result->i->open_dbs_by_dname->create(); XMALLOC(result->i->open_dbs_by_dict_id); result->i->open_dbs_by_dict_id->create(); - toku_pthread_rwlock_init(&result->i->open_dbs_rwlock, NULL); + toku_pthread_rwlock_init( + *result_i_open_dbs_rwlock_key, &result->i->open_dbs_rwlock, nullptr); *envp = result; r = 0; diff --git a/storage/tokudb/PerconaFT/src/ydb_db.cc b/storage/tokudb/PerconaFT/src/ydb_db.cc index 100d1bfa..40c4a7f6 100644 --- a/storage/tokudb/PerconaFT/src/ydb_db.cc +++ b/storage/tokudb/PerconaFT/src/ydb_db.cc @@ -83,53 +83,56 @@ ydb_db_layer_get_status(YDB_DB_LAYER_STATUS statp) { *statp = ydb_db_layer_status; } -void create_iname_hint(const char *dname, char *hint) { +void create_iname_hint(DB_ENV *env, const char *dname, char *hint) { //Requires: size of hint array must be > strlen(dname) //Copy alphanumeric characters only. //Replace strings of non-alphanumeric characters with a single underscore. - bool underscored = false; - while (*dname) { - if (isalnum(*dname)) { - char c = *dname++; - *hint++ = c; - underscored = false; - } - else { - if (!underscored) - *hint++ = '_'; - dname++; - underscored = true; + if (env->get_dir_per_db(env) && !toku_os_is_absolute_name(dname)) { + assert(dname); + if (*dname == '.') + ++dname; + if (*dname == '/') + ++dname; + bool underscored = false; + bool dbdir_is_parsed = false; + // Do not change the first '/' because this is + // delimiter which splits name into database dir + // and table dir. + while (*dname) { + if (isalnum(*dname) || (*dname == '/' && !dbdir_is_parsed)) { + char c = *dname++; + *hint++ = c; + if (c == '/') + dbdir_is_parsed = true; + underscored = false; + } else if (!dbdir_is_parsed) { + char c = *dname++; + *hint++ = c; + } else { + if (!underscored) + *hint++ = '_'; + dname++; + underscored = true; + } } - } - *hint = '\0'; -} - -void create_iname_hint_for_dbdir(const char *dname, char *hint) { - assert(dname); - if (*dname == '.') - ++dname; - if (*dname == '/') - ++dname; - bool underscored = false; - bool dbdir_is_parsed = false; - // Do not change the first '/' because this is - // delimiter which splits name into database dir - // and table dir. - while (*dname) { - if (isalnum(*dname) || (*dname == '/' && !dbdir_is_parsed)) { - char c = *dname++; - *hint++ = c; - if (c == '/') - dbdir_is_parsed = true; - underscored = false; - } else { - if (!underscored) - *hint++ = '_'; - dname++; - underscored = true; + *hint = '\0'; + } else { + bool underscored = false; + while (*dname) { + if (isalnum(*dname)) { + char c = *dname++; + *hint++ = c; + underscored = false; + } + else { + if (!underscored) + *hint++ = '_'; + dname++; + underscored = true; + } } + *hint = '\0'; } - *hint = '\0'; } // n < 0 means to ignore mark and ignore n @@ -187,10 +190,7 @@ std::unique_ptr generate_iname_for_rename_or_open( } else if (is_open) id1 = toku_sync_fetch_and_add(&nontransactional_open_id, 1); - if (env->get_dir_per_db(env) && !toku_os_is_absolute_name(dname)) - create_iname_hint_for_dbdir(dname, hint); - else - create_iname_hint(dname, hint); + create_iname_hint(env, dname, hint); result.reset(create_iname(env, id1, id2, hint, NULL, -1)); @@ -1221,15 +1221,18 @@ load_inames(DB_ENV * env, DB_TXN * txn, int N, DB * dbs[/*N*/], const char * new for (i = 0; i < N; i++) { char * dname = dbs[i]->i->dname; toku_fill_dbt(&dname_dbt, dname, strlen(dname)+1); + // now create new iname char hint[strlen(dname) + 1]; - if (env->get_dir_per_db(env) && !toku_os_is_absolute_name(dname)) - create_iname_hint_for_dbdir(dname, hint); - else - create_iname_hint(dname, hint); - const char *new_iname = create_iname(env, xid.parent_id64, xid.child_id64, hint, mark, i); // allocates memory for iname_in_env + create_iname_hint(env, dname, hint); + + // allocates memory for iname_in_env + const char *new_iname = + create_iname(env, xid.parent_id64, xid.child_id64, hint, mark, i); new_inames_in_env[i] = new_iname; - toku_fill_dbt(&iname_dbt, new_iname, strlen(new_iname) + 1); // iname_in_env goes in directory + + // iname_in_env goes in directory + toku_fill_dbt(&iname_dbt, new_iname, strlen(new_iname) + 1); rval = toku_db_put(env->i->directory, txn, &dname_dbt, &iname_dbt, 0, true); if (rval) break; } diff --git a/storage/tokudb/PerconaFT/src/ydb_db.h b/storage/tokudb/PerconaFT/src/ydb_db.h index 8be28857..ab8fcd2a 100644 --- a/storage/tokudb/PerconaFT/src/ydb_db.h +++ b/storage/tokudb/PerconaFT/src/ydb_db.h @@ -122,8 +122,7 @@ toku_db_destruct_autotxn(DB_TXN *txn, int r, bool changed) { return r; } -void create_iname_hint_for_dbdir(const char *dname, char *hint); -void create_iname_hint(const char *dname, char *hint); +void create_iname_hint(DB_ENV *env, const char *dname, char *hint); char *create_iname(DB_ENV *env, uint64_t id1, uint64_t id2, diff --git a/storage/tokudb/PerconaFT/src/ydb_env_func.cc b/storage/tokudb/PerconaFT/src/ydb_env_func.cc index 13c56fec..b8f0a634 100644 --- a/storage/tokudb/PerconaFT/src/ydb_env_func.cc +++ b/storage/tokudb/PerconaFT/src/ydb_env_func.cc @@ -109,7 +109,7 @@ void db_env_set_func_pread (ssize_t (*fun)(int, void *, size_t, off_t)) { } void db_env_set_func_loader_fwrite (size_t (*fwrite_fun)(const void*,size_t,size_t,FILE*)) { - ft_loader_set_os_fwrite(fwrite_fun); + toku_set_func_fwrite(fwrite_fun); } void db_env_set_func_malloc (void *(*f)(size_t)) { diff --git a/storage/tokudb/PerconaFT/src/ydb_txn.cc b/storage/tokudb/PerconaFT/src/ydb_txn.cc index 40b47905..dd5fb3b8 100644 --- a/storage/tokudb/PerconaFT/src/ydb_txn.cc +++ b/storage/tokudb/PerconaFT/src/ydb_txn.cc @@ -540,10 +540,12 @@ int toku_txn_begin(DB_ENV *env, DB_TXN * stxn, DB_TXN ** txn, uint32_t flags) { db_txn_struct_i(result)->iso = child_isolation; db_txn_struct_i(result)->lt_map.create_no_array(); - toku_mutex_init(&db_txn_struct_i(result)->txn_mutex, NULL); + toku_mutex_init(*db_txn_struct_i_txn_mutex_key, + &db_txn_struct_i(result)->txn_mutex, + nullptr); TXN_SNAPSHOT_TYPE snapshot_type; - switch(db_txn_struct_i(result)->iso){ + switch (db_txn_struct_i(result)->iso) { case(TOKU_ISO_SNAPSHOT): { snapshot_type = TXN_SNAPSHOT_ROOT; @@ -603,7 +605,9 @@ void toku_keep_prepared_txn_callback (DB_ENV *env, TOKUTXN tokutxn) { toku_txn_set_container_db_txn(tokutxn, result); - toku_mutex_init(&db_txn_struct_i(result)->txn_mutex, NULL); + toku_mutex_init(*db_txn_struct_i_txn_mutex_key, + &db_txn_struct_i(result)->txn_mutex, + nullptr); } // Test-only function diff --git a/storage/tokudb/PerconaFT/tools/CMakeLists.txt b/storage/tokudb/PerconaFT/tools/CMakeLists.txt index e6540bf6..af40a838 100644 --- a/storage/tokudb/PerconaFT/tools/CMakeLists.txt +++ b/storage/tokudb/PerconaFT/tools/CMakeLists.txt @@ -12,6 +12,7 @@ foreach(tool ${tools}) (CMAKE_CXX_FLAGS_DEBUG MATCHES " -DENABLED_DEBUG_SYNC")) target_link_libraries(${tool} sql) endif() + target_link_libraries(${tool} mysqlclient) endif () add_space_separated_property(TARGET ${tool} COMPILE_FLAGS -fvisibility=hidden) diff --git a/storage/tokudb/PerconaFT/util/dbt.cc b/storage/tokudb/PerconaFT/util/dbt.cc index 5bc1cb74..b6d2a584 100644 --- a/storage/tokudb/PerconaFT/util/dbt.cc +++ b/storage/tokudb/PerconaFT/util/dbt.cc @@ -199,7 +199,8 @@ int toku_dbt_set(uint32_t len, const void *val, DBT *d, struct simple_dbt *sdbt) case (DB_DBT_MALLOC): d->data = NULL; d->ulen = 0; - //Fall through to DB_DBT_REALLOC + // fallthrough + // to DB_DBT_REALLOC case (DB_DBT_REALLOC): if (d->ulen < len) { d->ulen = len*2; diff --git a/storage/tokudb/PerconaFT/util/fmutex.h b/storage/tokudb/PerconaFT/util/fmutex.h index 9ff95978..fed1bc24 100644 --- a/storage/tokudb/PerconaFT/util/fmutex.h +++ b/storage/tokudb/PerconaFT/util/fmutex.h @@ -38,6 +38,8 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #pragma once +extern toku_instr_key *fmutex_cond_key; + // fair mutex struct fmutex { pthread_mutex_t mutex; @@ -98,8 +100,8 @@ void fmutex_lock(struct fmutex *fm) { } pthread_cond_t cond; - pthread_cond_init(&cond, NULL); - struct queue_item item = { .cond = &cond, .next = NULL }; + pthread_cond_init(*fmutex_cond_key, &cond, nullptr); + struct queue_item item = {.cond = &cond, .next = NULL}; enq_item(fm, &item); // Wait for our turn. diff --git a/storage/tokudb/PerconaFT/util/frwlock.cc b/storage/tokudb/PerconaFT/util/frwlock.cc index ce1e33e8..1f821fe5 100644 --- a/storage/tokudb/PerconaFT/util/frwlock.cc +++ b/storage/tokudb/PerconaFT/util/frwlock.cc @@ -41,271 +41,311 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include #include +toku_instr_key *frwlock_m_wait_read_key; + namespace toku { -static __thread int thread_local_tid = -1; -static int get_local_tid() { - if (thread_local_tid == -1) { - thread_local_tid = toku_os_gettid(); - } - return thread_local_tid; -} - -void frwlock::init(toku_mutex_t *const mutex) { - m_mutex = mutex; - - m_num_readers = 0; - m_num_writers = 0; - m_num_want_write = 0; - m_num_want_read = 0; - m_num_signaled_readers = 0; - m_num_expensive_want_write = 0; - - toku_cond_init(&m_wait_read, nullptr); - m_queue_item_read.cond = &m_wait_read; - m_queue_item_read.next = nullptr; - m_wait_read_is_in_queue = false; - m_current_writer_expensive = false; - m_read_wait_expensive = false; - m_current_writer_tid = -1; - m_blocking_writer_context_id = CTX_INVALID; - - m_wait_head = nullptr; - m_wait_tail = nullptr; -} - -void frwlock::deinit(void) { - toku_cond_destroy(&m_wait_read); -} - -bool frwlock::queue_is_empty(void) const { - return m_wait_head == nullptr; -} - -void frwlock::enq_item(queue_item *const item) { - paranoid_invariant_null(item->next); - if (m_wait_tail != nullptr) { - m_wait_tail->next = item; - } else { - paranoid_invariant_null(m_wait_head); - m_wait_head = item; + static __thread int thread_local_tid = -1; + static int get_local_tid() { + if (thread_local_tid == -1) { + thread_local_tid = toku_os_gettid(); + } + return thread_local_tid; } - m_wait_tail = item; -} - -toku_cond_t *frwlock::deq_item(void) { - paranoid_invariant_notnull(m_wait_head); - paranoid_invariant_notnull(m_wait_tail); - queue_item *item = m_wait_head; - m_wait_head = m_wait_head->next; - if (m_wait_tail == item) { + + void frwlock::init(toku_mutex_t *const mutex +#if defined(TOKU_MYSQL_WITH_PFS) + , + const toku_instr_key &rwlock_instr_key +#endif + ) { + m_mutex = mutex; + + m_num_readers = 0; + m_num_writers = 0; + m_num_want_write = 0; + m_num_want_read = 0; + m_num_signaled_readers = 0; + m_num_expensive_want_write = 0; +#if defined(TOKU_MYSQL_WITH_PFS) + toku_pthread_rwlock_init(rwlock_instr_key, &m_rwlock, nullptr); +#endif + toku_cond_init(toku_uninstrumented, &m_wait_read, nullptr); + m_queue_item_read.cond = &m_wait_read; + m_queue_item_read.next = nullptr; + m_wait_read_is_in_queue = false; + m_current_writer_expensive = false; + m_read_wait_expensive = false; + m_current_writer_tid = -1; + m_blocking_writer_context_id = CTX_INVALID; + + m_wait_head = nullptr; m_wait_tail = nullptr; } - return item->cond; -} - -// Prerequisite: Holds m_mutex. -void frwlock::write_lock(bool expensive) { - toku_mutex_assert_locked(m_mutex); - if (this->try_write_lock(expensive)) { - return; + + void frwlock::deinit(void) { + toku_cond_destroy(&m_wait_read); +#if defined(TOKU_MYSQL_WITH_PFS) + toku_pthread_rwlock_destroy(&m_rwlock); +#endif } - toku_cond_t cond = TOKU_COND_INITIALIZER; - queue_item item = { .cond = &cond, .next = nullptr }; - this->enq_item(&item); + bool frwlock::queue_is_empty(void) const { return m_wait_head == nullptr; } - // Wait for our turn. - ++m_num_want_write; - if (expensive) { - ++m_num_expensive_want_write; - } - if (m_num_writers == 0 && m_num_want_write == 1) { - // We are the first to want a write lock. No new readers can get the lock. - // Set our thread id and context for proper instrumentation. - // see: toku_context_note_frwlock_contention() - m_current_writer_tid = get_local_tid(); - m_blocking_writer_context_id = toku_thread_get_context()->get_id(); - } - toku_cond_wait(&cond, m_mutex); - toku_cond_destroy(&cond); - - // Now it's our turn. - paranoid_invariant(m_num_want_write > 0); - paranoid_invariant_zero(m_num_readers); - paranoid_invariant_zero(m_num_writers); - paranoid_invariant_zero(m_num_signaled_readers); - - // Not waiting anymore; grab the lock. - --m_num_want_write; - if (expensive) { - --m_num_expensive_want_write; + void frwlock::enq_item(queue_item *const item) { + paranoid_invariant_null(item->next); + if (m_wait_tail != nullptr) { + m_wait_tail->next = item; + } else { + paranoid_invariant_null(m_wait_head); + m_wait_head = item; + } + m_wait_tail = item; } - m_num_writers = 1; - m_current_writer_expensive = expensive; - m_current_writer_tid = get_local_tid(); - m_blocking_writer_context_id = toku_thread_get_context()->get_id(); -} - -bool frwlock::try_write_lock(bool expensive) { - toku_mutex_assert_locked(m_mutex); - if (m_num_readers > 0 || m_num_writers > 0 || m_num_signaled_readers > 0 || m_num_want_write > 0) { - return false; + + toku_cond_t *frwlock::deq_item(void) { + paranoid_invariant_notnull(m_wait_head); + paranoid_invariant_notnull(m_wait_tail); + queue_item *item = m_wait_head; + m_wait_head = m_wait_head->next; + if (m_wait_tail == item) { + m_wait_tail = nullptr; + } + return item->cond; } - // No one holds the lock. Grant the write lock. - paranoid_invariant_zero(m_num_want_write); - paranoid_invariant_zero(m_num_want_read); - m_num_writers = 1; - m_current_writer_expensive = expensive; - m_current_writer_tid = get_local_tid(); - m_blocking_writer_context_id = toku_thread_get_context()->get_id(); - return true; -} - -void frwlock::read_lock(void) { - toku_mutex_assert_locked(m_mutex); - if (m_num_writers > 0 || m_num_want_write > 0) { - if (!m_wait_read_is_in_queue) { - // Throw the read cond_t onto the queue. - paranoid_invariant(m_num_signaled_readers == m_num_want_read); - m_queue_item_read.next = nullptr; - this->enq_item(&m_queue_item_read); - m_wait_read_is_in_queue = true; - paranoid_invariant(!m_read_wait_expensive); - m_read_wait_expensive = ( - m_current_writer_expensive || - (m_num_expensive_want_write > 0) - ); + + // Prerequisite: Holds m_mutex. + void frwlock::write_lock(bool expensive) { +#if defined(TOKU_MYSQL_WITH_PFS) + /* Instrumentation start */ + toku_rwlock_instrumentation rwlock_instr; + toku_instr_rwlock_wrlock_wait_start( + rwlock_instr, m_rwlock, __FILE__, __LINE__); +#endif + + toku_mutex_assert_locked(m_mutex); + if (this->try_write_lock(expensive)) { +#if defined(TOKU_MYSQL_WITH_PFS) + /* Instrumentation end */ + toku_instr_rwlock_wrlock_wait_end(rwlock_instr, 0); +#endif + return; } - // Note this contention event in engine status. - toku_context_note_frwlock_contention( - toku_thread_get_context()->get_id(), - m_blocking_writer_context_id - ); + toku_cond_t cond = TOKU_COND_INITIALIZER; + queue_item item = {.cond = &cond, .next = nullptr}; + this->enq_item(&item); // Wait for our turn. - ++m_num_want_read; - toku_cond_wait(&m_wait_read, m_mutex); + ++m_num_want_write; + if (expensive) { + ++m_num_expensive_want_write; + } + if (m_num_writers == 0 && m_num_want_write == 1) { + // We are the first to want a write lock. No new readers can get the + // lock. + // Set our thread id and context for proper instrumentation. + // see: toku_context_note_frwlock_contention() + m_current_writer_tid = get_local_tid(); + m_blocking_writer_context_id = toku_thread_get_context()->get_id(); + } + toku_cond_wait(&cond, m_mutex); + toku_cond_destroy(&cond); // Now it's our turn. + paranoid_invariant(m_num_want_write > 0); + paranoid_invariant_zero(m_num_readers); paranoid_invariant_zero(m_num_writers); - paranoid_invariant(m_num_want_read > 0); - paranoid_invariant(m_num_signaled_readers > 0); + paranoid_invariant_zero(m_num_signaled_readers); // Not waiting anymore; grab the lock. - --m_num_want_read; - --m_num_signaled_readers; + --m_num_want_write; + if (expensive) { + --m_num_expensive_want_write; + } + m_num_writers = 1; + m_current_writer_expensive = expensive; + m_current_writer_tid = get_local_tid(); + m_blocking_writer_context_id = toku_thread_get_context()->get_id(); + +#if defined(TOKU_MYSQL_WITH_PFS) + /* Instrumentation end */ + toku_instr_rwlock_wrlock_wait_end(rwlock_instr, 0); +#endif + } + + bool frwlock::try_write_lock(bool expensive) { + toku_mutex_assert_locked(m_mutex); + if (m_num_readers > 0 || m_num_writers > 0 || + m_num_signaled_readers > 0 || m_num_want_write > 0) { + return false; + } + // No one holds the lock. Grant the write lock. + paranoid_invariant_zero(m_num_want_write); + paranoid_invariant_zero(m_num_want_read); + m_num_writers = 1; + m_current_writer_expensive = expensive; + m_current_writer_tid = get_local_tid(); + m_blocking_writer_context_id = toku_thread_get_context()->get_id(); + return true; } - ++m_num_readers; -} -bool frwlock::try_read_lock(void) { - toku_mutex_assert_locked(m_mutex); - if (m_num_writers > 0 || m_num_want_write > 0) { - return false; + void frwlock::read_lock(void) { +#if defined(TOKU_MYSQL_WITH_PFS) + /* Instrumentation start */ + toku_rwlock_instrumentation rwlock_instr; + toku_instr_rwlock_rdlock_wait_start( + rwlock_instr, m_rwlock, __FILE__, __LINE__); +#endif + toku_mutex_assert_locked(m_mutex); + if (m_num_writers > 0 || m_num_want_write > 0) { + if (!m_wait_read_is_in_queue) { + // Throw the read cond_t onto the queue. + paranoid_invariant(m_num_signaled_readers == m_num_want_read); + m_queue_item_read.next = nullptr; + this->enq_item(&m_queue_item_read); + m_wait_read_is_in_queue = true; + paranoid_invariant(!m_read_wait_expensive); + m_read_wait_expensive = (m_current_writer_expensive || + (m_num_expensive_want_write > 0)); + } + + // Note this contention event in engine status. + toku_context_note_frwlock_contention( + toku_thread_get_context()->get_id(), + m_blocking_writer_context_id); + + // Wait for our turn. + ++m_num_want_read; + toku_cond_wait(&m_wait_read, m_mutex); + + // Now it's our turn. + paranoid_invariant_zero(m_num_writers); + paranoid_invariant(m_num_want_read > 0); + paranoid_invariant(m_num_signaled_readers > 0); + + // Not waiting anymore; grab the lock. + --m_num_want_read; + --m_num_signaled_readers; + } + ++m_num_readers; +#if defined(TOKU_MYSQL_WITH_PFS) + /* Instrumentation end */ + toku_instr_rwlock_rdlock_wait_end(rwlock_instr, 0); +#endif } - // No writer holds the lock. - // No writers are waiting. - // Grant the read lock. - ++m_num_readers; - return true; -} - -void frwlock::maybe_signal_next_writer(void) { - if (m_num_want_write > 0 && m_num_signaled_readers == 0 && m_num_readers == 0) { - toku_cond_t *cond = this->deq_item(); - paranoid_invariant(cond != &m_wait_read); - // Grant write lock to waiting writer. - paranoid_invariant(m_num_want_write > 0); - toku_cond_signal(cond); + + bool frwlock::try_read_lock(void) { + toku_mutex_assert_locked(m_mutex); + if (m_num_writers > 0 || m_num_want_write > 0) { + return false; + } + // No writer holds the lock. + // No writers are waiting. + // Grant the read lock. + ++m_num_readers; + return true; } -} - -void frwlock::read_unlock(void) { - toku_mutex_assert_locked(m_mutex); - paranoid_invariant(m_num_writers == 0); - paranoid_invariant(m_num_readers > 0); - --m_num_readers; - this->maybe_signal_next_writer(); -} - -bool frwlock::read_lock_is_expensive(void) { - toku_mutex_assert_locked(m_mutex); - if (m_wait_read_is_in_queue) { - return m_read_wait_expensive; + + void frwlock::maybe_signal_next_writer(void) { + if (m_num_want_write > 0 && m_num_signaled_readers == 0 && + m_num_readers == 0) { + toku_cond_t *cond = this->deq_item(); + paranoid_invariant(cond != &m_wait_read); + // Grant write lock to waiting writer. + paranoid_invariant(m_num_want_write > 0); + toku_cond_signal(cond); + } + } + + void frwlock::read_unlock(void) { +#ifdef TOKU_MYSQL_WITH_PFS + toku_instr_rwlock_unlock(m_rwlock); +#endif + toku_mutex_assert_locked(m_mutex); + paranoid_invariant(m_num_writers == 0); + paranoid_invariant(m_num_readers > 0); + --m_num_readers; + this->maybe_signal_next_writer(); } - else { - return m_current_writer_expensive || (m_num_expensive_want_write > 0); + + bool frwlock::read_lock_is_expensive(void) { + toku_mutex_assert_locked(m_mutex); + if (m_wait_read_is_in_queue) { + return m_read_wait_expensive; + } else { + return m_current_writer_expensive || + (m_num_expensive_want_write > 0); + } } -} + void frwlock::maybe_signal_or_broadcast_next(void) { + paranoid_invariant(m_num_signaled_readers == 0); -void frwlock::maybe_signal_or_broadcast_next(void) { - paranoid_invariant(m_num_signaled_readers == 0); + if (this->queue_is_empty()) { + paranoid_invariant(m_num_want_write == 0); + paranoid_invariant(m_num_want_read == 0); + return; + } + toku_cond_t *cond = this->deq_item(); + if (cond == &m_wait_read) { + // Grant read locks to all waiting readers + paranoid_invariant(m_wait_read_is_in_queue); + paranoid_invariant(m_num_want_read > 0); + m_num_signaled_readers = m_num_want_read; + m_wait_read_is_in_queue = false; + m_read_wait_expensive = false; + toku_cond_broadcast(cond); + } else { + // Grant write lock to waiting writer. + paranoid_invariant(m_num_want_write > 0); + toku_cond_signal(cond); + } + } - if (this->queue_is_empty()) { - paranoid_invariant(m_num_want_write == 0); - paranoid_invariant(m_num_want_read == 0); - return; + void frwlock::write_unlock(void) { +#if defined(TOKU_MYSQL_WITH_PFS) + toku_instr_rwlock_unlock(m_rwlock); +#endif + toku_mutex_assert_locked(m_mutex); + paranoid_invariant(m_num_writers == 1); + m_num_writers = 0; + m_current_writer_expensive = false; + m_current_writer_tid = -1; + m_blocking_writer_context_id = CTX_INVALID; + this->maybe_signal_or_broadcast_next(); } - toku_cond_t *cond = this->deq_item(); - if (cond == &m_wait_read) { - // Grant read locks to all waiting readers - paranoid_invariant(m_wait_read_is_in_queue); - paranoid_invariant(m_num_want_read > 0); - m_num_signaled_readers = m_num_want_read; - m_wait_read_is_in_queue = false; - m_read_wait_expensive = false; - toku_cond_broadcast(cond); + bool frwlock::write_lock_is_expensive(void) { + toku_mutex_assert_locked(m_mutex); + return (m_num_expensive_want_write > 0) || (m_current_writer_expensive); } - else { - // Grant write lock to waiting writer. - paranoid_invariant(m_num_want_write > 0); - toku_cond_signal(cond); + + uint32_t frwlock::users(void) const { + toku_mutex_assert_locked(m_mutex); + return m_num_readers + m_num_writers + m_num_want_read + + m_num_want_write; + } + uint32_t frwlock::blocked_users(void) const { + toku_mutex_assert_locked(m_mutex); + return m_num_want_read + m_num_want_write; + } + uint32_t frwlock::writers(void) const { + // this is sometimes called as "assert(lock->writers())" when we + // assume we have the write lock. if that's the assumption, we may + // not own the mutex, so we don't assert_locked here + return m_num_writers; + } + uint32_t frwlock::blocked_writers(void) const { + toku_mutex_assert_locked(m_mutex); + return m_num_want_write; + } + uint32_t frwlock::readers(void) const { + toku_mutex_assert_locked(m_mutex); + return m_num_readers; + } + uint32_t frwlock::blocked_readers(void) const { + toku_mutex_assert_locked(m_mutex); + return m_num_want_read; } -} - -void frwlock::write_unlock(void) { - toku_mutex_assert_locked(m_mutex); - paranoid_invariant(m_num_writers == 1); - m_num_writers = 0; - m_current_writer_expensive = false; - m_current_writer_tid = -1; - m_blocking_writer_context_id = CTX_INVALID; - this->maybe_signal_or_broadcast_next(); -} -bool frwlock::write_lock_is_expensive(void) { - toku_mutex_assert_locked(m_mutex); - return (m_num_expensive_want_write > 0) || (m_current_writer_expensive); -} - - -uint32_t frwlock::users(void) const { - toku_mutex_assert_locked(m_mutex); - return m_num_readers + m_num_writers + m_num_want_read + m_num_want_write; -} -uint32_t frwlock::blocked_users(void) const { - toku_mutex_assert_locked(m_mutex); - return m_num_want_read + m_num_want_write; -} -uint32_t frwlock::writers(void) const { - // this is sometimes called as "assert(lock->writers())" when we - // assume we have the write lock. if that's the assumption, we may - // not own the mutex, so we don't assert_locked here - return m_num_writers; -} -uint32_t frwlock::blocked_writers(void) const { - toku_mutex_assert_locked(m_mutex); - return m_num_want_write; -} -uint32_t frwlock::readers(void) const { - toku_mutex_assert_locked(m_mutex); - return m_num_readers; -} -uint32_t frwlock::blocked_readers(void) const { - toku_mutex_assert_locked(m_mutex); - return m_num_want_read; -} } // namespace toku diff --git a/storage/tokudb/PerconaFT/util/frwlock.h b/storage/tokudb/PerconaFT/util/frwlock.h index 52b98a8d..b02d95e5 100644 --- a/storage/tokudb/PerconaFT/util/frwlock.h +++ b/storage/tokudb/PerconaFT/util/frwlock.h @@ -48,76 +48,82 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. namespace toku { -class frwlock { -public: - - void init(toku_mutex_t *const mutex); - void deinit(void); - - void write_lock(bool expensive); - bool try_write_lock(bool expensive); - void write_unlock(void); - // returns true if acquiring a write lock will be expensive - bool write_lock_is_expensive(void); - - void read_lock(void); - bool try_read_lock(void); - void read_unlock(void); - // returns true if acquiring a read lock will be expensive - bool read_lock_is_expensive(void); - - uint32_t users(void) const; - uint32_t blocked_users(void) const; - uint32_t writers(void) const; - uint32_t blocked_writers(void) const; - uint32_t readers(void) const; - uint32_t blocked_readers(void) const; - -private: - struct queue_item { - toku_cond_t *cond; - struct queue_item *next; + class frwlock { + public: + void init(toku_mutex_t *const mutex +#if defined(TOKU_MYSQL_WITH_PFS) + , + const toku_instr_key &rwlock_instr_key +#endif + ); + void deinit(void); + + void write_lock(bool expensive); + bool try_write_lock(bool expensive); + void write_unlock(void); + // returns true if acquiring a write lock will be expensive + bool write_lock_is_expensive(void); + + void read_lock(void); + bool try_read_lock(void); + void read_unlock(void); + // returns true if acquiring a read lock will be expensive + bool read_lock_is_expensive(void); + + uint32_t users(void) const; + uint32_t blocked_users(void) const; + uint32_t writers(void) const; + uint32_t blocked_writers(void) const; + uint32_t readers(void) const; + uint32_t blocked_readers(void) const; + + private: + struct queue_item { + toku_cond_t *cond; + struct queue_item *next; + }; + + bool queue_is_empty(void) const; + void enq_item(queue_item *const item); + toku_cond_t *deq_item(void); + void maybe_signal_or_broadcast_next(void); + void maybe_signal_next_writer(void); + + toku_mutex_t *m_mutex; + + uint32_t m_num_readers; + uint32_t m_num_writers; + uint32_t m_num_want_write; + uint32_t m_num_want_read; + uint32_t m_num_signaled_readers; + // number of writers waiting that are expensive + // MUST be < m_num_want_write + uint32_t m_num_expensive_want_write; + // bool that states if the current writer is expensive + // if there is no current writer, then is false + bool m_current_writer_expensive; + // bool that states if waiting for a read + // is expensive + // if there are currently no waiting readers, then set to false + bool m_read_wait_expensive; + // thread-id of the current writer + int m_current_writer_tid; + // context id describing the context of the current writer blocking + // new readers (either because this writer holds the write lock or + // is the first to want the write lock). + context_id m_blocking_writer_context_id; + queue_item m_queue_item_read; + bool m_wait_read_is_in_queue; + + toku_cond_t m_wait_read; +#if defined(TOKU_MYSQL_WITH_PFS) + toku_pthread_rwlock_t m_rwlock; +#endif + queue_item *m_wait_head; + queue_item *m_wait_tail; }; - bool queue_is_empty(void) const; - void enq_item(queue_item *const item); - toku_cond_t *deq_item(void); - void maybe_signal_or_broadcast_next(void); - void maybe_signal_next_writer(void); - - toku_mutex_t *m_mutex; - - uint32_t m_num_readers; - uint32_t m_num_writers; - uint32_t m_num_want_write; - uint32_t m_num_want_read; - uint32_t m_num_signaled_readers; - // number of writers waiting that are expensive - // MUST be < m_num_want_write - uint32_t m_num_expensive_want_write; - // bool that states if the current writer is expensive - // if there is no current writer, then is false - bool m_current_writer_expensive; - // bool that states if waiting for a read - // is expensive - // if there are currently no waiting readers, then set to false - bool m_read_wait_expensive; - // thread-id of the current writer - int m_current_writer_tid; - // context id describing the context of the current writer blocking - // new readers (either because this writer holds the write lock or - // is the first to want the write lock). - context_id m_blocking_writer_context_id; - - toku_cond_t m_wait_read; - queue_item m_queue_item_read; - bool m_wait_read_is_in_queue; - - queue_item *m_wait_head; - queue_item *m_wait_tail; -}; - -ENSURE_POD(frwlock); + ENSURE_POD(frwlock); } // namespace toku diff --git a/storage/tokudb/PerconaFT/util/kibbutz.cc b/storage/tokudb/PerconaFT/util/kibbutz.cc index 7fc24bae..409bf6bd 100644 --- a/storage/tokudb/PerconaFT/util/kibbutz.cc +++ b/storage/tokudb/PerconaFT/util/kibbutz.cc @@ -72,14 +72,18 @@ struct kibbutz { uint64_t total_execution_time; }; -static void *work_on_kibbutz (void *); +static void *work_on_kibbutz(void *); -int toku_kibbutz_create (int n_workers, KIBBUTZ *kb_ret) { +toku_instr_key *kibbutz_mutex_key; +toku_instr_key *kibbutz_k_cond_key; +toku_instr_key *kibbutz_thread_key; + +int toku_kibbutz_create(int n_workers, KIBBUTZ *kb_ret) { int r = 0; *kb_ret = NULL; KIBBUTZ XCALLOC(k); - toku_mutex_init(&k->mutex, NULL); - toku_cond_init(&k->cond, NULL); + toku_mutex_init(*kibbutz_mutex_key, &k->mutex, nullptr); + toku_cond_init(*kibbutz_k_cond_key, &k->cond, nullptr); k->please_shutdown = false; k->head = NULL; k->tail = NULL; @@ -93,7 +97,11 @@ int toku_kibbutz_create (int n_workers, KIBBUTZ *kb_ret) { XMALLOC_N(n_workers, k->ids); for (int i = 0; i < n_workers; i++) { k->ids[i].k = k; - r = toku_pthread_create(&k->workers[i], NULL, work_on_kibbutz, &k->ids[i]); + r = toku_pthread_create(*kibbutz_thread_key, + &k->workers[i], + nullptr, + work_on_kibbutz, + &k->ids[i]); if (r != 0) { k->n_workers = i; toku_kibbutz_destroy(k); @@ -153,10 +161,14 @@ static void *work_on_kibbutz (void *kidv) { // if there's another item on k->head, then we'll just go grab it now, without waiting for a signal. } if (k->please_shutdown) { - // Don't follow this unless the work is all done, so that when we set please_shutdown, all the work finishes before any threads quit. - ksignal(k); // must wake up anyone else who is waiting, so they can shut down. + // Don't follow this unless the work is all done, so that when we + // set please_shutdown, all the work finishes before any threads + // quit. + ksignal(k); // must wake up anyone else who is waiting, so they can + // shut down. kunlock(k); - return NULL; + toku_instr_delete_current_thread(); + return nullptr; } // There is no work to do and it's not time to shutdown, so wait. kwait(k); diff --git a/storage/tokudb/PerconaFT/util/minicron.cc b/storage/tokudb/PerconaFT/util/minicron.cc index 737c6ef6..c1412015 100644 --- a/storage/tokudb/PerconaFT/util/minicron.cc +++ b/storage/tokudb/PerconaFT/util/minicron.cc @@ -43,8 +43,11 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "portability/toku_assert.h" #include "util/minicron.h" -static void -toku_gettime (toku_timespec_t *a) { +toku_instr_key *minicron_p_mutex_key; +toku_instr_key *minicron_p_condvar_key; +toku_instr_key *minicron_thread_key; + +static void toku_gettime(toku_timespec_t *a) { struct timeval tv; gettimeofday(&tv, 0); a->tv_sec = tv.tv_sec; @@ -74,7 +77,8 @@ minicron_do (void *pv) while (1) { if (p->do_shutdown) { toku_mutex_unlock(&p->mutex); - return 0; + toku_instr_delete_current_thread(); + return toku_pthread_done(nullptr); } if (p->period_in_ms == 0) { // if we aren't supposed to do it then just do an untimed wait. @@ -104,7 +108,8 @@ minicron_do (void *pv) // Now we woke up, and we should figure out what to do if (p->do_shutdown) { toku_mutex_unlock(&p->mutex); - return 0; + toku_instr_delete_current_thread(); + return toku_pthread_done(nullptr); } if (p->period_in_ms > 1000) { toku_timespec_t now; @@ -137,17 +142,17 @@ toku_minicron_setup(struct minicron *p, uint32_t period_in_ms, int(*f)(void *), p->f = f; p->arg = arg; toku_gettime(&p->time_of_last_call_to_f); - //printf("now=%.6f", p->time_of_last_call_to_f.tv_sec + p->time_of_last_call_to_f.tv_nsec*1e-9); - p->period_in_ms = period_in_ms; + // printf("now=%.6f", p->time_of_last_call_to_f.tv_sec + + // p->time_of_last_call_to_f.tv_nsec*1e-9); + p->period_in_ms = period_in_ms; p->do_shutdown = false; - toku_mutex_init(&p->mutex, 0); - toku_cond_init (&p->condvar, 0); - return toku_pthread_create(&p->thread, 0, minicron_do, p); + toku_mutex_init(*minicron_p_mutex_key, &p->mutex, nullptr); + toku_cond_init(*minicron_p_condvar_key, &p->condvar, nullptr); + return toku_pthread_create( + *minicron_thread_key, &p->thread, nullptr, minicron_do, p); } - -void -toku_minicron_change_period(struct minicron *p, uint32_t new_period) -{ + +void toku_minicron_change_period(struct minicron *p, uint32_t new_period) { toku_mutex_lock(&p->mutex); p->period_in_ms = new_period; toku_cond_signal(&p->condvar); diff --git a/storage/tokudb/PerconaFT/util/nb_mutex.h b/storage/tokudb/PerconaFT/util/nb_mutex.h index 3490c1b3..d777961a 100644 --- a/storage/tokudb/PerconaFT/util/nb_mutex.h +++ b/storage/tokudb/PerconaFT/util/nb_mutex.h @@ -49,35 +49,67 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. // increase parallelism at the expense of single thread performance, we // are experimenting with a single higher level lock. +extern toku_instr_key *nb_mutex_key; + typedef struct nb_mutex *NB_MUTEX; struct nb_mutex { - struct rwlock lock; + struct st_rwlock lock; +#if defined(TOKU_MYSQL_WITH_PFS) + toku_mutex_t toku_mutex; +#endif }; +#if defined(TOKU_MYSQL_WITH_PFS) +#define nb_mutex_init(MK, RK, M) \ + inline_nb_mutex_init(MK, RK, M) +#else +#define nb_mutex_init(MK, RK, M) inline_nb_mutex_init(M) +#endif + // initialize an nb mutex -static __attribute__((__unused__)) -void -nb_mutex_init(NB_MUTEX nb_mutex) { - rwlock_init(&nb_mutex->lock); +inline void inline_nb_mutex_init( +#if defined(TOKU_MYSQL_WITH_PFS) + const toku_instr_key &mutex_instr_key, + const toku_instr_key &rwlock_instr_key, +#endif + NB_MUTEX nb_mutex) { +#if defined(TOKU_MYSQL_WITH_PFS) + toku_mutex_init(mutex_instr_key, &nb_mutex->toku_mutex, nullptr); +#endif + rwlock_init(rwlock_instr_key, &nb_mutex->lock); } // destroy a read write lock -static __attribute__((__unused__)) -void -nb_mutex_destroy(NB_MUTEX nb_mutex) { +inline void nb_mutex_destroy(NB_MUTEX nb_mutex) { +#if defined(TOKU_MYSQL_WITH_PFS) + toku_instr_mutex_destroy(nb_mutex->toku_mutex.psi_mutex); +#endif rwlock_destroy(&nb_mutex->lock); } // obtain a write lock // expects: mutex is locked -static inline void nb_mutex_lock(NB_MUTEX nb_mutex, toku_mutex_t *mutex) { +inline void nb_mutex_lock(NB_MUTEX nb_mutex, toku_mutex_t *mutex) { +#ifdef TOKU_MYSQL_WITH_PFS + toku_mutex_instrumentation mutex_instr; + toku_instr_mutex_lock_start(mutex_instr, + *mutex, + __FILE__, + __LINE__); // TODO: pull these to caller? +#endif rwlock_write_lock(&nb_mutex->lock, mutex); +#if defined(TOKU_MYSQL_WITH_PFS) + toku_instr_mutex_lock_end(mutex_instr, 0); +#endif } // release a write lock // expects: mutex is locked -static inline void nb_mutex_unlock(NB_MUTEX nb_mutex) { +inline void nb_mutex_unlock(NB_MUTEX nb_mutex) { +#if defined(TOKU_MYSQL_WITH_PFS) + toku_instr_mutex_unlock(nb_mutex->toku_mutex.psi_mutex); +#endif rwlock_write_unlock(&nb_mutex->lock); } diff --git a/storage/tokudb/PerconaFT/util/queue.cc b/storage/tokudb/PerconaFT/util/queue.cc index 0716dfb2..39dfbbc6 100644 --- a/storage/tokudb/PerconaFT/util/queue.cc +++ b/storage/tokudb/PerconaFT/util/queue.cc @@ -44,6 +44,9 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "memory.h" #include +toku_instr_key *queue_result_mutex_key; +toku_instr_key *queue_result_cond_key; + struct qitem; struct qitem { @@ -81,11 +84,11 @@ int toku_queue_create (QUEUE *q, uint64_t weight_limit) if (result==NULL) return get_error_errno(); result->contents_weight = 0; result->weight_limit = weight_limit; - result->head = NULL; - result->tail = NULL; - result->eof = false; - toku_mutex_init(&result->mutex, NULL); - toku_cond_init(&result->cond, NULL); + result->head = NULL; + result->tail = NULL; + result->eof = false; + toku_mutex_init(*queue_result_mutex_key, &result->mutex, nullptr); + toku_cond_init(*queue_result_cond_key, &result->cond, nullptr); *q = result; return 0; } diff --git a/storage/tokudb/PerconaFT/util/rwlock.h b/storage/tokudb/PerconaFT/util/rwlock.h index 47f78df7..d9a13ba9 100644 --- a/storage/tokudb/PerconaFT/util/rwlock.h +++ b/storage/tokudb/PerconaFT/util/rwlock.h @@ -39,6 +39,8 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #pragma once #include +#include +#include /* Readers/writers locks implementation * @@ -147,53 +149,81 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. // increase parallelism at the expense of single thread performance, we // are experimenting with a single higher level lock. -typedef struct rwlock *RWLOCK; -struct rwlock { - int reader; // the number of readers - int want_read; // the number of blocked readers +extern toku_instr_key *rwlock_cond_key; +extern toku_instr_key *rwlock_wait_read_key; +extern toku_instr_key *rwlock_wait_write_key; + +typedef struct st_rwlock *RWLOCK; +struct st_rwlock { + int reader; // the number of readers + int want_read; // the number of blocked readers toku_cond_t wait_read; int writer; // the number of writers int want_write; // the number of blocked writers toku_cond_t wait_write; - toku_cond_t* wait_users_go_to_zero; + toku_cond_t *wait_users_go_to_zero; +#if defined(TOKU_MYSQL_WITH_PFS) + toku_pthread_rwlock_t prwlock; +#endif }; // returns: the sum of the number of readers, pending readers, writers, and // pending writers static inline int rwlock_users(RWLOCK rwlock) { - return rwlock->reader + rwlock->want_read + rwlock->writer + rwlock->want_write; + return rwlock->reader + rwlock->want_read + rwlock->writer + + rwlock->want_write; } -// initialize a read write lock +#if defined(TOKU_MYSQL_WITH_PFS) +#define rwlock_init(K, R) inline_rwlock_init(K, R) +#else +#define rwlock_init(K, R) inline_rwlock_init(R) +#endif -static __attribute__((__unused__)) -void -rwlock_init(RWLOCK rwlock) { +// initialize a read write lock +static inline __attribute__((__unused__)) void inline_rwlock_init( +#if defined(TOKU_MYSQL_WITH_PFS) + const toku_instr_key &rwlock_instr_key, +#endif + RWLOCK rwlock) { +#if defined(TOKU_MYSQL_WITH_PFS) + toku_pthread_rwlock_init(rwlock_instr_key, &rwlock->prwlock, nullptr); +#endif rwlock->reader = rwlock->want_read = 0; - toku_cond_init(&rwlock->wait_read, 0); rwlock->writer = rwlock->want_write = 0; - toku_cond_init(&rwlock->wait_write, 0); + toku_cond_init(toku_uninstrumented, &rwlock->wait_read, nullptr); + toku_cond_init(toku_uninstrumented, &rwlock->wait_write, nullptr); rwlock->wait_users_go_to_zero = NULL; } // destroy a read write lock -static __attribute__((__unused__)) -void -rwlock_destroy(RWLOCK rwlock) { +static inline __attribute__((__unused__)) void rwlock_destroy(RWLOCK rwlock) { paranoid_invariant(rwlock->reader == 0); paranoid_invariant(rwlock->want_read == 0); paranoid_invariant(rwlock->writer == 0); paranoid_invariant(rwlock->want_write == 0); toku_cond_destroy(&rwlock->wait_read); toku_cond_destroy(&rwlock->wait_write); +#if defined(TOKU_MYSQL_WITH_PFS) + toku_pthread_rwlock_destroy(&rwlock->prwlock); +#endif } // obtain a read lock // expects: mutex is locked static inline void rwlock_read_lock(RWLOCK rwlock, toku_mutex_t *mutex) { +#ifdef TOKU_MYSQL_WITH_PFS + /* Instrumentation start */ + toku_rwlock_instrumentation rwlock_instr; + // TODO: pull location information up to caller + toku_instr_rwlock_rdlock_wait_start( + rwlock_instr, rwlock->prwlock, __FILE__, __LINE__); + +#endif + paranoid_invariant(!rwlock->wait_users_go_to_zero); if (rwlock->writer || rwlock->want_write) { rwlock->want_read++; @@ -203,12 +233,19 @@ static inline void rwlock_read_lock(RWLOCK rwlock, toku_mutex_t *mutex) { rwlock->want_read--; } rwlock->reader++; +#ifdef TOKU_MYSQL_WITH_PFS + /* Instrumentation end */ + toku_instr_rwlock_wrlock_wait_end(rwlock_instr, 0); +#endif } // release a read lock // expects: mutex is locked static inline void rwlock_read_unlock(RWLOCK rwlock) { +#ifdef TOKU_MYSQL_WITH_PFS + toku_instr_rwlock_unlock(rwlock->prwlock); +#endif paranoid_invariant(rwlock->reader > 0); paranoid_invariant(rwlock->writer == 0); rwlock->reader--; @@ -224,6 +261,12 @@ static inline void rwlock_read_unlock(RWLOCK rwlock) { // expects: mutex is locked static inline void rwlock_write_lock(RWLOCK rwlock, toku_mutex_t *mutex) { +#ifdef TOKU_MYSQL_WITH_PFS + /* Instrumentation start */ + toku_rwlock_instrumentation rwlock_instr; + toku_instr_rwlock_wrlock_wait_start( + rwlock_instr, rwlock->prwlock, __FILE__, __LINE__); +#endif paranoid_invariant(!rwlock->wait_users_go_to_zero); if (rwlock->reader || rwlock->writer) { rwlock->want_write++; @@ -233,12 +276,19 @@ static inline void rwlock_write_lock(RWLOCK rwlock, toku_mutex_t *mutex) { rwlock->want_write--; } rwlock->writer++; +#if defined(TOKU_MYSQL_WITH_PFS) + /* Instrumentation end */ + toku_instr_rwlock_wrlock_wait_end(rwlock_instr, 0); +#endif } // release a write lock // expects: mutex is locked static inline void rwlock_write_unlock(RWLOCK rwlock) { +#if defined(TOKU_MYSQL_WITH_PFS) + toku_instr_rwlock_unlock(rwlock->prwlock); +#endif paranoid_invariant(rwlock->reader == 0); paranoid_invariant(rwlock->writer == 1); rwlock->writer--; @@ -284,14 +334,10 @@ static inline int rwlock_read_will_block(RWLOCK rwlock) { return (rwlock->writer > 0 || rwlock->want_write > 0); } -static inline void rwlock_wait_for_users( - RWLOCK rwlock, - toku_mutex_t *mutex - ) -{ +static inline void rwlock_wait_for_users(RWLOCK rwlock, toku_mutex_t *mutex) { paranoid_invariant(!rwlock->wait_users_go_to_zero); toku_cond_t cond; - toku_cond_init(&cond, NULL); + toku_cond_init(toku_uninstrumented, &cond, nullptr); while (rwlock_users(rwlock) > 0) { rwlock->wait_users_go_to_zero = &cond; toku_cond_wait(&cond, mutex); diff --git a/storage/tokudb/PerconaFT/util/tests/marked-omt-test.cc b/storage/tokudb/PerconaFT/util/tests/marked-omt-test.cc index bce1b1a8..7e60c711 100644 --- a/storage/tokudb/PerconaFT/util/tests/marked-omt-test.cc +++ b/storage/tokudb/PerconaFT/util/tests/marked-omt-test.cc @@ -156,7 +156,7 @@ int int_heaviside(const uint32_t &v, const uint32_t &target) { struct stress_shared { stress_omt *omt; volatile bool running; - struct rwlock lock; + struct st_rwlock lock; toku_mutex_t mutex; int num_marker_threads; }; @@ -400,8 +400,8 @@ static void stress_test(int nelts) { struct stress_shared extra; ZERO_STRUCT(extra); extra.omt = &omt; - toku_mutex_init(&extra.mutex, NULL); - rwlock_init(&extra.lock); + toku_mutex_init(toku_uninstrumented, &extra.mutex, nullptr); + rwlock_init(toku_uninstrumented, &extra.lock); extra.running = true; extra.num_marker_threads = num_marker_threads; @@ -422,11 +422,19 @@ static void stress_test(int nelts) { r = myinitstate_r(seed, reader.buf_write, 8, &reader.rand_write); invariant_zero(r); - toku_pthread_create(&marker_threads[i], NULL, stress_mark_worker, &reader); + toku_pthread_create(toku_uninstrumented, + &marker_threads[i], + nullptr, + stress_mark_worker, + &reader); } toku_pthread_t deleter_thread; - toku_pthread_create(&deleter_thread, NULL, stress_delete_worker, &readers[0]); + toku_pthread_create(toku_uninstrumented, + &deleter_thread, + nullptr, + stress_delete_worker, + &readers[0]); toku_pthread_join(deleter_thread, NULL); for (int i = 0; i < num_marker_threads; ++i) { diff --git a/storage/tokudb/PerconaFT/util/tests/minicron-test.cc b/storage/tokudb/PerconaFT/util/tests/minicron-test.cc index a2ddbdea..026ab744 100644 --- a/storage/tokudb/PerconaFT/util/tests/minicron-test.cc +++ b/storage/tokudb/PerconaFT/util/tests/minicron-test.cc @@ -206,11 +206,12 @@ test_main (int argc, const char *argv[]) { toku_pthread_t tests[N]; unsigned int i; - for (i=0; istate=0; + rwlock->state = 0; rwlock->waiters_head = NULL; rwlock->waiters_tail = NULL; - toku_mutex_init(&rwlock->mutex, NULL); + toku_mutex_init(toku_uninstrumented, &rwlock->mutex, nullptr); } -void toku_cv_fair_rwlock_destroy (toku_cv_fair_rwlock_t *rwlock) { +void toku_cv_fair_rwlock_destroy(toku_cv_fair_rwlock_t *rwlock) { toku_mutex_destroy(&rwlock->mutex); } diff --git a/storage/tokudb/PerconaFT/util/tests/sm-basic.cc b/storage/tokudb/PerconaFT/util/tests/sm-basic.cc index 80bc965f..0e5eb836 100644 --- a/storage/tokudb/PerconaFT/util/tests/sm-basic.cc +++ b/storage/tokudb/PerconaFT/util/tests/sm-basic.cc @@ -64,7 +64,8 @@ int main(void) { // run the test toku_pthread_t tid; int r; - r = toku_pthread_create(&tid, NULL, sm_test_f, NULL); + r = toku_pthread_create( + toku_uninstrumented, &tid, nullptr, sm_test_f, nullptr); assert_zero(r); void *ret; r = toku_pthread_join(tid, &ret); diff --git a/storage/tokudb/PerconaFT/util/tests/sm-crash-double-free.cc b/storage/tokudb/PerconaFT/util/tests/sm-crash-double-free.cc index c5d7e3e5..5aa35655 100644 --- a/storage/tokudb/PerconaFT/util/tests/sm-crash-double-free.cc +++ b/storage/tokudb/PerconaFT/util/tests/sm-crash-double-free.cc @@ -64,10 +64,12 @@ int main(void) { toku_scoped_malloc_init(); toku_pthread_t tid; int r; - r = toku_pthread_create(&tid, NULL, sm_test_f, NULL); + r = toku_pthread_create( + toku_uninstrumented, &tid, nullptr, sm_test_f, nullptr); assert_zero(r); void *ret; - while (state != 1) sleep(1); + while (state != 1) + sleep(1); toku_scoped_malloc_destroy_set(); state = 2; r = toku_pthread_join(tid, &ret); diff --git a/storage/tokudb/PerconaFT/util/tests/test-frwlock-fair-writers.cc b/storage/tokudb/PerconaFT/util/tests/test-frwlock-fair-writers.cc index 7fd4801f..9a625c32 100644 --- a/storage/tokudb/PerconaFT/util/tests/test-frwlock-fair-writers.cc +++ b/storage/tokudb/PerconaFT/util/tests/test-frwlock-fair-writers.cc @@ -66,9 +66,9 @@ static void *t1_func(void *arg) { int main(void) { int r; - toku_mutex_init(&rwlock_mutex, NULL); + toku_mutex_init(toku_uninstrumented, &rwlock_mutex, nullptr); rwlock.init(&rwlock_mutex); - + const int nthreads = 2; pthread_t tids[nthreads]; for (int i = 0; i < nthreads; i++) { diff --git a/storage/tokudb/PerconaFT/util/tests/test-rwlock-cheapness.cc b/storage/tokudb/PerconaFT/util/tests/test-rwlock-cheapness.cc index 0075ddf9..c0b43c2d 100644 --- a/storage/tokudb/PerconaFT/util/tests/test-rwlock-cheapness.cc +++ b/storage/tokudb/PerconaFT/util/tests/test-rwlock-cheapness.cc @@ -101,7 +101,8 @@ static void *do_read_wait(void *arg) { static void launch_cheap_waiter(void) { toku_pthread_t tid; - int r = toku_pthread_create(&tid, NULL, do_cheap_wait, NULL); + int r = toku_pthread_create( + toku_uninstrumented, &tid, nullptr, do_cheap_wait, nullptr); assert_zero(r); toku_pthread_detach(tid); sleep(1); @@ -109,7 +110,8 @@ static void launch_cheap_waiter(void) { static void launch_expensive_waiter(void) { toku_pthread_t tid; - int r = toku_pthread_create(&tid, NULL, do_expensive_wait, NULL); + int r = toku_pthread_create( + toku_uninstrumented, &tid, nullptr, do_expensive_wait, nullptr); assert_zero(r); toku_pthread_detach(tid); sleep(1); @@ -117,7 +119,8 @@ static void launch_expensive_waiter(void) { static void launch_reader(void) { toku_pthread_t tid; - int r = toku_pthread_create(&tid, NULL, do_read_wait, NULL); + int r = toku_pthread_create( + toku_uninstrumented, &tid, nullptr, do_read_wait, nullptr); assert_zero(r); toku_pthread_detach(tid); sleep(1); @@ -132,7 +135,7 @@ static bool locks_are_expensive(void) { } static void test_write_cheapness(void) { - toku_mutex_init(&mutex, NULL); + toku_mutex_init(toku_uninstrumented, &mutex, nullptr); w.init(&mutex); // single expensive write lock diff --git a/storage/tokudb/PerconaFT/util/tests/test-rwlock.cc b/storage/tokudb/PerconaFT/util/tests/test-rwlock.cc index 18ca1229..56dd3f6b 100644 --- a/storage/tokudb/PerconaFT/util/tests/test-rwlock.cc +++ b/storage/tokudb/PerconaFT/util/tests/test-rwlock.cc @@ -245,14 +245,14 @@ static void util_rwlock_unlock (RWLOCK rwlock, toku_mutex_t *mutex) { } // Time the read lock that's in util/rwlock.h -void time_util_rwlock (void) __attribute((__noinline__)); -void time_util_rwlock (void) { - struct rwlock rwlock; +void time_util_rwlock(void) __attribute((__noinline__)); +void time_util_rwlock(void) { + struct st_rwlock rwlock; toku_mutex_t external_mutex; - toku_mutex_init(&external_mutex, NULL); - rwlock_init(&rwlock); - struct timeval start,end; - + toku_mutex_init(toku_uninstrumented, &external_mutex, nullptr); + rwlock_init(toku_uninstrumented, &rwlock); + struct timeval start, end; + util_rwlock_lock(&rwlock, &external_mutex); util_rwlock_unlock(&rwlock, &external_mutex); for (int t=0; tthreadpool, max_threads); assert(r == 0); + r = toku_thread_pool_create(&my_threadpool->threadpool, max_threads); + assert(r == 0); assert(my_threadpool != 0); - toku_mutex_init(&my_threadpool->mutex, 0); - toku_cond_init(&my_threadpool->wait, 0); + toku_mutex_init(toku_uninstrumented, &my_threadpool->mutex, nullptr); + toku_cond_init(toku_uninstrumented, &my_threadpool->wait, nullptr); my_threadpool->closed = 0; my_threadpool->counter = 0; } diff --git a/storage/tokudb/PerconaFT/util/threadpool.cc b/storage/tokudb/PerconaFT/util/threadpool.cc index 146cc632..6e0ccf05 100644 --- a/storage/tokudb/PerconaFT/util/threadpool.cc +++ b/storage/tokudb/PerconaFT/util/threadpool.cc @@ -48,6 +48,11 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "threadpool.h" +toku_instr_key *tpool_lock_mutex_key; +toku_instr_key *tp_thread_wait_key; +toku_instr_key *tp_pool_wait_free_key; +toku_instr_key *tp_internal_thread_key; + struct toku_thread { struct toku_thread_pool *pool; toku_pthread_t tid; @@ -84,8 +89,12 @@ toku_thread_create(struct toku_thread_pool *pool, struct toku_thread **toku_thre } else { memset(thread, 0, sizeof *thread); thread->pool = pool; - toku_cond_init(&thread->wait, nullptr); - r = toku_pthread_create(&thread->tid, nullptr, toku_thread_run_internal, thread); + toku_cond_init(*tp_thread_wait_key, &thread->wait, nullptr); + r = toku_pthread_create(*tp_internal_thread_key, + &thread->tid, + nullptr, + toku_thread_run_internal, + thread); if (r) { toku_cond_destroy(&thread->wait); toku_free(thread); @@ -105,11 +114,11 @@ toku_thread_run(struct toku_thread *thread, void *(*f)(void *arg), void *arg) { toku_thread_pool_unlock(thread->pool); } -static void -toku_thread_destroy(struct toku_thread *thread) { +static void toku_thread_destroy(struct toku_thread *thread) { int r; void *ret; - r = toku_pthread_join(thread->tid, &ret); invariant(r == 0 && ret == thread); + r = toku_pthread_join(thread->tid, &ret); + invariant(r == 0 && ret == thread); struct toku_thread_pool *pool = thread->pool; toku_thread_pool_lock(pool); toku_list_remove(&thread->free_link); @@ -147,20 +156,20 @@ toku_thread_run_internal(void *arg) { thread->f = nullptr; toku_list_push(&pool->free_threads, &thread->free_link); } - return arg; -} + return toku_pthread_done(arg); +} -int -toku_thread_pool_create(struct toku_thread_pool **pool_return, int max_threads) { +int toku_thread_pool_create(struct toku_thread_pool **pool_return, + int max_threads) { int r; struct toku_thread_pool *CALLOC(pool); if (pool == nullptr) { r = get_error_errno(); } else { - toku_mutex_init(&pool->lock, nullptr); + toku_mutex_init(*tpool_lock_mutex_key, &pool->lock, nullptr); toku_list_init(&pool->free_threads); toku_list_init(&pool->all_threads); - toku_cond_init(&pool->wait_free, nullptr); + toku_cond_init(*tp_pool_wait_free_key, &pool->wait_free, nullptr); pool->cur_threads = 0; pool->max_threads = max_threads; *pool_return = pool; diff --git a/storage/tokudb/ha_tokudb.cc b/storage/tokudb/ha_tokudb.cc index 56bebf1c..cdd4adb0 100644 --- a/storage/tokudb/ha_tokudb.cc +++ b/storage/tokudb/ha_tokudb.cc @@ -31,6 +31,8 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #include "ha_tokudb.h" #include "sql_db.h" +pfs_key_t ha_tokudb_mutex_key; +pfs_key_t num_DBs_lock_key; #if TOKU_INCLUDE_EXTENDED_KEYS static inline uint get_ext_key_parts(const KEY *key) { @@ -187,13 +189,9 @@ const char* TOKUDB_SHARE::get_state_string(share_state_t state) { void* TOKUDB_SHARE::operator new(size_t sz) { return tokudb::memory::malloc(sz, MYF(MY_WME|MY_ZEROFILL|MY_FAE)); } -void TOKUDB_SHARE::operator delete(void* p) { - tokudb::memory::free(p); -} -TOKUDB_SHARE::TOKUDB_SHARE() : - _num_DBs_lock(), - _mutex() { -} +void TOKUDB_SHARE::operator delete(void* p) { tokudb::memory::free(p); } +TOKUDB_SHARE::TOKUDB_SHARE() + : _num_DBs_lock(num_DBs_lock_key), _mutex(ha_tokudb_mutex_key) {} void TOKUDB_SHARE::init(const char* table_name) { _use_count = 0; thr_lock_init(&_thr_lock); @@ -228,20 +226,15 @@ void TOKUDB_SHARE::destroy() { thr_lock_delete(&_thr_lock); TOKUDB_SHARE_DBUG_VOID_RETURN(); } -TOKUDB_SHARE* TOKUDB_SHARE::get_share( - const char* table_name, - TABLE_SHARE* table_share, - THR_LOCK_DATA* data, - bool create_new) { - - _open_tables_mutex.lock(); +TOKUDB_SHARE* TOKUDB_SHARE::get_share(const char* table_name, + TABLE_SHARE* table_share, + THR_LOCK_DATA* data, + bool create_new) { + mutex_t_lock(_open_tables_mutex); int error = 0; - uint length = (uint) strlen(table_name); - TOKUDB_SHARE* share = - (TOKUDB_SHARE*)my_hash_search( - &_open_tables, - (uchar*)table_name, - length); + uint length = (uint)strlen(table_name); + TOKUDB_SHARE* share = (TOKUDB_SHARE*)my_hash_search( + &_open_tables, (uchar*)table_name, length); TOKUDB_TRACE_FOR_FLAGS( TOKUDB_DEBUG_SHARE, @@ -276,28 +269,27 @@ TOKUDB_SHARE* TOKUDB_SHARE::get_share( thr_lock_data_init(&(share->_thr_lock), data, NULL); exit: - _open_tables_mutex.unlock(); + mutex_t_unlock(_open_tables_mutex); return share; } void TOKUDB_SHARE::drop_share(TOKUDB_SHARE* share) { - TOKUDB_TRACE_FOR_FLAGS( - TOKUDB_DEBUG_SHARE, - "share[%p]:file[%s]:state[%s]:use_count[%d]", - share, - share->_full_table_name.ptr(), - get_state_string(share->_state), - share->_use_count); - - _open_tables_mutex.lock(); + TOKUDB_TRACE_FOR_FLAGS(TOKUDB_DEBUG_SHARE, + "share[%p]:file[%s]:state[%s]:use_count[%d]", + share, + share->_full_table_name.ptr(), + get_state_string(share->_state), + share->_use_count); + + mutex_t_lock(_open_tables_mutex); my_hash_delete(&_open_tables, (uchar*)share); - _open_tables_mutex.unlock(); + mutex_t_unlock(_open_tables_mutex); } TOKUDB_SHARE::share_state_t TOKUDB_SHARE::addref() { TOKUDB_SHARE_TRACE_FOR_FLAGS((TOKUDB_DEBUG_ENTER & TOKUDB_DEBUG_SHARE), - "file[%s]:state[%s]:use_count[%d]", - _full_table_name.ptr(), - get_state_string(_state), - _use_count); + "file[%s]:state[%s]:use_count[%d]", + _full_table_name.ptr(), + get_state_string(_state), + _use_count); lock(); _use_count++; @@ -312,7 +304,7 @@ int TOKUDB_SHARE::release() { int error, result = 0; - _mutex.lock(); + mutex_t_lock(_mutex); assert_always(_use_count != 0); _use_count--; if (_use_count == 0 && _state == TOKUDB_SHARE::OPENED) { @@ -356,7 +348,7 @@ int TOKUDB_SHARE::release() { _state = TOKUDB_SHARE::CLOSED; } - _mutex.unlock(); + mutex_t_unlock(_mutex); TOKUDB_SHARE_DBUG_RETURN(result); } @@ -1195,8 +1187,10 @@ static int generate_row_for_put( ha_tokudb::ha_tokudb(handlerton * hton, TABLE_SHARE * table_arg):handler(hton, table_arg) { TOKUDB_HANDLER_DBUG_ENTER(""); share = NULL; - int_table_flags = HA_REC_NOT_IN_SEQ | HA_NULL_IN_KEY | HA_CAN_INDEX_BLOBS | HA_PRIMARY_KEY_IN_READ_INDEX | HA_PRIMARY_KEY_REQUIRED_FOR_POSITION | - HA_FILE_BASED | HA_AUTO_PART_KEY | HA_TABLE_SCAN_ON_INDEX | HA_CAN_WRITE_DURING_OPTIMIZE; + int_table_flags = HA_REC_NOT_IN_SEQ | HA_NULL_IN_KEY | HA_CAN_INDEX_BLOBS + | HA_PRIMARY_KEY_IN_READ_INDEX | HA_PRIMARY_KEY_REQUIRED_FOR_POSITION + | HA_FILE_BASED | HA_AUTO_PART_KEY | HA_TABLE_SCAN_ON_INDEX + | HA_CAN_WRITE_DURING_OPTIMIZE | HA_ONLINE_ANALYZE; alloc_ptr = NULL; rec_buff = NULL; rec_update_buff = NULL; @@ -3313,12 +3307,12 @@ void ha_tokudb::start_bulk_insert(ha_rows rows) { delay_updating_ai_metadata = true; ai_metadata_update_required = false; abort_loader = false; - - share->_num_DBs_lock.lock_read(); + + rwlock_t_lock_read(share->_num_DBs_lock); uint curr_num_DBs = table->s->keys + tokudb_test(hidden_primary_key); num_DBs_locked_in_bulk = true; lock_count = 0; - + if ((rows == 0 || rows > 1) && share->try_table_lock) { if (tokudb::sysvars::prelock_empty(thd) && may_table_be_empty(transaction) && @@ -4030,14 +4024,13 @@ int ha_tokudb::write_row(uchar * record) { // grab reader lock on numDBs_lock // if (!num_DBs_locked_in_bulk) { - share->_num_DBs_lock.lock_read(); + rwlock_t_lock_read(share->_num_DBs_lock); num_DBs_locked = true; - } - else { + } else { lock_count++; if (lock_count >= 2000) { share->_num_DBs_lock.unlock(); - share->_num_DBs_lock.lock_read(); + rwlock_t_lock_read(share->_num_DBs_lock); lock_count = 0; } } @@ -4208,7 +4201,7 @@ int ha_tokudb::update_row(const uchar * old_row, uchar * new_row) { // bool num_DBs_locked = false; if (!num_DBs_locked_in_bulk) { - share->_num_DBs_lock.lock_read(); + rwlock_t_lock_read(share->_num_DBs_lock); num_DBs_locked = true; } curr_num_DBs = share->num_DBs; @@ -4350,7 +4343,7 @@ int ha_tokudb::delete_row(const uchar * record) { // bool num_DBs_locked = false; if (!num_DBs_locked_in_bulk) { - share->_num_DBs_lock.lock_read(); + rwlock_t_lock_read(share->_num_DBs_lock); num_DBs_locked = true; } curr_num_DBs = share->num_DBs; @@ -4641,6 +4634,9 @@ int ha_tokudb::index_init(uint keynr, bool sorted) { if (tokudb::sysvars::disable_prefetching(thd)) { cursor_flags |= DBC_DISABLE_PREFETCHING; } + if (lock.type == TL_READ_WITH_SHARED_LOCKS) { + cursor_flags |= DB_LOCKING_READ; + } if ((error = share->key_file[keynr]->cursor(share->key_file[keynr], transaction, &cursor, cursor_flags))) { @@ -6212,6 +6208,8 @@ int ha_tokudb::info(uint flag) { } if ((flag & HA_STATUS_CONST)) { stats.max_data_file_length = 9223372036854775807ULL; + } + if (flag & (HA_STATUS_VARIABLE | HA_STATUS_CONST)) { share->set_cardinality_counts_in_table(table); } @@ -6295,7 +6293,7 @@ int ha_tokudb::acquire_table_lock (DB_TXN* trans, TABLE_LOCK_TYPE lt) { TOKUDB_HANDLER_DBUG_ENTER("%p %s", trans, lt == lock_read ? "r" : "w"); int error = ENOSYS; if (!num_DBs_locked_in_bulk) { - share->_num_DBs_lock.lock_read(); + rwlock_t_lock_read(share->_num_DBs_lock); } uint curr_num_DBs = share->num_DBs; if (lt == lock_read) { @@ -6651,8 +6649,9 @@ THR_LOCK_DATA* *ha_tokudb::store_lock( if (sql_command == SQLCOM_CREATE_INDEX && tokudb::sysvars::create_index_online(thd)) { // hot indexing - share->_num_DBs_lock.lock_read(); - if (share->num_DBs == (table->s->keys + tokudb_test(hidden_primary_key))) { + rwlock_t_lock_read(share->_num_DBs_lock); + if (share->num_DBs == + (table->s->keys + tokudb_test(hidden_primary_key))) { lock_type = TL_WRITE_ALLOW_WRITE; } share->_num_DBs_lock.unlock(); @@ -7225,10 +7224,28 @@ int ha_tokudb::create( const tokudb::sysvars::row_format_t row_format = (tokudb::sysvars::row_format_t)form->s->option_struct->row_format; #else - const tokudb::sysvars::row_format_t row_format = - (create_info->used_fields & HA_CREATE_USED_ROW_FORMAT) - ? row_type_to_row_format(create_info->row_type) - : tokudb::sysvars::row_format(thd); + // TDB-76 : CREATE TABLE ... LIKE ... does not use source row_format on + // target table + // Original code would only use create_info->row_type if + // create_info->used_fields & HA_CREATE_USED_ROW_FORMAT was true. This + // would cause us to skip transferring the row_format for a table created + // via CREATE TABLE tn LIKE tn. We also take on more InnoDB like behavior + // and throw a warning if we get a row_format that we can't translate into + // a known TokuDB row_format. + tokudb::sysvars::row_format_t row_format = + tokudb::sysvars::row_format(thd); + + if ((create_info->used_fields & HA_CREATE_USED_ROW_FORMAT) || + create_info->row_type != ROW_TYPE_DEFAULT) { + row_format = row_type_to_row_format(create_info->row_type); + if (row_format == tokudb::sysvars::SRV_ROW_FORMAT_DEFAULT && + create_info->row_type != ROW_TYPE_DEFAULT) { + push_warning(thd, + Sql_condition::WARN_LEVEL_WARN, + ER_ILLEGAL_HA_CREATE_OPTION, + "TokuDB: invalid ROW_FORMAT specifier."); + } + } #endif const toku_compression_method compression_method = row_format_to_toku_compression_method(row_format); @@ -8112,8 +8129,8 @@ int ha_tokudb::tokudb_add_index( } } } - - share->_num_DBs_lock.lock_write(); + + rwlock_t_lock_write(share->_num_DBs_lock); rw_lock_taken = true; // // open all the DB files and set the appropriate variables in share @@ -8223,7 +8240,7 @@ int ha_tokudb::tokudb_add_index( goto cleanup; } - share->_num_DBs_lock.lock_write(); + rwlock_t_lock_write(share->_num_DBs_lock); error = indexer->close(indexer); share->_num_DBs_lock.unlock(); if (error) { @@ -8457,7 +8474,7 @@ int ha_tokudb::tokudb_add_index( if (indexer != NULL) { sprintf(status_msg, "aborting creation of indexes."); thd_proc_info(thd, status_msg); - share->_num_DBs_lock.lock_write(); + rwlock_t_lock_write(share->_num_DBs_lock); indexer->abort(indexer); share->_num_DBs_lock.unlock(); } @@ -8506,10 +8523,10 @@ void ha_tokudb::restore_add_index( // // need to restore num_DBs, and we have to do it before we close the dictionaries - // so that there is not a window + // so that there is not a window // if (incremented_numDBs) { - share->_num_DBs_lock.lock_write(); + rwlock_t_lock_write(share->_num_DBs_lock); share->num_DBs--; } if (modified_DBs) { diff --git a/storage/tokudb/ha_tokudb.h b/storage/tokudb/ha_tokudb.h index 3891e577..a2fd747b 100644 --- a/storage/tokudb/ha_tokudb.h +++ b/storage/tokudb/ha_tokudb.h @@ -318,18 +318,18 @@ inline int TOKUDB_SHARE::use_count() const { } inline void TOKUDB_SHARE::lock() const { TOKUDB_SHARE_DBUG_ENTER("file[%s]:state[%s]:use_count[%d]", - _full_table_name.ptr(), - get_state_string(_state), - _use_count); - _mutex.lock(); + _full_table_name.ptr(), + get_state_string(_state), + _use_count); + mutex_t_lock(_mutex); TOKUDB_SHARE_DBUG_VOID_RETURN(); } inline void TOKUDB_SHARE::unlock() const { TOKUDB_SHARE_DBUG_ENTER("file[%s]:state[%s]:use_count[%d]", - _full_table_name.ptr(), - get_state_string(_state), - _use_count); - _mutex.unlock(); + _full_table_name.ptr(), + get_state_string(_state), + _use_count); + mutex_t_unlock(_mutex); TOKUDB_SHARE_DBUG_VOID_RETURN(); } inline TOKUDB_SHARE::share_state_t TOKUDB_SHARE::state() const { diff --git a/storage/tokudb/ha_tokudb_update.cc b/storage/tokudb/ha_tokudb_update.cc index 23de81f3..9fe5e729 100644 --- a/storage/tokudb/ha_tokudb_update.cc +++ b/storage/tokudb/ha_tokudb_update.cc @@ -918,7 +918,7 @@ int ha_tokudb::send_update_message( marshall_update(update_message, lhs_item, rhs_item, table, share); } - share->_num_DBs_lock.lock_read(); + rwlock_t_lock_read(share->_num_DBs_lock); // hot index in progress if (share->num_DBs > table->s->keys + tokudb_test(hidden_primary_key)) { @@ -1108,7 +1108,7 @@ int ha_tokudb::send_upsert_message( marshall_update(update_message, lhs_item, rhs_item, table, share); } - share->_num_DBs_lock.lock_read(); + rwlock_t_lock_read(share->_num_DBs_lock); // hot index in progress if (share->num_DBs > table->s->keys + tokudb_test(hidden_primary_key)) { diff --git a/storage/tokudb/hatoku_cmp.cc b/storage/tokudb/hatoku_cmp.cc index 13bc60e9..88ba83ea 100644 --- a/storage/tokudb/hatoku_cmp.cc +++ b/storage/tokudb/hatoku_cmp.cc @@ -1984,6 +1984,7 @@ static uint32_t pack_desc_key_length_info(uchar* buf, KEY_AND_COL_INFO* kc_info, case (toku_type_fixstring): field_length = field->pack_length(); set_if_smaller(key_part_length, field_length); + // fallthrough case (toku_type_varbinary): case (toku_type_varstring): case (toku_type_blob): diff --git a/storage/tokudb/hatoku_defines.h b/storage/tokudb/hatoku_defines.h index 1b33e0a5..36027296 100644 --- a/storage/tokudb/hatoku_defines.h +++ b/storage/tokudb/hatoku_defines.h @@ -168,6 +168,14 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #define HA_CAN_WRITE_DURING_OPTIMIZE 0 #endif +#if !defined(HA_ONLINE_ANALYZE) +#define HA_ONLINE_ANALYZE 0 +#endif + +#if !defined(MY_ATTRIBUTE) +#define MY_ATTRIBUTE(A) __attribute__(A) +#endif + #if !defined(HA_OPTION_CREATE_FROM_ENGINE) #define HA_OPTION_CREATE_FROM_ENGINE 0 #endif @@ -248,4 +256,22 @@ inline uint tokudb_uint3korr(const uchar *a) { return uint3korr(b); } -#endif // _HATOKU_DEFINES_H +typedef unsigned int pfs_key_t; + +#if defined(HAVE_PSI_MUTEX_INTERFACE) +#define mutex_t_lock(M) M.lock(__FILE__, __LINE__) +#define mutex_t_unlock(M) M.unlock(__FILE__, __LINE__) +#else // HAVE_PSI_MUTEX_INTERFACE +#define mutex_t_lock(M) M.lock() +#define mutex_t_unlock(M) M.unlock() +#endif // HAVE_PSI_MUTEX_INTERFACE + +#if defined(HAVE_PSI_RWLOCK_INTERFACE) +#define rwlock_t_lock_read(M) M.lock_read(__FILE__, __LINE__) +#define rwlock_t_lock_write(M) M.lock_write(__FILE__, __LINE__) +#else // HAVE_PSI_RWLOCK_INTERFACE +#define rwlock_t_lock_read(M) M.lock_read() +#define rwlock_t_lock_write(M) M.lock_write() +#endif // HAVE_PSI_RWLOCK_INTERFACE + +#endif // _HATOKU_DEFINES_H diff --git a/storage/tokudb/hatoku_hton.cc b/storage/tokudb/hatoku_hton.cc index 7b44044b..ac0976fb 100644 --- a/storage/tokudb/hatoku_hton.cc +++ b/storage/tokudb/hatoku_hton.cc @@ -28,6 +28,17 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. #define TOKU_METADB_NAME "tokudb_meta" +static pfs_key_t tokudb_map_mutex_key; + +static PSI_mutex_info all_tokudb_mutexes[] = { + {&tokudb_map_mutex_key, "tokudb_map_mutex", 0}, + {&ha_tokudb_mutex_key, "ha_tokudb_mutex", 0}, +}; + +static PSI_rwlock_info all_tokudb_rwlocks[] = { + {&num_DBs_lock_key, "num_DBs_lock", 0}, +}; + typedef struct savepoint_info { DB_TXN* txn; tokudb_trx_data* trx; @@ -109,8 +120,8 @@ handlerton* tokudb_hton; const char* ha_tokudb_ext = ".tokudb"; DB_ENV* db_env; -#if TOKU_THDVAR_MEMALLOC_BUG static tokudb::thread::mutex_t tokudb_map_mutex; +#if TOKU_THDVAR_MEMALLOC_BUG static TREE tokudb_map; struct tokudb_map_pair { THD* thd; @@ -212,6 +223,10 @@ extern "C" { // use constructor and destructor functions to create and destroy // the lock before and after main(), respectively. int tokudb_hton_initialized; + +// tokudb_hton_initialized_lock can not be instrumented as it must be +// initialized before mysql_mutex_register() call to protect +// some globals from race condition. tokudb::thread::rwlock_t tokudb_hton_initialized_lock; static SHOW_VAR *toku_global_status_variables = NULL; @@ -267,10 +282,23 @@ static int tokudb_init_func(void *p) { int r; // 3938: lock the handlerton's initialized status flag for writing - tokudb_hton_initialized_lock.lock_write(); + rwlock_t_lock_write(tokudb_hton_initialized_lock); + +#ifdef HAVE_PSI_INTERFACE + /* Register TokuDB mutex keys with MySQL performance schema */ + int count; + + count = array_elements(all_tokudb_mutexes); + mysql_mutex_register("tokudb", all_tokudb_mutexes, count); + + count = array_elements(all_tokudb_rwlocks); + mysql_rwlock_register("tokudb", all_tokudb_rwlocks, count); + + tokudb_map_mutex.reinit(tokudb_map_mutex_key); +#endif /* HAVE_PSI_INTERFACE */ db_env = NULL; - tokudb_hton = (handlerton *) p; + tokudb_hton = (handlerton*)p; if (tokudb::sysvars::check_jemalloc) { typedef int (*mallctl_type)( @@ -668,7 +696,7 @@ int tokudb_end(handlerton* hton, ha_panic_function type) { // initialized. grab a writer lock for the duration of the // call, so we can drop the flag and destroy the mutexes // in isolation. - tokudb_hton_initialized_lock.lock_write(); + rwlock_t_lock_write(tokudb_hton_initialized_lock); assert_always(tokudb_hton_initialized); tokudb::background::destroy(); @@ -748,16 +776,16 @@ static int tokudb_close_connection(handlerton* hton, THD* thd) { } tokudb::memory::free(trx); #if TOKU_THDVAR_MEMALLOC_BUG - tokudb_map_mutex.lock(); - struct tokudb_map_pair key = { thd, NULL }; + mutex_t_lock(tokudb_map_mutex); + struct tokudb_map_pair key = {thd, NULL}; struct tokudb_map_pair* found_key = - (struct tokudb_map_pair*) tree_search(&tokudb_map, &key, NULL); + (struct tokudb_map_pair*)tree_search(&tokudb_map, &key, NULL); if (found_key) { tokudb::memory::free(found_key->last_lock_timeout); tree_delete(&tokudb_map, found_key, sizeof(*found_key), NULL); } - tokudb_map_mutex.unlock(); + mutex_t_unlock(tokudb_map_mutex); #endif return error; } @@ -1718,12 +1746,12 @@ static void tokudb_lock_timeout_callback( tokudb::memory::strdup(log_str.c_ptr(), MY_FAE); tokudb::sysvars::set_last_lock_timeout(thd, new_lock_timeout); #if TOKU_THDVAR_MEMALLOC_BUG - tokudb_map_mutex.lock(); - struct tokudb_map_pair old_key = { thd, old_lock_timeout }; + mutex_t_lock(tokudb_map_mutex); + struct tokudb_map_pair old_key = {thd, old_lock_timeout}; tree_delete(&tokudb_map, &old_key, sizeof old_key, NULL); - struct tokudb_map_pair new_key = { thd, new_lock_timeout }; + struct tokudb_map_pair new_key = {thd, new_lock_timeout}; tree_insert(&tokudb_map, &new_key, sizeof new_key, NULL); - tokudb_map_mutex.unlock(); + mutex_t_unlock(tokudb_map_mutex); #endif tokudb::memory::free(old_lock_timeout); } diff --git a/storage/tokudb/hatoku_hton.h b/storage/tokudb/hatoku_hton.h index d126ff43..80e13fa9 100644 --- a/storage/tokudb/hatoku_hton.h +++ b/storage/tokudb/hatoku_hton.h @@ -39,6 +39,9 @@ extern handlerton* tokudb_hton; extern DB_ENV* db_env; +extern pfs_key_t ha_tokudb_mutex_key; +extern pfs_key_t num_DBs_lock_key; + inline tokudb::sysvars::row_format_t toku_compression_method_to_row_format( toku_compression_method method) { @@ -180,9 +183,7 @@ inline bool tokudb_killed_thd_callback(void *extra, uint64_t deleted_rows) { return thd_kill_level(thd) != 0; } - extern HASH tokudb_open_tables; -extern tokudb::thread::mutex_t tokudb_mutex; extern const char* tokudb_hton_name; extern int tokudb_hton_initialized; extern tokudb::thread::rwlock_t tokudb_hton_initialized_lock; diff --git a/storage/tokudb/mysql-test/tokudb/disabled.def b/storage/tokudb/mysql-test/tokudb/disabled.def index ddefceb4..7f354cd8 100644 --- a/storage/tokudb/mysql-test/tokudb/disabled.def +++ b/storage/tokudb/mysql-test/tokudb/disabled.def @@ -29,3 +29,4 @@ cluster_key_part: engine options on partitioned tables i_s_tokudb_lock_waits_released: unstable, race conditions i_s_tokudb_locks_released: unstable, race conditions row_format: n/a +nonflushing_analyze_debug: Freezes in MariaDB 10.0 diff --git a/storage/tokudb/mysql-test/tokudb/r/card_scale_percent.result b/storage/tokudb/mysql-test/tokudb/r/card_scale_percent.result index cfd7e381..981433fa 100644 --- a/storage/tokudb/mysql-test/tokudb/r/card_scale_percent.result +++ b/storage/tokudb/mysql-test/tokudb/r/card_scale_percent.result @@ -1,7 +1,7 @@ -set global tokudb_cardinality_scale_percent = 10; analyze table tt; Table Op Msg_type Msg_text test.tt analyze status OK +set global tokudb_cardinality_scale_percent = 10; show indexes from tt; Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment tt 0 PRIMARY 1 a A 4000 NULL NULL BTREE @@ -9,9 +9,6 @@ tt 1 b 1 b A 4000 NULL NULL YES BTREE tt 1 c 1 c A 4000 NULL NULL YES BTREE tt 1 d 1 d A 4000 NULL NULL YES BTREE set global tokudb_cardinality_scale_percent = 50; -analyze table tt; -Table Op Msg_type Msg_text -test.tt analyze status OK show indexes from tt; Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment tt 0 PRIMARY 1 a A 4000 NULL NULL BTREE @@ -19,9 +16,6 @@ tt 1 b 1 b A 4000 NULL NULL YES BTREE tt 1 c 1 c A 4000 NULL NULL YES BTREE tt 1 d 1 d A 2000 NULL NULL YES BTREE set global tokudb_cardinality_scale_percent = 100; -analyze table tt; -Table Op Msg_type Msg_text -test.tt analyze status OK show indexes from tt; Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment tt 0 PRIMARY 1 a A 4000 NULL NULL BTREE @@ -31,9 +25,6 @@ tt 1 d 1 d A 1000 NULL NULL YES BTREE set global tokudb_cardinality_scale_percent = 200; Warnings: Warning 1292 Truncated incorrect tokudb_cardinality_scale_percent value: '200' -analyze table tt; -Table Op Msg_type Msg_text -test.tt analyze status OK show indexes from tt; Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment tt 0 PRIMARY 1 a A 4000 NULL NULL BTREE diff --git a/storage/tokudb/mysql-test/tokudb/r/locking-read-repeatable-read-1.result b/storage/tokudb/mysql-test/tokudb/r/locking-read-repeatable-read-1.result new file mode 100644 index 00000000..c9fcb5e2 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb/r/locking-read-repeatable-read-1.result @@ -0,0 +1,13 @@ +create table t (a int primary key, b int) ENGINE=TokuDB; +insert into t values (1,0); +set session transaction isolation level repeatable read; +begin; +select * from t where a=1 lock in share mode; +a b +1 0 +set session transaction isolation level repeatable read; +begin; +update t set b=b+1 where a=1; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +commit; +drop table t; diff --git a/storage/tokudb/mysql-test/tokudb/r/locking-read-repeatable-read-2.result b/storage/tokudb/mysql-test/tokudb/r/locking-read-repeatable-read-2.result new file mode 100644 index 00000000..f1b214e5 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb/r/locking-read-repeatable-read-2.result @@ -0,0 +1,17 @@ +create table t (a int primary key, b int) ENGINE=TokuDB; +insert into t values (1,0); +insert into t values (2,1); +insert into t values (3,2); +set session transaction isolation level repeatable read; +begin; +select * from t lock in share mode; +a b +1 0 +2 1 +3 2 +set session transaction isolation level repeatable read; +begin; +update t set b=b+1 where a=2; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +commit; +drop table t; diff --git a/storage/tokudb/mysql-test/tokudb/r/nonflushing_analyze_debug.result b/storage/tokudb/mysql-test/tokudb/r/nonflushing_analyze_debug.result new file mode 100644 index 00000000..e8f51ede --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb/r/nonflushing_analyze_debug.result @@ -0,0 +1,19 @@ +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=TokuDB; +INSERT INTO t1 VALUES (1), (2), (3); +SET DEBUG_SYNC="handler_ha_index_next_end SIGNAL idx_scan_in_progress WAIT_FOR finish_scan"; +SELECT * FROM t1; +SET DEBUG_SYNC="now WAIT_FOR idx_scan_in_progress"; +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +SELECT * FROM t1; +a +1 +2 +3 +SET DEBUG_SYNC="now SIGNAL finish_scan"; +a +1 +2 +3 +DROP TABLE t1; diff --git a/storage/tokudb/mysql-test/tokudb/r/row_format.result b/storage/tokudb/mysql-test/tokudb/r/row_format.result index cb669148..15d4f9fe 100644 --- a/storage/tokudb/mysql-test/tokudb/r/row_format.result +++ b/storage/tokudb/mysql-test/tokudb/r/row_format.result @@ -1,4 +1,6 @@ CREATE TABLE tokudb_row_format_test_1 (a INT) ENGINE=TokuDB ROW_FORMAT=TOKUDB_DEFAULT; +Warnings: +Warning 1478 TokuDB: invalid ROW_FORMAT specifier. CREATE TABLE tokudb_row_format_test_2 (a INT) ENGINE=TokuDB ROW_FORMAT=TOKUDB_FAST; CREATE TABLE tokudb_row_format_test_3 (a INT) ENGINE=TokuDB ROW_FORMAT=TOKUDB_SMALL; CREATE TABLE tokudb_row_format_test_4 (a INT) ENGINE=TokuDB ROW_FORMAT=TOKUDB_UNCOMPRESSED; @@ -6,6 +8,41 @@ CREATE TABLE tokudb_row_format_test_5 (a INT) ENGINE=TokuDB ROW_FORMAT=TOKUDB_ZL CREATE TABLE tokudb_row_format_test_6 (a INT) ENGINE=TokuDB ROW_FORMAT=TOKUDB_LZMA; CREATE TABLE tokudb_row_format_test_7 (a INT) ENGINE=TokuDB ROW_FORMAT=TOKUDB_QUICKLZ; CREATE TABLE tokudb_row_format_test_8 (a INT) ENGINE=TokuDB ROW_FORMAT=TOKUDB_SNAPPY; +CREATE TABLE tdb76_1 LIKE tokudb_row_format_test_1; +CREATE TABLE tdb76_2 LIKE tokudb_row_format_test_2; +CREATE TABLE tdb76_3 LIKE tokudb_row_format_test_3; +CREATE TABLE tdb76_4 LIKE tokudb_row_format_test_4; +CREATE TABLE tdb76_5 LIKE tokudb_row_format_test_5; +CREATE TABLE tdb76_6 LIKE tokudb_row_format_test_6; +CREATE TABLE tdb76_7 LIKE tokudb_row_format_test_7; +CREATE TABLE tdb76_8 LIKE tokudb_row_format_test_8; +CREATE TABLE tdb76_compact(a INT) ENGINE=TokuDB ROW_FORMAT=COMPACT; +Warnings: +Warning 1478 TokuDB: invalid ROW_FORMAT specifier. +CREATE TABLE tdb76_redundant(a INT) ENGINE=TokuDB ROW_FORMAT=REDUNDANT; +Warnings: +Warning 1478 TokuDB: invalid ROW_FORMAT specifier. +CREATE TABLE tdb76_dynamic(a INT) ENGINE=TokuDB ROW_FORMAT=DYNAMIC; +Warnings: +Warning 1478 TokuDB: invalid ROW_FORMAT specifier. +CREATE TABLE tdb76_compressed(a INT) ENGINE=TokuDB ROW_FORMAT=COMPRESSED; +Warnings: +Warning 1478 TokuDB: invalid ROW_FORMAT specifier. +SELECT table_name, row_format, engine FROM information_schema.tables WHERE table_name like 'tdb76_%' ORDER BY table_name; +table_name row_format engine +tdb76_1 tokudb_zlib TokuDB +tdb76_2 tokudb_quicklz TokuDB +tdb76_3 tokudb_lzma TokuDB +tdb76_4 tokudb_uncompressed TokuDB +tdb76_5 tokudb_zlib TokuDB +tdb76_6 tokudb_lzma TokuDB +tdb76_7 tokudb_quicklz TokuDB +tdb76_8 tokudb_snappy TokuDB +tdb76_compact tokudb_zlib TokuDB +tdb76_compressed tokudb_zlib TokuDB +tdb76_dynamic tokudb_zlib TokuDB +tdb76_redundant tokudb_zlib TokuDB +DROP TABLE tdb76_1, tdb76_2, tdb76_3, tdb76_4, tdb76_5, tdb76_6, tdb76_7, tdb76_8, tdb76_compact, tdb76_redundant, tdb76_dynamic, tdb76_compressed; SELECT table_name, row_format, engine FROM information_schema.tables WHERE table_name like 'tokudb_row_format_test%' ORDER BY table_name; table_name row_format engine tokudb_row_format_test_1 tokudb_zlib TokuDB @@ -45,6 +82,8 @@ SELECT table_name, row_format, engine FROM information_schema.tables WHERE table table_name row_format engine tokudb_row_format_test_1 tokudb_lzma TokuDB ALTER TABLE tokudb_row_format_test_1 ENGINE=TokuDB ROW_FORMAT=TOKUDB_DEFAULT; +Warnings: +Warning 1478 TokuDB: invalid ROW_FORMAT specifier. SELECT table_name, row_format, engine FROM information_schema.tables WHERE table_name = 'tokudb_row_format_test_1'; table_name row_format engine tokudb_row_format_test_1 tokudb_zlib TokuDB diff --git a/storage/tokudb/mysql-test/tokudb/t/card_scale_percent.test b/storage/tokudb/mysql-test/tokudb/t/card_scale_percent.test index 47f1eb37..75c53611 100644 --- a/storage/tokudb/mysql-test/tokudb/t/card_scale_percent.test +++ b/storage/tokudb/mysql-test/tokudb/t/card_scale_percent.test @@ -30,20 +30,18 @@ set session tokudb_analyze_throttle=0; -- enable_query_log -set global tokudb_cardinality_scale_percent = 10; analyze table tt; + +set global tokudb_cardinality_scale_percent = 10; show indexes from tt; set global tokudb_cardinality_scale_percent = 50; -analyze table tt; show indexes from tt; set global tokudb_cardinality_scale_percent = 100; -analyze table tt; show indexes from tt; set global tokudb_cardinality_scale_percent = 200; -analyze table tt; show indexes from tt; -- disable_query_log diff --git a/storage/tokudb/mysql-test/tokudb/t/locking-read-repeatable-read-1.test b/storage/tokudb/mysql-test/tokudb/t/locking-read-repeatable-read-1.test new file mode 100644 index 00000000..c5ef0f07 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb/t/locking-read-repeatable-read-1.test @@ -0,0 +1,23 @@ +source include/have_tokudb.inc; +source include/count_sessions.inc; +create table t (a int primary key, b int) ENGINE=TokuDB; +insert into t values (1,0); +set session transaction isolation level repeatable read; +begin; +# t1 select in share mode +select * from t where a=1 lock in share mode; +# t2 update +connect(conn1,localhost,root); +set session transaction isolation level repeatable read; +begin; +# t2 select for update, should hang until t1 commits +send update t set b=b+1 where a=1; +--error ER_LOCK_WAIT_TIMEOUT +reap; +# t2 update +connection default; +commit; +disconnect conn1; +drop table t; + +source include/wait_until_count_sessions.inc; diff --git a/storage/tokudb/mysql-test/tokudb/t/locking-read-repeatable-read-2.test b/storage/tokudb/mysql-test/tokudb/t/locking-read-repeatable-read-2.test new file mode 100644 index 00000000..20a4549c --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb/t/locking-read-repeatable-read-2.test @@ -0,0 +1,29 @@ +#the difference of this test from locking-read-repeatable-read-1 +#is that this test is on range query(gap lock) which actually +#examines a different patch + +source include/have_tokudb.inc; +source include/count_sessions.inc; +create table t (a int primary key, b int) ENGINE=TokuDB; +insert into t values (1,0); +insert into t values (2,1); +insert into t values (3,2); +set session transaction isolation level repeatable read; +begin; +# t1 select in share mode +select * from t lock in share mode; +# t2 update +connect(conn1,localhost,root); +set session transaction isolation level repeatable read; +begin; +# t2 select for update, should hang until t1 commits +send update t set b=b+1 where a=2; +--error ER_LOCK_WAIT_TIMEOUT +reap; +# t2 update +connection default; +commit; +disconnect conn1; +drop table t; + +source include/wait_until_count_sessions.inc; diff --git a/storage/tokudb/mysql-test/tokudb/t/nonflushing_analyze_debug.test b/storage/tokudb/mysql-test/tokudb/t/nonflushing_analyze_debug.test new file mode 100644 index 00000000..0c4c01b3 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb/t/nonflushing_analyze_debug.test @@ -0,0 +1,10 @@ +--source include/have_debug_sync.inc +--source include/have_tokudb.inc + +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=TokuDB; +INSERT INTO t1 VALUES (1), (2), (3); + +--let $percona_nonflushing_analyze_table= t1 +--source include/percona_nonflushing_analyze_debug.inc + +DROP TABLE t1; diff --git a/storage/tokudb/mysql-test/tokudb/t/row_format.test b/storage/tokudb/mysql-test/tokudb/t/row_format.test index 6533f8c0..9c5c6e64 100644 --- a/storage/tokudb/mysql-test/tokudb/t/row_format.test +++ b/storage/tokudb/mysql-test/tokudb/t/row_format.test @@ -12,6 +12,27 @@ CREATE TABLE tokudb_row_format_test_6 (a INT) ENGINE=TokuDB ROW_FORMAT=TOKUDB_LZ CREATE TABLE tokudb_row_format_test_7 (a INT) ENGINE=TokuDB ROW_FORMAT=TOKUDB_QUICKLZ; CREATE TABLE tokudb_row_format_test_8 (a INT) ENGINE=TokuDB ROW_FORMAT=TOKUDB_SNAPPY; +# TDB-76 : CREATE TABLE ... LIKE ... does not use source row_format on target table +CREATE TABLE tdb76_1 LIKE tokudb_row_format_test_1; +CREATE TABLE tdb76_2 LIKE tokudb_row_format_test_2; +CREATE TABLE tdb76_3 LIKE tokudb_row_format_test_3; +CREATE TABLE tdb76_4 LIKE tokudb_row_format_test_4; +CREATE TABLE tdb76_5 LIKE tokudb_row_format_test_5; +CREATE TABLE tdb76_6 LIKE tokudb_row_format_test_6; +CREATE TABLE tdb76_7 LIKE tokudb_row_format_test_7; +CREATE TABLE tdb76_8 LIKE tokudb_row_format_test_8; + +CREATE TABLE tdb76_compact(a INT) ENGINE=TokuDB ROW_FORMAT=COMPACT; +CREATE TABLE tdb76_redundant(a INT) ENGINE=TokuDB ROW_FORMAT=REDUNDANT; +CREATE TABLE tdb76_dynamic(a INT) ENGINE=TokuDB ROW_FORMAT=DYNAMIC; +CREATE TABLE tdb76_compressed(a INT) ENGINE=TokuDB ROW_FORMAT=COMPRESSED; + +SELECT table_name, row_format, engine FROM information_schema.tables WHERE table_name like 'tdb76_%' ORDER BY table_name; + +DROP TABLE tdb76_1, tdb76_2, tdb76_3, tdb76_4, tdb76_5, tdb76_6, tdb76_7, tdb76_8, tdb76_compact, tdb76_redundant, tdb76_dynamic, tdb76_compressed; + + + SELECT table_name, row_format, engine FROM information_schema.tables WHERE table_name like 'tokudb_row_format_test%' ORDER BY table_name; ALTER TABLE tokudb_row_format_test_1 ENGINE=TokuDB ROW_FORMAT=TOKUDB_FAST; diff --git a/storage/tokudb/mysql-test/tokudb_bugs/r/db756_card_part_hash_1_pick.result b/storage/tokudb/mysql-test/tokudb_bugs/r/db756_card_part_hash_1_pick.result index 5ba5da21..caaa963c 100644 --- a/storage/tokudb/mysql-test/tokudb_bugs/r/db756_card_part_hash_1_pick.result +++ b/storage/tokudb/mysql-test/tokudb_bugs/r/db756_card_part_hash_1_pick.result @@ -17,5 +17,5 @@ test.t analyze status OK show indexes from t; Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment t 0 PRIMARY 1 id A 7 NULL NULL BTREE -t 1 x 1 x A 3 NULL NULL YES BTREE +t 1 x 1 x A 7 NULL NULL YES BTREE drop table t; diff --git a/storage/tokudb/mysql-test/tokudb_parts/disabled.def b/storage/tokudb/mysql-test/tokudb_parts/disabled.def index 3252a463..17a8ddcc 100644 --- a/storage/tokudb/mysql-test/tokudb_parts/disabled.def +++ b/storage/tokudb/mysql-test/tokudb_parts/disabled.def @@ -7,3 +7,4 @@ partition_max_sub_parts_key_list_tokudb: 5.6 test not merged yet partition_max_sub_parts_key_range_tokudb: 5.6 test not merged yet partition_max_sub_parts_list_tokudb: 5.6 test not merged yet partition_max_sub_parts_range_tokudb: 5.6 test not merged yet +nonflushing_analyze_debug: Freezes in MariaDB 10.0 diff --git a/storage/tokudb/mysql-test/tokudb_parts/r/nonflushing_analyze_debug.result b/storage/tokudb/mysql-test/tokudb_parts/r/nonflushing_analyze_debug.result new file mode 100644 index 00000000..5a7bfb36 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_parts/r/nonflushing_analyze_debug.result @@ -0,0 +1,50 @@ +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=TokuDB +PARTITION BY RANGE (a) ( +PARTITION p0 VALUES LESS THAN (3), +PARTITION p1 VALUES LESS THAN (10)); +INSERT INTO t1 VALUES (1), (2), (3), (4); +SET DEBUG_SYNC="handler_ha_index_next_end SIGNAL idx_scan_in_progress WAIT_FOR finish_scan"; +SELECT * FROM t1; +SET DEBUG_SYNC="now WAIT_FOR idx_scan_in_progress"; +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +SELECT * FROM t1; +a +1 +2 +3 +4 +SET DEBUG_SYNC="now SIGNAL finish_scan"; +a +1 +2 +3 +4 +DROP TABLE t1; +CREATE TABLE t2 (a INT PRIMARY KEY) ENGINE=TokuDB +PARTITION BY RANGE (a) +SUBPARTITION BY HASH (A) +SUBPARTITIONS 2 ( +PARTITION p0 VALUES LESS THAN (3), +PARTITION p1 VALUES LESS THAN (10)); +INSERT INTO t2 VALUES (1), (2), (3), (4); +SET DEBUG_SYNC="handler_ha_index_next_end SIGNAL idx_scan_in_progress WAIT_FOR finish_scan"; +SELECT * FROM t2; +SET DEBUG_SYNC="now WAIT_FOR idx_scan_in_progress"; +ANALYZE TABLE t2; +Table Op Msg_type Msg_text +test.t2 analyze status OK +SELECT * FROM t2; +a +2 +1 +4 +3 +SET DEBUG_SYNC="now SIGNAL finish_scan"; +a +2 +1 +4 +3 +DROP TABLE t2; diff --git a/storage/tokudb/mysql-test/tokudb_parts/t/nonflushing_analyze_debug.test b/storage/tokudb/mysql-test/tokudb_parts/t/nonflushing_analyze_debug.test new file mode 100644 index 00000000..c99206ac --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_parts/t/nonflushing_analyze_debug.test @@ -0,0 +1,29 @@ +--source include/have_debug_sync.inc +--source include/have_tokudb.inc +--source include/have_partition.inc + +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=TokuDB + PARTITION BY RANGE (a) ( + PARTITION p0 VALUES LESS THAN (3), + PARTITION p1 VALUES LESS THAN (10)); + +INSERT INTO t1 VALUES (1), (2), (3), (4); + +--let $percona_nonflushing_analyze_table= t1 +--source include/percona_nonflushing_analyze_debug.inc + +DROP TABLE t1; + +CREATE TABLE t2 (a INT PRIMARY KEY) ENGINE=TokuDB + PARTITION BY RANGE (a) + SUBPARTITION BY HASH (A) + SUBPARTITIONS 2 ( + PARTITION p0 VALUES LESS THAN (3), + PARTITION p1 VALUES LESS THAN (10)); + +INSERT INTO t2 VALUES (1), (2), (3), (4); + +--let $percona_nonflushing_analyze_table= t2 +--source include/percona_nonflushing_analyze_debug.inc + +DROP TABLE t2; diff --git a/storage/tokudb/mysql-test/tokudb_perfschema/r/crash_tokudb.result b/storage/tokudb/mysql-test/tokudb_perfschema/r/crash_tokudb.result new file mode 100644 index 00000000..189d6bef --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_perfschema/r/crash_tokudb.result @@ -0,0 +1,30 @@ +SELECT COUNT(*) > 0 FROM performance_schema.setup_consumers +WHERE ENABLED = "NO"; +COUNT(*) > 0 +0 +SELECT COUNT(*) > 0 FROM performance_schema.setup_instruments +WHERE NAME LIKE "%/fti/%" AND (ENABLED = 'NO' OR TIMED = "NO"); +COUNT(*) > 0 +0 +CREATE TABLE t(a INT AUTO_INCREMENT PRIMARY KEY, b INT) ENGINE=TokuDB; +INSERT INTO t (b) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), +(1), (2), (3), (4), (5), (6), (7), (8), (9), (10), +(1), (2), (3), (4), (5), (6), (7), (8), (9), (10), +(1), (2), (3), (4), (5), (6), (7), (8), (9), (10), +(1), (2), (3), (4), (5), (6), (7), (8), (9), (10), +(1), (2), (3), (4), (5), (6), (7), (8), (9), (10), +(1), (2), (3), (4), (5), (6), (7), (8), (9), (10), +(1), (2), (3), (4), (5), (6), (7), (8), (9), (10), +(1), (2), (3), (4), (5), (6), (7), (8), (9), (10), +(1), (2), (3), (4), (5), (6), (7), (8), (9), (10); +INSERT INTO t (b) SELECT b FROM t; +UPDATE t SET b = 11 WHERE b = 10; +DELETE FROM t WHERE b = 1; +ALTER TABLE t ADD COLUMN c CHAR(10) default NULL; +TRUNCATE TABLE t; +RENAME TABLE t TO t1; +RENAME TABLE t1 TO t; +SELECT COUNT(*) > 0 FROM t; +COUNT(*) > 0 +0 +DROP TABLE t; diff --git a/storage/tokudb/mysql-test/tokudb_perfschema/r/start_server_tokudb.result b/storage/tokudb/mysql-test/tokudb_perfschema/r/start_server_tokudb.result new file mode 100644 index 00000000..2e220916 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_perfschema/r/start_server_tokudb.result @@ -0,0 +1,114 @@ +show databases; +Database +information_schema +mtr +mysql +performance_schema +test +select count(*) from performance_schema.performance_timers; +count(*) +5 +select count(*) from performance_schema.setup_consumers; +count(*) +12 +select count(*) > 3 from performance_schema.setup_instruments; +count(*) > 3 +1 +select count(*) from performance_schema.setup_timers; +count(*) +4 +select * from performance_schema.accounts; +select * from performance_schema.cond_instances; +select * from performance_schema.events_stages_current; +select * from performance_schema.events_stages_history; +select * from performance_schema.events_stages_history_long; +select * from performance_schema.events_stages_summary_by_account_by_event_name; +select * from performance_schema.events_stages_summary_by_host_by_event_name; +select * from performance_schema.events_stages_summary_by_thread_by_event_name; +select * from performance_schema.events_stages_summary_by_user_by_event_name; +select * from performance_schema.events_stages_summary_global_by_event_name; +select * from performance_schema.events_statements_current; +select * from performance_schema.events_statements_history; +select * from performance_schema.events_statements_history_long; +select * from performance_schema.events_statements_summary_by_account_by_event_name; +select * from performance_schema.events_statements_summary_by_digest; +select * from performance_schema.events_statements_summary_by_host_by_event_name; +select * from performance_schema.events_statements_summary_by_thread_by_event_name; +select * from performance_schema.events_statements_summary_by_user_by_event_name; +select * from performance_schema.events_statements_summary_global_by_event_name; +select * from performance_schema.events_waits_current; +select * from performance_schema.events_waits_history; +select * from performance_schema.events_waits_history_long; +select * from performance_schema.events_waits_summary_by_account_by_event_name; +select * from performance_schema.events_waits_summary_by_host_by_event_name; +select * from performance_schema.events_waits_summary_by_instance; +select * from performance_schema.events_waits_summary_by_thread_by_event_name; +select * from performance_schema.events_waits_summary_by_user_by_event_name; +select * from performance_schema.events_waits_summary_global_by_event_name; +select * from performance_schema.file_instances; +select * from performance_schema.file_summary_by_event_name; +select * from performance_schema.file_summary_by_instance; +select * from performance_schema.host_cache; +select * from performance_schema.hosts; +select * from performance_schema.mutex_instances; +select * from performance_schema.objects_summary_global_by_type; +select * from performance_schema.performance_timers; +select * from performance_schema.rwlock_instances; +select * from performance_schema.session_account_connect_attrs; +select * from performance_schema.session_connect_attrs; +select * from performance_schema.setup_actors; +select * from performance_schema.setup_consumers; +select * from performance_schema.setup_instruments; +select * from performance_schema.setup_objects; +select * from performance_schema.setup_timers; +select * from performance_schema.socket_instances; +select * from performance_schema.socket_summary_by_instance; +select * from performance_schema.socket_summary_by_event_name; +select * from performance_schema.table_io_waits_summary_by_index_usage; +select * from performance_schema.table_io_waits_summary_by_table; +select * from performance_schema.table_lock_waits_summary_by_table; +select * from performance_schema.threads; +select * from performance_schema.users; +show variables where +`Variable_name` != "performance_schema_max_statement_classes" and +`Variable_name` like "performance_schema%"; +Variable_name Value +performance_schema ON +performance_schema_accounts_size 100 +performance_schema_digests_size 200 +performance_schema_events_stages_history_long_size 1000 +performance_schema_events_stages_history_size 10 +performance_schema_events_statements_history_long_size 1000 +performance_schema_events_statements_history_size 10 +performance_schema_events_waits_history_long_size 10000 +performance_schema_events_waits_history_size 10 +performance_schema_hosts_size 100 +performance_schema_max_cond_classes 80 +performance_schema_max_cond_instances 1000 +performance_schema_max_digest_length 1024 +performance_schema_max_file_classes 50 +performance_schema_max_file_handles 32768 +performance_schema_max_file_instances 10000 +performance_schema_max_mutex_classes 200 +performance_schema_max_mutex_instances 5000 +performance_schema_max_rwlock_classes 40 +performance_schema_max_rwlock_instances 5000 +performance_schema_max_socket_classes 10 +performance_schema_max_socket_instances 1000 +performance_schema_max_stage_classes 150 +performance_schema_max_table_handles 1000 +performance_schema_max_table_instances 500 +performance_schema_max_thread_classes 50 +performance_schema_max_thread_instances 200 +performance_schema_session_connect_attrs_size 2048 +performance_schema_setup_actors_size 100 +performance_schema_setup_objects_size 100 +performance_schema_users_size 100 +show engine PERFORMANCE_SCHEMA status; +show status like "performance_schema%"; +SELECT COUNT(NAME) > 0 FROM performance_schema.setup_instruments WHERE NAME LIKE "%/fti/%"; +COUNT(NAME) > 0 +1 +SELECT COUNT(NAME) > 0 FROM performance_schema.threads WHERE NAME LIKE "%kibbutz%"; +COUNT(NAME) > 0 +1 diff --git a/storage/tokudb/mysql-test/tokudb_perfschema/t/crash_tokudb.test b/storage/tokudb/mysql-test/tokudb_perfschema/t/crash_tokudb.test new file mode 100644 index 00000000..31757a20 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_perfschema/t/crash_tokudb.test @@ -0,0 +1,36 @@ +# TokuDB PFS crash test: +# Make sure FTI instrumentation is on, execute base DDL, DML queries +# and make sure there is no crash. + +--source include/not_embedded.inc +--source include/have_perfschema.inc +--source include/have_tokudb.inc + +SELECT COUNT(*) > 0 FROM performance_schema.setup_consumers + WHERE ENABLED = "NO"; +SELECT COUNT(*) > 0 FROM performance_schema.setup_instruments + WHERE NAME LIKE "%/fti/%" AND (ENABLED = 'NO' OR TIMED = "NO"); + +CREATE TABLE t(a INT AUTO_INCREMENT PRIMARY KEY, b INT) ENGINE=TokuDB; +INSERT INTO t (b) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), + (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), + (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), + (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), + (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), + (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), + (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), + (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), + (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), + (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); +INSERT INTO t (b) SELECT b FROM t; + +UPDATE t SET b = 11 WHERE b = 10; +DELETE FROM t WHERE b = 1; + +ALTER TABLE t ADD COLUMN c CHAR(10) default NULL; +TRUNCATE TABLE t; +RENAME TABLE t TO t1; +RENAME TABLE t1 TO t; + +SELECT COUNT(*) > 0 FROM t; +DROP TABLE t; diff --git a/storage/tokudb/mysql-test/tokudb_perfschema/t/start_server_tokudb.test b/storage/tokudb/mysql-test/tokudb_perfschema/t/start_server_tokudb.test new file mode 100644 index 00000000..4034fba0 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_perfschema/t/start_server_tokudb.test @@ -0,0 +1,10 @@ +# Tests for PERFORMANCE_SCHEMA + +--source include/not_embedded.inc +--source include/have_perfschema.inc +--source include/have_tokudb.inc + +--source ../../perfschema/include/start_server_common.inc + +SELECT COUNT(NAME) > 0 FROM performance_schema.setup_instruments WHERE NAME LIKE "%/fti/%"; +SELECT COUNT(NAME) > 0 FROM performance_schema.threads WHERE NAME LIKE "%kibbutz%"; diff --git a/storage/tokudb/mysql-test/tokudb_perfschema/t/suite.opt b/storage/tokudb/mysql-test/tokudb_perfschema/t/suite.opt new file mode 100644 index 00000000..6d826fe9 --- /dev/null +++ b/storage/tokudb/mysql-test/tokudb_perfschema/t/suite.opt @@ -0,0 +1 @@ +--loose-enable-performance-schema $TOKUDB_OPT $TOKUDB_LOAD_ADD --loose-tokudb-check-jemalloc=0 --loose-tokudb-cache-size=512M --loose-tokudb-block-size=1M diff --git a/storage/tokudb/tokudb_background.cc b/storage/tokudb/tokudb_background.cc index e019e41c..13e0e932 100644 --- a/storage/tokudb/tokudb_background.cc +++ b/storage/tokudb/tokudb_background.cc @@ -66,13 +66,13 @@ void job_manager_t::destroy() { _sem.set_interrupt(); while (_background_jobs.size()) { - _mutex.lock(); + mutex_t_lock(_mutex); job_t* job = _background_jobs.front(); if (!job->cancelled()) cancel(job); _background_jobs.pop_front(); delete job; - _mutex.unlock(); + mutex_t_unlock(_mutex); } void* result; @@ -83,7 +83,7 @@ bool job_manager_t::run_job(job_t* newjob, bool background) { bool ret = false; const char* jobkey = newjob->key(); - _mutex.lock(); + mutex_t_lock(_mutex); assert_always(!_shutdown); for (jobs_t::iterator it = _background_jobs.begin(); @@ -138,15 +138,16 @@ bool job_manager_t::run_job(job_t* newjob, bool background) { } cleanup: - _mutex.unlock(); + mutex_t_unlock(_mutex); return ret; } bool job_manager_t::cancel_job(const char* key) { bool ret = false; - _mutex.lock(); + mutex_t_lock(_mutex); for (jobs_t::iterator it = _background_jobs.begin(); - it != _background_jobs.end(); it++) { + it != _background_jobs.end(); + it++) { job_t* job = *it; if (!job->cancelled() && strcmp(job->key(), key) == 0) { @@ -155,12 +156,11 @@ bool job_manager_t::cancel_job(const char* key) { } } - _mutex.unlock(); + mutex_t_unlock(_mutex); return ret; } void job_manager_t::iterate_jobs(pfn_iterate_t callback, void* extra) const { - - _mutex.lock(); + mutex_t_lock(_mutex); for (jobs_t::const_iterator it = _background_jobs.begin(); it != _background_jobs.end(); @@ -171,7 +171,7 @@ void job_manager_t::iterate_jobs(pfn_iterate_t callback, void* extra) const { } } - _mutex.unlock(); + mutex_t_unlock(_mutex); } void* job_manager_t::thread_func(void* v) { return ((tokudb::background::job_manager_t*)v)->real_thread_func(); @@ -189,14 +189,14 @@ void* job_manager_t::real_thread_func() { tokudb::time::sleep_microsec(250000); continue; } -#endif // TOKUDB_DEBUG +#endif // TOKUDB_DEBUG - _mutex.lock(); + mutex_t_lock(_mutex); assert_debug(_background_jobs.size() > 0); job_t* job = _background_jobs.front(); run(job); _background_jobs.pop_front(); - _mutex.unlock(); + mutex_t_unlock(_mutex); delete job; } } @@ -205,11 +205,11 @@ void* job_manager_t::real_thread_func() { void job_manager_t::run(job_t* job) { assert_debug(_mutex.is_owned_by_me()); if (!job->cancelled()) { - _mutex.unlock(); + mutex_t_unlock(_mutex); // do job job->run(); // done job - _mutex.lock(); + mutex_t_lock(_mutex); } if (!job->cancelled()) { job->destroy(); diff --git a/storage/tokudb/tokudb_background.h b/storage/tokudb/tokudb_background.h index 29991ab3..bf5eb97a 100644 --- a/storage/tokudb/tokudb_background.h +++ b/storage/tokudb/tokudb_background.h @@ -174,11 +174,11 @@ bool destroy(); inline void job_manager_t::lock() { assert_debug(!_mutex.is_owned_by_me()); - _mutex.lock(); + mutex_t_lock(_mutex); } inline void job_manager_t::unlock() { assert_debug(_mutex.is_owned_by_me()); - _mutex.unlock(); + mutex_t_unlock(_mutex); } inline void job_manager_t::job_t::run() { diff --git a/storage/tokudb/tokudb_information_schema.cc b/storage/tokudb/tokudb_information_schema.cc index 5cd0609a..bb263d5f 100644 --- a/storage/tokudb/tokudb_information_schema.cc +++ b/storage/tokudb/tokudb_information_schema.cc @@ -99,7 +99,7 @@ int trx_fill_table(THD* thd, TABLE_LIST* tables, COND* cond) { TOKUDB_DBUG_ENTER(""); int error; - tokudb_hton_initialized_lock.lock_read(); + rwlock_t_lock_read(tokudb_hton_initialized_lock); if (!tokudb_hton_initialized) { error = ER_PLUGIN_IS_NOT_LOADED; @@ -234,7 +234,7 @@ int lock_waits_fill_table(THD* thd, TABLE_LIST* tables, COND* cond) { TOKUDB_DBUG_ENTER(""); int error; - tokudb_hton_initialized_lock.lock_read(); + rwlock_t_lock_read(tokudb_hton_initialized_lock); if (!tokudb_hton_initialized) { error = ER_PLUGIN_IS_NOT_LOADED; @@ -377,7 +377,7 @@ int locks_fill_table(THD* thd, TABLE_LIST* tables, COND* cond) { TOKUDB_DBUG_ENTER(""); int error; - tokudb_hton_initialized_lock.lock_read(); + rwlock_t_lock_read(tokudb_hton_initialized_lock); if (!tokudb_hton_initialized) { error = ER_PLUGIN_IS_NOT_LOADED; @@ -521,7 +521,7 @@ int file_map_fill_table(THD* thd, TABLE_LIST* tables, COND* cond) { int error; TABLE* table = tables->table; - tokudb_hton_initialized_lock.lock_read(); + rwlock_t_lock_read(tokudb_hton_initialized_lock); if (!tokudb_hton_initialized) { error = ER_PLUGIN_IS_NOT_LOADED; @@ -728,7 +728,7 @@ int fractal_tree_info_fill_table(THD* thd, TABLE_LIST* tables, COND* cond) { // 3938: Get a read lock on the status flag, since we must // read it before safely proceeding - tokudb_hton_initialized_lock.lock_read(); + rwlock_t_lock_read(tokudb_hton_initialized_lock); if (!tokudb_hton_initialized) { error = ER_PLUGIN_IS_NOT_LOADED; @@ -1025,7 +1025,7 @@ int fractal_tree_block_map_fill_table( // 3938: Get a read lock on the status flag, since we must // read it before safely proceeding - tokudb_hton_initialized_lock.lock_read(); + rwlock_t_lock_read(tokudb_hton_initialized_lock); if (!tokudb_hton_initialized) { error = ER_PLUGIN_IS_NOT_LOADED; @@ -1162,7 +1162,7 @@ int background_job_status_fill_table(THD *thd, TABLE_LIST *tables, COND *cond) { int error; TABLE* table = tables->table; - tokudb_hton_initialized_lock.lock_read(); + rwlock_t_lock_read(tokudb_hton_initialized_lock); if (!tokudb_hton_initialized) { error = ER_PLUGIN_IS_NOT_LOADED; diff --git a/storage/tokudb/tokudb_thread.cc b/storage/tokudb/tokudb_thread.cc index f27e803a..6fc11919 100644 --- a/storage/tokudb/tokudb_thread.cc +++ b/storage/tokudb/tokudb_thread.cc @@ -29,6 +29,7 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. namespace tokudb { namespace thread { +const pfs_key_t pfs_not_instrumented = 0xFFFFFFFF; pthread_t mutex_t::_null_owner = 0; } // namespace thread diff --git a/storage/tokudb/tokudb_thread.h b/storage/tokudb/tokudb_thread.h index dcb1fd6e..dec58f3f 100644 --- a/storage/tokudb/tokudb_thread.h +++ b/storage/tokudb/tokudb_thread.h @@ -34,95 +34,68 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved. namespace tokudb { namespace thread { -#if (defined(__MACH__) || defined(__APPLE__)) && _POSIX_TIMERS <= 0 - -#define _x_min(a, b) ((a) < (b) ? (a) : (b)) - -#define timed_lock_define(timed_func_name, lock_type_name, lock_func_name) \ -inline int timed_func_name(lock_type_name *mutex, \ - const struct timespec *abs_timeout) { \ - int pthread_rc; \ - struct timespec remaining, slept, ts; \ - static const int sleep_step = 1000000; \ - \ - remaining = *abs_timeout; \ - while ((pthread_rc = lock_func_name(mutex)) == EBUSY) { \ - ts.tv_sec = 0; \ - ts.tv_nsec = (remaining.tv_sec > 0 ? \ - sleep_step : \ - _x_min(remaining.tv_nsec,sleep_step)); \ - nanosleep(&ts, &slept); \ - ts.tv_nsec -= slept.tv_nsec; \ - if (ts.tv_nsec <= remaining.tv_nsec) { \ - remaining.tv_nsec -= ts.tv_nsec; \ - } else { \ - remaining.tv_sec--; \ - remaining.tv_nsec = \ - (sleep_step - (ts.tv_nsec - remaining.tv_nsec)); \ - } \ - if (remaining.tv_sec < 0 || \ - (!remaining.tv_sec && remaining.tv_nsec <= 0)) { \ - return ETIMEDOUT; \ - } \ - } \ - \ - return pthread_rc; \ -} - -timed_lock_define(pthread_mutex_timedlock, - pthread_mutex_t, - pthread_mutex_trylock); - -timed_lock_define(pthread_rwlock_timedrdlock, - pthread_rwlock_t, - pthread_rwlock_tryrdlock); - -timed_lock_define(pthread_rwlock_timedwrlock, - pthread_rwlock_t, - pthread_rwlock_trywrlock); - -#endif //(defined(__MACH__) || defined(__APPLE__)) && _POSIX_TIMERS <= 0 +extern const pfs_key_t pfs_not_instrumented; uint my_tid(void); // Your basic mutex class mutex_t { public: - mutex_t(void); + explicit mutex_t(pfs_key_t key); + mutex_t(void) : mutex_t(pfs_not_instrumented) {} ~mutex_t(void); - void lock(void); - int lock(ulonglong microseconds); - void unlock(void); + void reinit(pfs_key_t key); + void lock( +#ifdef HAVE_PSI_MUTEX_INTERFACE + const char* src_file, + uint src_line +#endif // HAVE_PSI_MUTEX_INTERFACE + ); + void unlock( +#ifdef HAVE_PSI_MUTEX_INTERFACE + const char* src_file, + uint src_line +#endif // HAVE_PSI_MUTEX_INTERFACE + ); #ifdef TOKUDB_DEBUG bool is_owned_by_me(void) const; #endif private: static pthread_t _null_owner; - pthread_mutex_t _mutex; + mysql_mutex_t _mutex; #ifdef TOKUDB_DEBUG - uint _owners; - pthread_t _owner; + uint _owners; + pthread_t _owner; #endif }; // Simple read write lock class rwlock_t { public: - rwlock_t(void); + explicit rwlock_t(pfs_key_t key); + rwlock_t(void) : rwlock_t(pfs_not_instrumented) {} ~rwlock_t(void); - void lock_read(void); - int lock_read(ulonglong microseconds); - void lock_write(void); - int lock_write(ulonglong microseconds); + void lock_read( +#ifdef HAVE_PSI_RWLOCK_INTERFACE + const char* src_file, + uint src_line +#endif // HAVE_PSI_RWLOCK_INTERFACE + ); + void lock_write( +#ifdef HAVE_PSI_RWLOCK_INTERFACE + const char* src_file, + uint src_line +#endif // HAVE_PSI_RWLOCK_INTERFACE + ); void unlock(void); private: rwlock_t(const rwlock_t&); rwlock_t& operator=(const rwlock_t&); - pthread_rwlock_t _rwlock; + mysql_rwlock_t _rwlock; }; // Simple event signal/wait class @@ -224,57 +197,76 @@ class thread_t { pthread_t _thread; }; +inline uint my_tid(void) { return (uint)toku_os_gettid(); } -inline uint my_tid(void) { - return (uint)toku_os_gettid(); -} - - -inline mutex_t::mutex_t(void) { - #ifdef TOKUDB_DEBUG - _owners = 0; - _owner = _null_owner; - #endif - int r = pthread_mutex_init(&_mutex, MY_MUTEX_INIT_FAST); +inline mutex_t::mutex_t(pfs_key_t key) { +#ifdef TOKUDB_DEBUG + _owners = 0; + _owner = _null_owner; +#endif + int r MY_ATTRIBUTE((unused)) = mysql_mutex_init(key, &_mutex, MY_MUTEX_INIT_FAST); assert_debug(r == 0); } inline mutex_t::~mutex_t(void) { - #ifdef TOKUDB_DEBUG - assert_debug(_owners == 0); - #endif - int r = pthread_mutex_destroy(&_mutex); +#ifdef TOKUDB_DEBUG + assert_debug(_owners == 0); +#endif + int r MY_ATTRIBUTE((unused)) = mysql_mutex_destroy(&_mutex); assert_debug(r == 0); } -inline void mutex_t::lock(void) { - assert_debug(is_owned_by_me() == false); - int r = pthread_mutex_lock(&_mutex); +inline void mutex_t::reinit(pfs_key_t key) { +#ifdef TOKUDB_DEBUG + assert_debug(_owners == 0); +#endif + int r MY_ATTRIBUTE((unused)); + r = mysql_mutex_destroy(&_mutex); + assert_debug(r == 0); + r = mysql_mutex_init(key, &_mutex, MY_MUTEX_INIT_FAST); assert_debug(r == 0); - #ifdef TOKUDB_DEBUG - _owners++; - _owner = pthread_self(); - #endif } -inline int mutex_t::lock(ulonglong microseconds) { +inline void mutex_t::lock( +#ifdef HAVE_PSI_MUTEX_INTERFACE + const char* src_file, + uint src_line +#endif // HAVE_PSI_MUTEX_INTERFACE + ) { assert_debug(is_owned_by_me() == false); - timespec waittime = time::offset_timespec(microseconds); - int r = pthread_mutex_timedlock(&_mutex, &waittime); - #ifdef TOKUDB_DEBUG - if (r == 0) { - _owners++; - _owner = pthread_self(); - } - #endif - assert_debug(r == 0 || r == ETIMEDOUT); - return r; + int r MY_ATTRIBUTE((unused)) = inline_mysql_mutex_lock(&_mutex +#ifdef HAVE_PSI_MUTEX_INTERFACE + , + src_file, + src_line +#endif // HAVE_PSI_MUTEX_INTERFACE + ); + assert_debug(r == 0); +#ifdef TOKUDB_DEBUG + _owners++; + _owner = pthread_self(); +#endif } -inline void mutex_t::unlock(void) { - #ifdef TOKUDB_DEBUG - assert_debug(_owners > 0); - assert_debug(is_owned_by_me()); - _owners--; - _owner = _null_owner; - #endif - int r = pthread_mutex_unlock(&_mutex); +inline void mutex_t::unlock( +#ifdef HAVE_PSI_MUTEX_INTERFACE + const char* src_file, + uint src_line +#endif // HAVE_PSI_MUTEX_INTERFACE + ) { +#ifndef SAFE_MUTEX + (void)(src_file); + (void)(src_line); +#endif // SAFE_MUTEX +#ifdef TOKUDB_DEBUG + assert_debug(_owners > 0); + assert_debug(is_owned_by_me()); + _owners--; + _owner = _null_owner; +#endif + int r MY_ATTRIBUTE((unused)) = inline_mysql_mutex_unlock(&_mutex +#ifdef SAFE_MUTEX + , + src_file, + src_line +#endif // SAFE_MUTEX + ); assert_debug(r == 0); } #ifdef TOKUDB_DEBUG @@ -283,44 +275,28 @@ inline bool mutex_t::is_owned_by_me(void) const { } #endif - -inline rwlock_t::rwlock_t(void) { - int r = pthread_rwlock_init(&_rwlock, NULL); +inline rwlock_t::rwlock_t(pfs_key_t key) { + int r MY_ATTRIBUTE((unused)) = mysql_rwlock_init(key, &_rwlock); assert_debug(r == 0); } inline rwlock_t::~rwlock_t(void) { - int r = pthread_rwlock_destroy(&_rwlock); - assert_debug(r == 0); -} -inline void rwlock_t::lock_read(void) { - int r; - while ((r = pthread_rwlock_rdlock(&_rwlock)) != 0) { - if (r == EBUSY || r == EAGAIN) { - time::sleep_microsec(1000); - continue; - } - break; - } - assert_debug(r == 0); -} -inline int rwlock_t::lock_read(ulonglong microseconds) { - int r; - timespec waittime = time::offset_timespec(microseconds); - while ((r = pthread_rwlock_timedrdlock(&_rwlock, &waittime)) != 0) { - if (r == EBUSY || r == EAGAIN) { - time::sleep_microsec(1000); - continue; - } else if (r == ETIMEDOUT) { - return ETIMEDOUT; - } - break; - } + int r MY_ATTRIBUTE((unused)) = mysql_rwlock_destroy(&_rwlock); assert_debug(r == 0); - return r; } -inline void rwlock_t::lock_write(void) { +inline void rwlock_t::lock_read( +#ifdef HAVE_PSI_RWLOCK_INTERFACE + const char* src_file, + uint src_line +#endif // HAVE_PSI_RWLOCK_INTERFACE + ) { int r; - while ((r = pthread_rwlock_wrlock(&_rwlock)) != 0) { + while ((r = inline_mysql_rwlock_rdlock(&_rwlock +#ifdef HAVE_PSI_RWLOCK_INTERFACE + , + src_file, + src_line +#endif // HAVE_PSI_RWLOCK_INTERFACE + )) != 0) { if (r == EBUSY || r == EAGAIN) { time::sleep_microsec(1000); continue; @@ -329,27 +305,33 @@ inline void rwlock_t::lock_write(void) { } assert_debug(r == 0); } -inline int rwlock_t::lock_write(ulonglong microseconds) { +inline void rwlock_t::lock_write( +#ifdef HAVE_PSI_RWLOCK_INTERFACE + const char* src_file, + uint src_line +#endif // HAVE_PSI_RWLOCK_INTERFACE + ) { int r; - timespec waittime = time::offset_timespec(microseconds); - while ((r = pthread_rwlock_timedwrlock(&_rwlock, &waittime)) != 0) { + while ((r = inline_mysql_rwlock_wrlock(&_rwlock +#ifdef HAVE_PSI_RWLOCK_INTERFACE + , + src_file, + src_line +#endif // HAVE_PSI_RWLOCK_INTERFACE + )) != 0) { if (r == EBUSY || r == EAGAIN) { time::sleep_microsec(1000); continue; - } else if (r == ETIMEDOUT) { - return ETIMEDOUT; } break; } assert_debug(r == 0); - return r; } inline void rwlock_t::unlock(void) { - int r = pthread_rwlock_unlock(&_rwlock); + int r MY_ATTRIBUTE((unused)) = mysql_rwlock_unlock(&_rwlock); assert_debug(r == 0); } -inline rwlock_t::rwlock_t(const rwlock_t&) { -} +inline rwlock_t::rwlock_t(const rwlock_t&) {} inline rwlock_t& rwlock_t::operator=(const rwlock_t&) { return *this; } @@ -358,7 +340,7 @@ inline rwlock_t& rwlock_t::operator=(const rwlock_t&) { inline event_t::event_t(bool create_signalled, bool manual_reset) : _manual_reset(manual_reset) { - int r = pthread_mutex_init(&_mutex, NULL); + int r MY_ATTRIBUTE((unused)) = pthread_mutex_init(&_mutex, NULL); assert_debug(r == 0); r = pthread_cond_init(&_cond, NULL); assert_debug(r == 0); @@ -370,13 +352,13 @@ inline event_t::event_t(bool create_signalled, bool manual_reset) : _pulsed = false; } inline event_t::~event_t(void) { - int r = pthread_mutex_destroy(&_mutex); + int r MY_ATTRIBUTE((unused)) = pthread_mutex_destroy(&_mutex); assert_debug(r == 0); r = pthread_cond_destroy(&_cond); assert_debug(r == 0); } inline void event_t::wait(void) { - int r = pthread_mutex_lock(&_mutex); + int r MY_ATTRIBUTE((unused)) = pthread_mutex_lock(&_mutex); assert_debug(r == 0); while (_signalled == false && _pulsed == false) { r = pthread_cond_wait(&_cond, &_mutex); @@ -413,7 +395,7 @@ inline int event_t::wait(ulonglong microseconds) { return 0; } inline void event_t::signal(void) { - int r = pthread_mutex_lock(&_mutex); + int r MY_ATTRIBUTE((unused)) = pthread_mutex_lock(&_mutex); assert_debug(r == 0); _signalled = true; if (_manual_reset) { @@ -427,7 +409,7 @@ inline void event_t::signal(void) { assert_debug(r == 0); } inline void event_t::pulse(void) { - int r = pthread_mutex_lock(&_mutex); + int r MY_ATTRIBUTE((unused)) = pthread_mutex_lock(&_mutex); assert_debug(r == 0); _pulsed = true; r = pthread_cond_signal(&_cond); @@ -437,7 +419,7 @@ inline void event_t::pulse(void) { } inline bool event_t::signalled(void) { bool ret = false; - int r = pthread_mutex_lock(&_mutex); + int r MY_ATTRIBUTE((unused)) = pthread_mutex_lock(&_mutex); assert_debug(r == 0); ret = _signalled; r = pthread_mutex_unlock(&_mutex); @@ -445,7 +427,7 @@ inline bool event_t::signalled(void) { return ret; } inline void event_t::reset(void) { - int r = pthread_mutex_lock(&_mutex); + int r MY_ATTRIBUTE((unused)) = pthread_mutex_lock(&_mutex); assert_debug(r == 0); _signalled = false; _pulsed = false; @@ -467,21 +449,21 @@ inline semaphore_t::semaphore_t( _initial_count(initial_count), _max_count(max_count) { - int r = pthread_mutex_init(&_mutex, NULL); + int r MY_ATTRIBUTE((unused)) = pthread_mutex_init(&_mutex, NULL); assert_debug(r == 0); r = pthread_cond_init(&_cond, NULL); assert_debug(r == 0); _signalled = _initial_count; } inline semaphore_t::~semaphore_t(void) { - int r = pthread_mutex_destroy(&_mutex); + int r MY_ATTRIBUTE((unused)) = pthread_mutex_destroy(&_mutex); assert_debug(r == 0); r = pthread_cond_destroy(&_cond); assert_debug(r == 0); } inline semaphore_t::E_WAIT semaphore_t::wait(void) { E_WAIT ret; - int r = pthread_mutex_lock(&_mutex); + int r MY_ATTRIBUTE((unused)) = pthread_mutex_lock(&_mutex); assert_debug(r == 0); while (_signalled == 0 && _interrupted == false) { r = pthread_cond_wait(&_cond, &_mutex); @@ -524,7 +506,7 @@ inline semaphore_t::E_WAIT semaphore_t::wait(ulonglong microseconds) { } inline bool semaphore_t::signal(void) { bool ret = false; - int r = pthread_mutex_lock(&_mutex); + int r MY_ATTRIBUTE((unused)) = pthread_mutex_lock(&_mutex); assert_debug(r == 0); if (_signalled < _max_count) { _signalled++; @@ -538,7 +520,7 @@ inline bool semaphore_t::signal(void) { } inline int semaphore_t::signalled(void) { int ret = 0; - int r = pthread_mutex_lock(&_mutex); + int r MY_ATTRIBUTE((unused)) = pthread_mutex_lock(&_mutex); assert_debug(r == 0); ret = _signalled; r = pthread_mutex_unlock(&_mutex); @@ -546,7 +528,7 @@ inline int semaphore_t::signalled(void) { return ret; } inline void semaphore_t::reset(void) { - int r = pthread_mutex_lock(&_mutex); + int r MY_ATTRIBUTE((unused)) = pthread_mutex_lock(&_mutex); assert_debug(r == 0); _signalled = 0; r = pthread_mutex_unlock(&_mutex); @@ -554,7 +536,7 @@ inline void semaphore_t::reset(void) { return; } inline void semaphore_t::set_interrupt(void) { - int r = pthread_mutex_lock(&_mutex); + int r MY_ATTRIBUTE((unused)) = pthread_mutex_lock(&_mutex); assert_debug(r == 0); _interrupted = true; r = pthread_cond_broadcast(&_cond); @@ -563,7 +545,7 @@ inline void semaphore_t::set_interrupt(void) { assert_debug(r == 0); } inline void semaphore_t::clear_interrupt(void) { - int r = pthread_mutex_lock(&_mutex); + int r MY_ATTRIBUTE((unused)) = pthread_mutex_lock(&_mutex); assert_debug(r == 0); _interrupted = false; r = pthread_mutex_unlock(&_mutex); diff --git a/storage/xtradb/api/api0api.cc b/storage/xtradb/api/api0api.cc index 1abb0b2b..55ed555e 100644 --- a/storage/xtradb/api/api0api.cc +++ b/storage/xtradb/api/api0api.cc @@ -398,7 +398,7 @@ ib_read_tuple( data = btr_rec_copy_externally_stored_field( copy, offsets, zip_size, i, &len, - tuple->heap, NULL); + tuple->heap); ut_a(len != UNIV_SQL_NULL); } diff --git a/storage/xtradb/btr/btr0cur.cc b/storage/xtradb/btr/btr0cur.cc index f22871de..e29d9091 100644 --- a/storage/xtradb/btr/btr0cur.cc +++ b/storage/xtradb/btr/btr0cur.cc @@ -3991,7 +3991,6 @@ static const ib_int64_t rows_in_range_arbitrary_ret_val = 10; @param[in] mode1 search mode for range start @param[in] tuple2 range end, may also be empty tuple @param[in] mode2 search mode for range end -@param[in] trx trx @param[in] nth_attempt if the tree gets modified too much while we are trying to analyze it, then we will retry (this function will call itself, incrementing this parameter) @@ -4008,7 +4007,6 @@ btr_estimate_n_rows_in_range_low( ulint mode1, const dtuple_t* tuple2, ulint mode2, - trx_t* trx, unsigned nth_attempt) { btr_path_t path1[BTR_PATH_ARRAY_N_SLOTS]; @@ -4027,7 +4025,7 @@ btr_estimate_n_rows_in_range_low( table_n_rows = dict_table_get_n_rows(index->table); - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); cursor.path_arr = path1; @@ -4049,7 +4047,7 @@ btr_estimate_n_rows_in_range_low( return (0); } - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); #ifdef UNIV_DEBUG if (!strcmp(index->name, "iC")) { @@ -4144,7 +4142,7 @@ btr_estimate_n_rows_in_range_low( const ib_int64_t ret = btr_estimate_n_rows_in_range_low( index, tuple1, mode1, - tuple2, mode2, trx, + tuple2, mode2, nth_attempt + 1); return(ret); @@ -4205,7 +4203,6 @@ btr_estimate_n_rows_in_range_low( @param[in] mode1 search mode for range start @param[in] tuple2 range end, may also be empty tuple @param[in] mode2 search mode for range end -@param[in] trx trx @return estimated number of rows */ ib_int64_t btr_estimate_n_rows_in_range( @@ -4213,11 +4210,10 @@ btr_estimate_n_rows_in_range( const dtuple_t* tuple1, ulint mode1, const dtuple_t* tuple2, - ulint mode2, - trx_t* trx) + ulint mode2) { const ib_int64_t ret = btr_estimate_n_rows_in_range_low( - index, tuple1, mode1, tuple2, mode2, trx, + index, tuple1, mode1, tuple2, mode2, 1 /* first attempt */); return(ret); @@ -5757,8 +5753,7 @@ btr_copy_blob_prefix( ulint len, /*!< in: length of buf, in bytes */ ulint space_id,/*!< in: space id of the BLOB pages */ ulint page_no,/*!< in: page number of the first BLOB page */ - ulint offset, /*!< in: offset on the first BLOB page */ - trx_t* trx) /*!< in: transaction handle */ + ulint offset) /*!< in: offset on the first BLOB page */ { ulint copied_len = 0; @@ -5770,7 +5765,7 @@ btr_copy_blob_prefix( ulint part_len; ulint copy_len; - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); block = buf_page_get(space_id, 0, page_no, RW_S_LATCH, &mtr); buf_block_dbg_add_level(block, SYNC_EXTERN_STORAGE); @@ -5973,8 +5968,7 @@ btr_copy_externally_stored_field_prefix_low( zero for uncompressed BLOBs */ ulint space_id,/*!< in: space id of the first BLOB page */ ulint page_no,/*!< in: page number of the first BLOB page */ - ulint offset, /*!< in: offset on the first BLOB page */ - trx_t* trx) /*!< in: transaction handle */ + ulint offset) /*!< in: offset on the first BLOB page */ { if (UNIV_UNLIKELY(len == 0)) { return(0); @@ -5985,7 +5979,7 @@ btr_copy_externally_stored_field_prefix_low( space_id, page_no, offset)); } else { return(btr_copy_blob_prefix(buf, len, space_id, - page_no, offset, trx)); + page_no, offset)); } } @@ -6006,8 +6000,7 @@ btr_copy_externally_stored_field_prefix( field containing also the reference to the external part; must be protected by a lock or a page latch */ - ulint local_len,/*!< in: length of data, in bytes */ - trx_t* trx) /*!< in: transaction handle */ + ulint local_len)/*!< in: length of data, in bytes */ { ulint space_id; ulint page_no; @@ -6046,7 +6039,7 @@ btr_copy_externally_stored_field_prefix( len - local_len, zip_size, space_id, page_no, - offset, trx)); + offset)); } /*******************************************************************//** @@ -6065,8 +6058,7 @@ btr_copy_externally_stored_field( ulint zip_size,/*!< in: nonzero=compressed BLOB page size, zero for uncompressed BLOBs */ ulint local_len,/*!< in: length of data */ - mem_heap_t* heap, /*!< in: mem heap */ - trx_t* trx) /*!< in: transaction handle */ + mem_heap_t* heap) /*!< in: mem heap */ { ulint space_id; ulint page_no; @@ -6097,8 +6089,7 @@ btr_copy_externally_stored_field( extern_len, zip_size, space_id, - page_no, offset, - trx); + page_no, offset); return(buf); } @@ -6117,8 +6108,7 @@ btr_rec_copy_externally_stored_field( zero for uncompressed BLOBs */ ulint no, /*!< in: field number */ ulint* len, /*!< out: length of the field */ - mem_heap_t* heap, /*!< in: mem heap */ - trx_t* trx) /*!< in: transaction handle */ + mem_heap_t* heap) /*!< in: mem heap */ { ulint local_len; const byte* data; @@ -6149,7 +6139,6 @@ btr_rec_copy_externally_stored_field( } return(btr_copy_externally_stored_field(len, data, - zip_size, local_len, heap, - trx)); + zip_size, local_len, heap)); } #endif /* !UNIV_HOTBACKUP */ diff --git a/storage/xtradb/btr/btr0pcur.cc b/storage/xtradb/btr/btr0pcur.cc index 0b970e1c..06166e1a 100644 --- a/storage/xtradb/btr/btr0pcur.cc +++ b/storage/xtradb/btr/btr0pcur.cc @@ -33,6 +33,7 @@ Created 2/23/1996 Heikki Tuuri #include "rem0cmp.h" #include "trx0trx.h" #include "srv0srv.h" + /**************************************************************//** Allocates memory for a persistent cursor object and initializes the cursor. @return own: persistent cursor */ @@ -511,7 +512,7 @@ btr_pcur_move_backward_from_page( mtr_commit(mtr); - mtr_start_trx(mtr, mtr->trx); + mtr_start(mtr); btr_pcur_restore_position(latch_mode2, cursor, mtr); diff --git a/storage/xtradb/buf/buf0buddy.cc b/storage/xtradb/buf/buf0buddy.cc index 2ee39c6c..1c50e71e 100644 --- a/storage/xtradb/buf/buf0buddy.cc +++ b/storage/xtradb/buf/buf0buddy.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 2006, 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 @@ -667,7 +668,7 @@ buf_buddy_free_low( ut_ad(buf_pool->buddy_stat[i].used > 0); buf_pool->buddy_stat[i].used--; recombine: - UNIV_MEM_ASSERT_AND_ALLOC(buf, BUF_BUDDY_LOW << i); + UNIV_MEM_ALLOC(buf, BUF_BUDDY_LOW << i); if (i == BUF_BUDDY_SIZES) { mutex_exit(&buf_pool->zip_free_mutex); diff --git a/storage/xtradb/buf/buf0lru.cc b/storage/xtradb/buf/buf0lru.cc index c71d4500..7bf423ed 100644 --- a/storage/xtradb/buf/buf0lru.cc +++ b/storage/xtradb/buf/buf0lru.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 @@ -87,6 +87,10 @@ buffer pools. */ frames in the buffer pool, we set this to TRUE */ static ibool buf_lru_switched_on_innodb_mon = FALSE; +/** True if diagnostic message about difficult to find free blocks +in the buffer bool has already printed. */ +static bool buf_lru_free_blocks_error_printed; + /******************************************************************//** These statistics are not 'of' LRU but 'for' LRU. We keep count of I/O and page_zip_decompress() operations. Based on the statistics, @@ -1080,68 +1084,39 @@ buf_LRU_check_size_of_non_data_objects( } /** Diagnose failure to get a free page and request InnoDB monitor output in -the error log if more than two seconds have been spent already. +the error log if it has not yet printed. @param[in] n_iterations how many buf_LRU_get_free_page iterations already completed -@param[in] started_ms timestamp in ms of when the attempt to get the - free page started @param[in] flush_failures how many times single-page flush, if allowed, has failed -@param[out] mon_value_was previous srv_print_innodb_monitor value -@param[out] started_monitor whether InnoDB monitor print has been requested */ static void -buf_LRU_handle_lack_of_free_blocks(ulint n_iterations, ulint started_ms, - ulint flush_failures, - ibool *mon_value_was, - ibool *started_monitor) +buf_LRU_handle_lack_of_free_blocks( + ulint n_iterations, + ulint flush_failures) { - static ulint last_printout_ms = 0; - - /* Legacy algorithm started warning after at least 2 seconds, we - emulate this. */ - const ulint current_ms = ut_time_ms(); - - if ((current_ms > started_ms + 2000) - && (current_ms > last_printout_ms + 2000)) { - - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Warning: difficult to find free blocks in\n" - "InnoDB: the buffer pool (%lu search iterations)!\n" - "InnoDB: %lu failed attempts to flush a page!" - " Consider\n" - "InnoDB: increasing the buffer pool size.\n" - "InnoDB: It is also possible that" - " in your Unix version\n" - "InnoDB: fsync is very slow, or" - " completely frozen inside\n" - "InnoDB: the OS kernel. Then upgrading to" - " a newer version\n" - "InnoDB: of your operating system may help." - " Look at the\n" - "InnoDB: number of fsyncs in diagnostic info below.\n" - "InnoDB: Pending flushes (fsync) log: %lu;" - " buffer pool: %lu\n" - "InnoDB: %lu OS file reads, %lu OS file writes," - " %lu OS fsyncs\n" - "InnoDB: Starting InnoDB Monitor to print further\n" - "InnoDB: diagnostics to the standard output.\n", - (ulong) n_iterations, - (ulong) flush_failures, - (ulong) fil_n_pending_log_flushes, - (ulong) fil_n_pending_tablespace_flushes, - (ulong) os_n_file_reads, (ulong) os_n_file_writes, - (ulong) os_n_fsyncs); - - last_printout_ms = current_ms; - *mon_value_was = srv_print_innodb_monitor; - *started_monitor = TRUE; - srv_print_innodb_monitor = TRUE; - os_event_set(lock_sys->timeout_event); + if (n_iterations > 20 && !buf_lru_free_blocks_error_printed) { + ib_logf(IB_LOG_LEVEL_WARN, + "Difficult to find free blocks in" + " the buffer pool (" ULINTPF " search iterations)! " + ULINTPF " failed attempts to flush a page!", + n_iterations, flush_failures); + ib_logf(IB_LOG_LEVEL_INFO, + "Consider increasing the buffer pool size."); + ib_logf(IB_LOG_LEVEL_INFO, + "Pending flushes (fsync) log: " ULINTPF + " buffer pool: " ULINTPF + " OS file reads: " ULINTPF " OS file writes: " + ULINTPF " OS fsyncs: " ULINTPF "", + fil_n_pending_log_flushes, + fil_n_pending_tablespace_flushes, + os_n_file_reads, + os_n_file_writes, + os_n_fsyncs); + + buf_lru_free_blocks_error_printed = true; } - } /** The maximum allowed backoff sleep time duration, microseconds */ @@ -1189,9 +1164,6 @@ buf_LRU_get_free_block( ibool freed = FALSE; ulint n_iterations = 0; ulint flush_failures = 0; - ibool mon_value_was = FALSE; - ibool started_monitor = FALSE; - ulint started_ms = 0; ut_ad(!mutex_own(&buf_pool->LRU_list_mutex)); @@ -1199,42 +1171,20 @@ buf_LRU_get_free_block( loop: buf_LRU_check_size_of_non_data_objects(buf_pool); - /* If there is a block in the free list, take it */ - if (DBUG_EVALUATE_IF("simulate_lack_of_pages", true, false)) { - - block = NULL; - - if (srv_debug_monitor_printed) - DBUG_SET("-d,simulate_lack_of_pages"); - - } else if (DBUG_EVALUATE_IF("simulate_recovery_lack_of_pages", - recv_recovery_on, false)) { - - block = NULL; - - if (srv_debug_monitor_printed) - DBUG_SUICIDE(); - } else { + DBUG_EXECUTE_IF("ib_lru_force_no_free_page", + if (!buf_lru_free_blocks_error_printed) { + n_iterations = 21; + goto not_found;}); - block = buf_LRU_get_free_only(buf_pool); - } + block = buf_LRU_get_free_only(buf_pool); if (block) { ut_ad(buf_pool_from_block(block) == buf_pool); memset(&block->page.zip, 0, sizeof block->page.zip); - - if (started_monitor) { - srv_print_innodb_monitor = - static_cast(mon_value_was); - } - return(block); } - if (!started_ms) - started_ms = ut_time_ms(); - if (srv_empty_free_list_algorithm == SRV_EMPTY_FREE_LIST_BACKOFF && buf_lru_manager_is_active && (srv_shutdown_state == SRV_SHUTDOWN_NONE @@ -1272,10 +1222,7 @@ buf_LRU_get_free_block( : FREE_LIST_BACKOFF_LOW_PRIO_DIVIDER)); } - buf_LRU_handle_lack_of_free_blocks(n_iterations, started_ms, - flush_failures, - &mon_value_was, - &started_monitor); + buf_LRU_handle_lack_of_free_blocks(n_iterations, flush_failures); n_iterations++; @@ -1314,13 +1261,8 @@ buf_LRU_get_free_block( mutex_exit(&buf_pool->flush_state_mutex); - if (DBUG_EVALUATE_IF("simulate_recovery_lack_of_pages", true, false) - || DBUG_EVALUATE_IF("simulate_lack_of_pages", true, false)) { - - buf_pool->try_LRU_scan = false; - } - freed = FALSE; + if (buf_pool->try_LRU_scan || n_iterations > 0) { /* If no block was in the free list, search from the @@ -1345,9 +1287,11 @@ buf_LRU_get_free_block( } - buf_LRU_handle_lack_of_free_blocks(n_iterations, started_ms, - flush_failures, &mon_value_was, - &started_monitor); +#ifndef DBUG_OFF +not_found: +#endif + + buf_LRU_handle_lack_of_free_blocks(n_iterations, flush_failures); /* If we have scanned the whole LRU and still are unable to find a free block then we should sleep here to let the @@ -2126,7 +2070,7 @@ buf_LRU_block_free_non_file_page( ut_d(block->page.in_free_list = TRUE); mutex_exit(&buf_pool->free_list_mutex); - UNIV_MEM_ASSERT_AND_FREE(block->frame, UNIV_PAGE_SIZE); + UNIV_MEM_FREE(block->frame, UNIV_PAGE_SIZE); } /******************************************************************//** diff --git a/storage/xtradb/buf/buf0rea.cc b/storage/xtradb/buf/buf0rea.cc index 76b71550..43e678ed 100644 --- a/storage/xtradb/buf/buf0rea.cc +++ b/storage/xtradb/buf/buf0rea.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2013, 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 @@ -124,7 +124,12 @@ not exist or is being dropped use to stop dangling page reads from a tablespace which we have DISCARDed + IMPORTed back @param[in] offset page number -@param[in] trx transaction +@param[in,out] trx transaction +@param[in] should_buffer whether to buffer an aio request. + AIO read ahead uses this. If you plan to + use this parameter, make sure you remember + to call os_aio_dispatch_read_array_submit() + when you're ready to commit all your requests @return 1 if read request is issued. 0 if it is not */ static ulint @@ -137,7 +142,8 @@ buf_read_page_low( ibool unzip, ib_int64_t tablespace_version, ulint offset, - trx_t* trx = NULL) + trx_t* trx = NULL, + bool should_buffer = false) { buf_page_t* bpage; ulint wake_later; @@ -240,17 +246,18 @@ buf_read_page_low( } if (zip_size) { - *err = _fil_io(OS_FILE_READ | wake_later - | ignore_nonexistent_pages, - sync, space, zip_size, offset, 0, zip_size, - frame, bpage, 0, trx); + *err = fil_io(OS_FILE_READ | wake_later + | ignore_nonexistent_pages, + sync, space, zip_size, offset, 0, zip_size, + frame, bpage, 0, trx, should_buffer); } else { ut_a(buf_page_get_state(bpage) == BUF_BLOCK_FILE_PAGE); - *err = _fil_io(OS_FILE_READ | wake_later + *err = fil_io(OS_FILE_READ | wake_later | ignore_nonexistent_pages, sync, space, 0, offset, 0, UNIV_PAGE_SIZE, - frame, bpage, &bpage->write_size, trx); + frame, bpage, &bpage->write_size, + trx, should_buffer); } if (sync) { @@ -848,7 +855,7 @@ buf_read_ahead_linear( &err, false, ibuf_mode, space, zip_size, FALSE, tablespace_version, - i, trx); + i, trx, true); switch(err) { case DB_SUCCESS: @@ -876,6 +883,7 @@ buf_read_ahead_linear( } } } + os_aio_dispatch_read_array_submit(); /* In simulated aio we wake the aio handler threads only after queuing all aio requests, in native aio the following call does @@ -952,7 +960,7 @@ buf_read_ibuf_merge_pages( buf_read_page_low(&err, sync && (i + 1 == n_stored), BUF_READ_ANY_PAGE, space_ids[i], zip_size, TRUE, space_versions[i], - page_nos[i], NULL); + page_nos[i]); switch(err) { case DB_SUCCESS: @@ -1100,13 +1108,12 @@ buf_read_recv_pages( if ((i + 1 == n_stored) && sync) { buf_read_page_low(&err, true, BUF_READ_ANY_PAGE, space, zip_size, TRUE, tablespace_version, - page_nos[i], NULL); + page_nos[i]); } else { buf_read_page_low(&err, false, BUF_READ_ANY_PAGE | OS_AIO_SIMULATED_WAKE_LATER, space, zip_size, TRUE, - tablespace_version, page_nos[i], - NULL); + tablespace_version, page_nos[i]); } if (err == DB_DECRYPTION_FAILED) { diff --git a/storage/xtradb/data/data0type.cc b/storage/xtradb/data/data0type.cc index 0b9e0854..34ca399f 100644 --- a/storage/xtradb/data/data0type.cc +++ b/storage/xtradb/data/data0type.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2011, 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 @@ -49,8 +50,10 @@ ulint dtype_get_at_most_n_mbchars( /*========================*/ ulint prtype, /*!< in: precise type */ - ulint mbminmaxlen, /*!< in: minimum and maximum length of - a multi-byte character */ + ulint mbminlen, /*!< in: minimum length of + a multi-byte character, in bytes */ + ulint mbmaxlen, /*!< in: maximum length of + a multi-byte character, in bytes */ ulint prefix_len, /*!< in: length of the requested prefix, in characters, multiplied by dtype_get_mbmaxlen(dtype) */ @@ -58,9 +61,6 @@ dtype_get_at_most_n_mbchars( const char* str) /*!< in: the string whose prefix length is being determined */ { - ulint mbminlen = DATA_MBMINLEN(mbminmaxlen); - ulint mbmaxlen = DATA_MBMAXLEN(mbminmaxlen); - ut_a(data_len != UNIV_SQL_NULL); ut_ad(!mbmaxlen || !(prefix_len % mbmaxlen)); diff --git a/storage/xtradb/dict/dict0dict.cc b/storage/xtradb/dict/dict0dict.cc index 5af3a635..9257321c 100644 --- a/storage/xtradb/dict/dict0dict.cc +++ b/storage/xtradb/dict/dict0dict.cc @@ -3409,6 +3409,7 @@ dict_foreign_find_index( if (types_idx != index && !(index->type & DICT_FTS) && !index->to_be_dropped + && !dict_index_is_online_ddl(index) && dict_foreign_qualify_index( table, col_names, columns, n_cols, index, types_idx, diff --git a/storage/xtradb/dict/dict0mem.cc b/storage/xtradb/dict/dict0mem.cc index 125d7d78..cf27caf6 100644 --- a/storage/xtradb/dict/dict0mem.cc +++ b/storage/xtradb/dict/dict0mem.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 @@ -533,7 +533,8 @@ dict_mem_fill_column_struct( column->len = (unsigned int) col_len; #ifndef UNIV_HOTBACKUP dtype_get_mblen(mtype, prtype, &mbminlen, &mbmaxlen); - dict_col_set_mbminmaxlen(column, mbminlen, mbmaxlen); + column->mbminlen = mbminlen; + column->mbmaxlen = mbmaxlen; #endif /* !UNIV_HOTBACKUP */ } diff --git a/storage/xtradb/dict/dict0stats_bg.cc b/storage/xtradb/dict/dict0stats_bg.cc index e166e7df..884f6210 100644 --- a/storage/xtradb/dict/dict0stats_bg.cc +++ b/storage/xtradb/dict/dict0stats_bg.cc @@ -337,7 +337,7 @@ dict_stats_wait_bg_to_stop_using_table( unlocking/locking the data dict */ { while (!dict_stats_stop_bg(table)) { - DICT_STATS_BG_YIELD(trx); + DICT_BG_YIELD(trx); } } diff --git a/storage/xtradb/fil/fil0fil.cc b/storage/xtradb/fil/fil0fil.cc index 9023b444..96902cd7 100644 --- a/storage/xtradb/fil/fil0fil.cc +++ b/storage/xtradb/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 @@ -2125,7 +2125,7 @@ fil_write_flushed_lsn( { byte* buf1; byte* buf; - dberr_t err; + dberr_t err = DB_TABLESPACE_NOT_FOUND; buf1 = static_cast(ut_malloc(2 * UNIV_PAGE_SIZE)); buf = static_cast(ut_align(buf1, UNIV_PAGE_SIZE)); @@ -4967,6 +4967,11 @@ fil_load_single_table_tablespace( return; } + /* In mariabackup lets not crash. */ + if (IS_XTRABACKUP()) { + return; + } + abort(); } @@ -6056,7 +6061,7 @@ Reads or writes data. This operation is asynchronous (aio). i/o on a tablespace which does not exist */ UNIV_INTERN dberr_t -_fil_io( +fil_io( /*===*/ ulint type, /*!< in: OS_FILE_READ or OS_FILE_WRITE, ORed to OS_FILE_LOG, if a log i/o @@ -6088,7 +6093,12 @@ _fil_io( operation for this page and if initialized we do not trim again if actual page size does not decrease. */ - trx_t* trx) + trx_t* trx, + bool should_buffer) /*!< in: whether to buffer an aio request. + AIO read ahead uses this. If you plan to + use this parameter, make sure you remember + to call os_aio_dispatch_read_array_submit() + when you're ready to commit all your requests.*/ { ulint mode; fil_space_t* space; @@ -6308,8 +6318,8 @@ _fil_io( /* Queue the aio request */ ret = os_aio(type, is_log, mode | wake_later, name, node->handle, buf, - offset, len, zip_size ? zip_size : UNIV_PAGE_SIZE, node, - message, space_id, trx, write_size); + offset, len, zip_size ? zip_size : UNIV_PAGE_SIZE, node, + message, space_id, trx, write_size, should_buffer); #else /* In mysqlbackup do normal i/o, not aio */ diff --git a/storage/xtradb/fts/fts0fts.cc b/storage/xtradb/fts/fts0fts.cc index 88b5ad97..98aaf610 100644 --- a/storage/xtradb/fts/fts0fts.cc +++ b/storage/xtradb/fts/fts0fts.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2011, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2011, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2016, 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under @@ -26,6 +26,7 @@ Full Text Search interface #include "row0mysql.h" #include "row0upd.h" #include "dict0types.h" +#include "dict0stats_bg.h" #include "row0sel.h" #include "fts0fts.h" @@ -868,18 +869,37 @@ fts_drop_index( err = fts_drop_index_tables(trx, index); - fts_free(table); - + for(;;) { + bool retry = false; + if (index->index_fts_syncing) { + retry = true; + } + if (!retry){ + fts_free(table); + break; + } + DICT_BG_YIELD(trx); + } return(err); } - current_doc_id = table->fts->cache->next_doc_id; - first_doc_id = table->fts->cache->first_doc_id; - fts_cache_clear(table->fts->cache); - fts_cache_destroy(table->fts->cache); - table->fts->cache = fts_cache_create(table); - table->fts->cache->next_doc_id = current_doc_id; - table->fts->cache->first_doc_id = first_doc_id; + for(;;) { + bool retry = false; + if (index->index_fts_syncing) { + retry = true; + } + if (!retry){ + current_doc_id = table->fts->cache->next_doc_id; + first_doc_id = table->fts->cache->first_doc_id; + fts_cache_clear(table->fts->cache); + fts_cache_destroy(table->fts->cache); + table->fts->cache = fts_cache_create(table); + table->fts->cache->next_doc_id = current_doc_id; + table->fts->cache->first_doc_id = first_doc_id; + break; + } + DICT_BG_YIELD(trx); + } } else { fts_cache_t* cache = table->fts->cache; fts_index_cache_t* index_cache; @@ -889,9 +909,17 @@ fts_drop_index( index_cache = fts_find_index_cache(cache, index); if (index_cache != NULL) { - if (index_cache->words) { - fts_words_free(index_cache->words); - rbt_free(index_cache->words); + for(;;) { + bool retry = false; + if (index->index_fts_syncing) { + retry = true; + } + if (!retry && index_cache->words) { + fts_words_free(index_cache->words); + rbt_free(index_cache->words); + break; + } + DICT_BG_YIELD(trx); } ib_vector_remove(cache->indexes, *(void**) index_cache); @@ -1973,7 +2001,7 @@ fts_create_one_index_table( ? DATA_VARCHAR : DATA_VARMYSQL, field->col->prtype, FTS_MAX_WORD_LEN_IN_CHAR - * DATA_MBMAXLEN(field->col->mbminmaxlen)); + * field->col->mbmaxlen); dict_mem_table_add_col(new_table, heap, "first_doc_id", DATA_INT, DATA_NOT_NULL | DATA_UNSIGNED, @@ -3333,8 +3361,7 @@ fts_fetch_doc_from_rec( dict_table_zip_size(table), clust_pos, &doc->text.f_len, static_cast( - doc->self_heap->arg), - NULL); + doc->self_heap->arg)); } else { doc->text.f_str = (byte*) rec_get_nth_field( clust_rec, offsets, clust_pos, @@ -4568,10 +4595,16 @@ fts_sync( index_cache = static_cast( ib_vector_get(cache->indexes, i)); - if (index_cache->index->to_be_dropped) { + if (index_cache->index->to_be_dropped + || index_cache->index->table->to_be_dropped) { continue; } + index_cache->index->index_fts_syncing = true; + DBUG_EXECUTE_IF("fts_instrument_sync_sleep_drop_waits", + os_thread_sleep(10000000); + ); + error = fts_sync_index(sync, index_cache); if (error != DB_SUCCESS && !sync->interrupted) { @@ -4604,11 +4637,33 @@ 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); } rw_lock_x_lock(&cache->lock); + /* 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; + } + } + sync->interrupted = false; sync->in_progress = false; os_event_set(sync->event); @@ -7535,8 +7590,7 @@ fts_init_recover_doc( &doc.text.f_len, static_cast(dfield_get_data(dfield)), zip_size, len, - static_cast(doc.self_heap->arg), - NULL); + static_cast(doc.self_heap->arg)); } else { doc.text.f_str = static_cast( dfield_get_data(dfield)); diff --git a/storage/xtradb/fts/fts0opt.cc b/storage/xtradb/fts/fts0opt.cc index cb30122a..d9f96948 100644 --- a/storage/xtradb/fts/fts0opt.cc +++ b/storage/xtradb/fts/fts0opt.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2007, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2016, MariaDB Corporation. All Rights reserved. This program is free software; you can redistribute it and/or modify it under @@ -2971,13 +2971,6 @@ fts_optimize_sync_table( { dict_table_t* table = NULL; - /* Prevent DROP INDEX etc. from running when we are syncing - cache in background. */ - if (!rw_lock_s_lock_nowait(&dict_operation_lock, __FILE__, __LINE__)) { - /* Exit when fail to get dict operation lock. */ - return; - } - table = dict_table_open_on_id(table_id, FALSE, DICT_TABLE_OP_NORMAL); if (table) { @@ -2987,8 +2980,6 @@ fts_optimize_sync_table( dict_table_close(table, FALSE, FALSE); } - - rw_lock_s_unlock(&dict_operation_lock); } /**********************************************************************//** diff --git a/storage/xtradb/fts/fts0que.cc b/storage/xtradb/fts/fts0que.cc index 358d979f..0b0aecae 100644 --- a/storage/xtradb/fts/fts0que.cc +++ b/storage/xtradb/fts/fts0que.cc @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2007, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under @@ -1937,8 +1937,7 @@ fts_query_fetch_document( if (dfield_is_ext(dfield)) { data = btr_copy_externally_stored_field( &cur_len, data, phrase->zip_size, - dfield_get_len(dfield), phrase->heap, - NULL); + dfield_get_len(dfield), phrase->heap); } else { cur_len = dfield_get_len(dfield); } @@ -3656,6 +3655,7 @@ fts_query_free( if (query->intersection) { fts_query_free_doc_ids(query, query->intersection); + query->intersection = NULL; } if (query->doc_ids) { diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc index 37755cb9..65ac41c2 100644 --- a/storage/xtradb/handler/ha_innodb.cc +++ b/storage/xtradb/handler/ha_innodb.cc @@ -1289,6 +1289,8 @@ static SHOW_VAR innodb_status_variables[]= { (char*) &export_vars.innodb_sec_rec_cluster_reads, SHOW_LONG}, {"secondary_index_triggered_cluster_reads_avoided", (char*) &export_vars.innodb_sec_rec_cluster_reads_avoided, SHOW_LONG}, + {"buffered_aio_submitted", + (char*) &export_vars.innodb_buffered_aio_submitted, SHOW_LONG}, /* Encryption */ {"encryption_rotation_pages_read_from_cache", @@ -12321,6 +12323,7 @@ innobase_table_flags( case ROW_TYPE_DEFAULT: /* If we fell through, set row format to Compact. */ row_format = ROW_TYPE_COMPACT; + /* fall through */ case ROW_TYPE_COMPACT: break; } @@ -13710,7 +13713,7 @@ ha_innobase::records_in_range( n_rows = btr_estimate_n_rows_in_range(index, range_start, mode1, range_end, - mode2, prebuilt->trx); + mode2); } else { n_rows = HA_POS_ERROR; @@ -21081,6 +21084,13 @@ static MYSQL_SYSVAR_BOOL(print_all_deadlocks, srv_print_all_deadlocks, "Print all deadlocks to MySQL error log (off by default)", NULL, NULL, FALSE); +static MYSQL_SYSVAR_BOOL( + print_lock_wait_timeout_info, + srv_print_lock_wait_timeout_info, + PLUGIN_VAR_OPCMDARG, + "Print lock wait timeout info to MySQL error log (off by default)", + NULL, NULL, FALSE); + static MYSQL_SYSVAR_ULONG(compression_failure_threshold_pct, zip_failure_threshold_pct, PLUGIN_VAR_OPCMDARG, "If the compression failure rate of a table is greater than this number" @@ -21539,6 +21549,7 @@ static struct st_mysql_sys_var* innobase_system_variables[]= { MYSQL_SYSVAR(foreground_preflush), MYSQL_SYSVAR(empty_free_list_algorithm), MYSQL_SYSVAR(print_all_deadlocks), + MYSQL_SYSVAR(print_lock_wait_timeout_info), MYSQL_SYSVAR(cmp_per_index_enabled), MYSQL_SYSVAR(undo_logs), MYSQL_SYSVAR(rollback_segments), diff --git a/storage/xtradb/handler/handler0alter.cc b/storage/xtradb/handler/handler0alter.cc index b2f0d301..2a2c466f 100644 --- a/storage/xtradb/handler/handler0alter.cc +++ b/storage/xtradb/handler/handler0alter.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2013, 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 @@ -1200,8 +1200,7 @@ innobase_col_to_mysql( #ifdef UNIV_DEBUG case DATA_MYSQL: ut_ad(flen >= len); - ut_ad(DATA_MBMAXLEN(col->mbminmaxlen) - >= DATA_MBMINLEN(col->mbminmaxlen)); + ut_ad(col->mbmaxlen >= col->mbminlen); memcpy(dest, data, len); break; @@ -5917,7 +5916,47 @@ ha_innobase::commit_inplace_alter_table( break; } - DICT_STATS_BG_YIELD(trx); + DICT_BG_YIELD(trx); + } + + /* Make a concurrent Drop fts Index to wait until sync of that + fts index is happening in the background */ + for (;;) { + bool retry = false; + + for (inplace_alter_handler_ctx** pctx = ctx_array; + *pctx; pctx++) { + int count =0; + ha_innobase_inplace_ctx* ctx + = static_cast(*pctx); + DBUG_ASSERT(new_clustered == ctx->need_rebuild()); + + if (dict_fts_index_syncing(ctx->old_table)) { + count++; + if (count == 100) { + fprintf(stderr, + "Drop index waiting for background sync" + "to finish\n"); + } + retry = true; + } + + if (new_clustered && dict_fts_index_syncing(ctx->new_table)) { + count++; + if (count == 100) { + fprintf(stderr, + "Drop index waiting for background sync" + "to finish\n"); + } + retry = true; + } + } + + if (!retry) { + break; + } + + DICT_BG_YIELD(trx); } /* Apply the changes to the data dictionary tables, for all @@ -6233,8 +6272,13 @@ ha_innobase::commit_inplace_alter_table( ut_d(dict_table_check_for_dup_indexes( ctx->new_table, CHECK_ABORTED_OK)); - ut_a(fts_check_cached_index(ctx->new_table)); +#ifdef UNIV_DEBUG + if (!(ctx->new_table->fts != NULL + && ctx->new_table->fts->cache->sync->in_progress)) { + ut_a(fts_check_cached_index(ctx->new_table)); + } +#endif if (new_clustered) { /* Since the table has been rebuilt, we remove all persistent statistics corresponding to the diff --git a/storage/xtradb/ibuf/ibuf0ibuf.cc b/storage/xtradb/ibuf/ibuf0ibuf.cc index 6925cd3a..b169916c 100644 --- a/storage/xtradb/ibuf/ibuf0ibuf.cc +++ b/storage/xtradb/ibuf/ibuf0ibuf.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 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 @@ -4645,7 +4645,7 @@ ibuf_merge_or_delete_for_page( function. When the counter is > 0, that prevents tablespace from being dropped. */ - space = fil_space_acquire(space_id); + space = fil_space_acquire_silent(space_id); if (UNIV_UNLIKELY(!space)) { /* Do not try to read the bitmap page from space; diff --git a/storage/xtradb/include/btr0cur.h b/storage/xtradb/include/btr0cur.h index e478b33b..1b0632e2 100644 --- a/storage/xtradb/include/btr0cur.h +++ b/storage/xtradb/include/btr0cur.h @@ -568,8 +568,7 @@ btr_estimate_n_rows_in_range( const dtuple_t* tuple1, /*!< in: range start, may also be empty tuple */ ulint mode1, /*!< in: search mode for range start */ const dtuple_t* tuple2, /*!< in: range end, may also be empty tuple */ - ulint mode2, /*!< in: search mode for range end */ - trx_t* trx); /*!< in: trx */ + ulint mode2); /*!< in: search mode for range end */ /*******************************************************************//** Estimates the number of different key values in a given index, for each n-column prefix of the index where 1 <= n <= dict_index_get_n_unique(index). @@ -704,8 +703,7 @@ btr_copy_externally_stored_field_prefix( field containing also the reference to the external part; must be protected by a lock or a page latch */ - ulint local_len,/*!< in: length of data, in bytes */ - trx_t* trx); /*!< in: transaction handle */ + ulint local_len);/*!< in: length of data, in bytes */ /*******************************************************************//** Copies an externally stored field of a record to mem heap. The clustered index record must be protected by a lock or a page latch. @@ -722,8 +720,7 @@ btr_copy_externally_stored_field( ulint zip_size,/*!< in: nonzero=compressed BLOB page size, zero for uncompressed BLOBs */ ulint local_len,/*!< in: length of data */ - mem_heap_t* heap, /*!< in: mem heap */ - trx_t* trx); /*!< in: transaction handle */ + mem_heap_t* heap); /*!< in: mem heap */ /*******************************************************************//** Copies an externally stored field of a record to mem heap. @return the field copied to heap, or NULL if the field is incomplete */ @@ -738,8 +735,7 @@ btr_rec_copy_externally_stored_field( zero for uncompressed BLOBs */ ulint no, /*!< in: field number */ ulint* len, /*!< out: length of the field */ - mem_heap_t* heap, /*!< in: mem heap */ - trx_t* trx); /*!< in: transaction handle */ + mem_heap_t* heap); /*!< in: mem heap */ /*******************************************************************//** Flags the data tuple fields that are marked as extern storage in the update vector. We use this function to remember which fields we must diff --git a/storage/xtradb/include/data0type.h b/storage/xtradb/include/data0type.h index df6b6a41..f3ecab5a 100644 --- a/storage/xtradb/include/data0type.h +++ b/storage/xtradb/include/data0type.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2012, 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 @@ -182,18 +182,7 @@ store the charset-collation number; one byte is left unused, though */ #define DATA_NEW_ORDER_NULL_TYPE_BUF_SIZE 6 /* Maximum multi-byte character length in bytes, plus 1 */ -#define DATA_MBMAX 5 - -/* Pack mbminlen, mbmaxlen to mbminmaxlen. */ -#define DATA_MBMINMAXLEN(mbminlen, mbmaxlen) \ - ((mbmaxlen) * DATA_MBMAX + (mbminlen)) -/* Get mbminlen from mbminmaxlen. Cast the result of UNIV_EXPECT to ulint -because in GCC it returns a long. */ -#define DATA_MBMINLEN(mbminmaxlen) ((ulint) \ - UNIV_EXPECT(((mbminmaxlen) % DATA_MBMAX), \ - 1)) -/* Get mbmaxlen from mbminmaxlen. */ -#define DATA_MBMAXLEN(mbminmaxlen) ((ulint) ((mbminmaxlen) / DATA_MBMAX)) +#define DATA_MBMAX 8 /* We now support 15 bits (up to 32767) collation number */ #define MAX_CHAR_COLL_NUM 32767 @@ -220,8 +209,10 @@ ulint dtype_get_at_most_n_mbchars( /*========================*/ ulint prtype, /*!< in: precise type */ - ulint mbminmaxlen, /*!< in: minimum and maximum length of - a multi-byte character */ + ulint mbminlen, /*!< in: minimum length of + a multi-byte character, in bytes */ + ulint mbmaxlen, /*!< in: maximum length of + a multi-byte character, in bytes */ ulint prefix_len, /*!< in: length of the requested prefix, in characters, multiplied by dtype_get_mbmaxlen(dtype) */ @@ -366,19 +357,6 @@ dtype_get_mbmaxlen( /*===============*/ const dtype_t* type); /*!< in: type */ /*********************************************************************//** -Sets the minimum and maximum length of a character, in bytes. */ -UNIV_INLINE -void -dtype_set_mbminmaxlen( -/*==================*/ - dtype_t* type, /*!< in/out: type */ - ulint mbminlen, /*!< in: minimum length of a char, - in bytes, or 0 if this is not - a character type */ - ulint mbmaxlen); /*!< in: maximum length of a char, - in bytes, or 0 if this is not - a character type */ -/*********************************************************************//** Gets the padding character code for the type. @return padding character code, or ULINT_UNDEFINED if no padding specified */ UNIV_INLINE @@ -398,7 +376,9 @@ dtype_get_fixed_size_low( ulint mtype, /*!< in: main type */ ulint prtype, /*!< in: precise type */ ulint len, /*!< in: length */ - ulint mbminmaxlen, /*!< in: minimum and maximum length of a + ulint mbminlen, /*!< in: minimum length of a + multibyte character, in bytes */ + ulint mbmaxlen, /*!< in: maximum length of a multibyte character, in bytes */ ulint comp); /*!< in: nonzero=ROW_FORMAT=COMPACT */ #ifndef UNIV_HOTBACKUP @@ -412,8 +392,8 @@ dtype_get_min_size_low( ulint mtype, /*!< in: main type */ ulint prtype, /*!< in: precise type */ ulint len, /*!< in: length */ - ulint mbminmaxlen); /*!< in: minimum and maximum length of a - multibyte character */ + ulint mbminlen, /*!< in: minimum length of a character */ + ulint mbmaxlen); /*!< in: maximum length of a character */ /***********************************************************************//** Returns the maximum size of a data type. Note: types in system tables may be incomplete and return incorrect information. @@ -530,11 +510,10 @@ struct dtype_t{ the string, MySQL uses 1 or 2 bytes to store the string length) */ #ifndef UNIV_HOTBACKUP - unsigned mbminmaxlen:5; /*!< minimum and maximum length of a - character, in bytes; - DATA_MBMINMAXLEN(mbminlen,mbmaxlen); - mbminlen=DATA_MBMINLEN(mbminmaxlen); - mbmaxlen=DATA_MBMINLEN(mbminmaxlen) */ + unsigned mbminlen:3; /*!< minimum length of a character, + in bytes */ + unsigned mbmaxlen:3; /*!< maximum length of a character, + in bytes */ #endif /* !UNIV_HOTBACKUP */ }; diff --git a/storage/xtradb/include/data0type.ic b/storage/xtradb/include/data0type.ic index ff72f6ed..96b001e1 100644 --- a/storage/xtradb/include/data0type.ic +++ b/storage/xtradb/include/data0type.ic @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2012, 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 @@ -104,27 +104,6 @@ dtype_get_mblen( } } -/*********************************************************************//** -Sets the minimum and maximum length of a character, in bytes. */ -UNIV_INLINE -void -dtype_set_mbminmaxlen( -/*==================*/ - dtype_t* type, /*!< in/out: type */ - ulint mbminlen, /*!< in: minimum length of a char, - in bytes, or 0 if this is not - a character type */ - ulint mbmaxlen) /*!< in: maximum length of a char, - in bytes, or 0 if this is not - a character type */ -{ - ut_ad(mbminlen < DATA_MBMAX); - ut_ad(mbmaxlen < DATA_MBMAX); - ut_ad(mbminlen <= mbmaxlen); - - type->mbminmaxlen = DATA_MBMINMAXLEN(mbminlen, mbmaxlen); -} - /*********************************************************************//** Compute the mbminlen and mbmaxlen members of a data type structure. */ UNIV_INLINE @@ -137,7 +116,8 @@ dtype_set_mblen( ulint mbmaxlen; dtype_get_mblen(type->mtype, type->prtype, &mbminlen, &mbmaxlen); - dtype_set_mbminmaxlen(type, mbminlen, mbmaxlen); + type->mbminlen = mbminlen; + type->mbmaxlen = mbmaxlen; ut_ad(dtype_validate(type)); } @@ -233,8 +213,7 @@ dtype_get_mbminlen( /*===============*/ const dtype_t* type) /*!< in: type */ { - ut_ad(type); - return(DATA_MBMINLEN(type->mbminmaxlen)); + return type->mbminlen; } /*********************************************************************//** Gets the maximum length of a character, in bytes. @@ -246,8 +225,7 @@ dtype_get_mbmaxlen( /*===============*/ const dtype_t* type) /*!< in: type */ { - ut_ad(type); - return(DATA_MBMAXLEN(type->mbminmaxlen)); + return type->mbmaxlen; } /*********************************************************************//** @@ -523,8 +501,10 @@ dtype_get_fixed_size_low( ulint mtype, /*!< in: main type */ ulint prtype, /*!< in: precise type */ ulint len, /*!< in: length */ - ulint mbminmaxlen, /*!< in: minimum and maximum length of - a multibyte character, in bytes */ + ulint mbminlen, /*!< in: minimum length of a + multibyte character, in bytes */ + ulint mbmaxlen, /*!< in: maximum length of a + multibyte character, in bytes */ ulint comp) /*!< in: nonzero=ROW_FORMAT=COMPACT */ { switch (mtype) { @@ -565,11 +545,10 @@ dtype_get_fixed_size_low( dtype_get_charset_coll(prtype), &i_mbminlen, &i_mbmaxlen); - ut_ad(DATA_MBMINMAXLEN(i_mbminlen, i_mbmaxlen) - == mbminmaxlen); + ut_ad(i_mbminlen == mbminlen); + ut_ad(i_mbmaxlen == mbmaxlen); #endif /* UNIV_DEBUG */ - if (DATA_MBMINLEN(mbminmaxlen) - == DATA_MBMAXLEN(mbminmaxlen)) { + if (mbminlen == mbmaxlen) { return(len); } } @@ -602,8 +581,8 @@ dtype_get_min_size_low( ulint mtype, /*!< in: main type */ ulint prtype, /*!< in: precise type */ ulint len, /*!< in: length */ - ulint mbminmaxlen) /*!< in: minimum and maximum length of a - multi-byte character */ + ulint mbminlen, /*!< in: minimum length of a character */ + ulint mbmaxlen) /*!< in: maximum length of a character */ { switch (mtype) { case DATA_SYS: @@ -633,9 +612,6 @@ dtype_get_min_size_low( if (prtype & DATA_BINARY_TYPE) { return(len); } else { - ulint mbminlen = DATA_MBMINLEN(mbminmaxlen); - ulint mbmaxlen = DATA_MBMAXLEN(mbminmaxlen); - if (mbminlen == mbmaxlen) { return(len); } @@ -706,9 +682,9 @@ dtype_get_sql_null_size( { #ifndef UNIV_HOTBACKUP return(dtype_get_fixed_size_low(type->mtype, type->prtype, type->len, - type->mbminmaxlen, comp)); + type->mbminlen, type->mbmaxlen, comp)); #else /* !UNIV_HOTBACKUP */ return(dtype_get_fixed_size_low(type->mtype, type->prtype, type->len, - 0, 0)); + 0, 0, 0)); #endif /* !UNIV_HOTBACKUP */ } diff --git a/storage/xtradb/include/dict0dict.h b/storage/xtradb/include/dict0dict.h index dda8f4d2..241ed89e 100644 --- a/storage/xtradb/include/dict0dict.h +++ b/storage/xtradb/include/dict0dict.h @@ -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 @@ -197,18 +197,6 @@ dict_col_get_mbmaxlen( const dict_col_t* col) /*!< in: column */ MY_ATTRIBUTE((nonnull, warn_unused_result)); /*********************************************************************//** -Sets the minimum and maximum number of bytes per character. */ -UNIV_INLINE -void -dict_col_set_mbminmaxlen( -/*=====================*/ - dict_col_t* col, /*!< in/out: column */ - ulint mbminlen, /*!< in: minimum multi-byte - character size, in bytes */ - ulint mbmaxlen) /*!< in: minimum multi-byte - character size, in bytes */ - MY_ATTRIBUTE((nonnull)); -/*********************************************************************//** Gets the column data type. */ UNIV_INLINE void diff --git a/storage/xtradb/include/dict0dict.ic b/storage/xtradb/include/dict0dict.ic index 4db6a73b..17b4adc1 100644 --- a/storage/xtradb/include/dict0dict.ic +++ b/storage/xtradb/include/dict0dict.ic @@ -1,7 +1,7 @@ /***************************************************************************** -Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2017, MariaDB Corporation. +Copyright (c) 1996, 2017, 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 the terms of the GNU General Public License as published by the Free Software @@ -41,7 +41,7 @@ dict_col_get_mbminlen( /*==================*/ const dict_col_t* col) /*!< in: column */ { - return(DATA_MBMINLEN(col->mbminmaxlen)); + return col->mbminlen; } /*********************************************************************//** Gets the maximum number of bytes per character. @@ -52,25 +52,7 @@ dict_col_get_mbmaxlen( /*==================*/ const dict_col_t* col) /*!< in: column */ { - return(DATA_MBMAXLEN(col->mbminmaxlen)); -} -/*********************************************************************//** -Sets the minimum and maximum number of bytes per character. */ -UNIV_INLINE -void -dict_col_set_mbminmaxlen( -/*=====================*/ - dict_col_t* col, /*!< in/out: column */ - ulint mbminlen, /*!< in: minimum multi-byte - character size, in bytes */ - ulint mbmaxlen) /*!< in: minimum multi-byte - character size, in bytes */ -{ - ut_ad(mbminlen < DATA_MBMAX); - ut_ad(mbmaxlen < DATA_MBMAX); - ut_ad(mbminlen <= mbmaxlen); - - col->mbminmaxlen = DATA_MBMINMAXLEN(mbminlen, mbmaxlen); + return col->mbmaxlen; } /*********************************************************************//** Gets the column data type. */ @@ -87,7 +69,8 @@ dict_col_copy_type( type->mtype = col->mtype; type->prtype = col->prtype; type->len = col->len; - type->mbminmaxlen = col->mbminmaxlen; + type->mbminlen = col->mbminlen; + type->mbmaxlen = col->mbmaxlen; } #endif /* !UNIV_HOTBACKUP */ @@ -109,7 +92,8 @@ dict_col_type_assert_equal( ut_ad(col->prtype == type->prtype); //ut_ad(col->len == type->len); # ifndef UNIV_HOTBACKUP - ut_ad(col->mbminmaxlen == type->mbminmaxlen); + ut_ad(col->mbminlen == type->mbminlen); + ut_ad(col->mbmaxlen == type->mbmaxlen); # endif /* !UNIV_HOTBACKUP */ return(TRUE); @@ -127,7 +111,7 @@ dict_col_get_min_size( const dict_col_t* col) /*!< in: column */ { return(dtype_get_min_size_low(col->mtype, col->prtype, col->len, - col->mbminmaxlen)); + col->mbminlen, col->mbmaxlen)); } /***********************************************************************//** Returns the maximum size of the column. @@ -152,7 +136,7 @@ dict_col_get_fixed_size( ulint comp) /*!< in: nonzero=ROW_FORMAT=COMPACT */ { return(dtype_get_fixed_size_low(col->mtype, col->prtype, col->len, - col->mbminmaxlen, comp)); + col->mbminlen, col->mbmaxlen, comp)); } /***********************************************************************//** Returns the ROW_FORMAT=REDUNDANT stored SQL NULL size of a column. @@ -1076,6 +1060,27 @@ dict_table_x_lock_indexes( } } +/*********************************************************************//** +Returns true if the particular FTS index in the table is still syncing +in the background, false otherwise. +@param [in] table Table containing FTS index +@return True if sync of fts index is still going in the background */ +UNIV_INLINE +bool +dict_fts_index_syncing( + dict_table_t* table) +{ + dict_index_t* index; + + for (index = dict_table_get_first_index(table); + index != NULL; + index = dict_table_get_next_index(index)) { + if (index->index_fts_syncing) { + return(true); + } + } + return(false); +} /*********************************************************************//** Release the exclusive locks on all index tree. */ UNIV_INLINE diff --git a/storage/xtradb/include/dict0mem.h b/storage/xtradb/include/dict0mem.h index 2a4422fc..bdec503c 100644 --- a/storage/xtradb/include/dict0mem.h +++ b/storage/xtradb/include/dict0mem.h @@ -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 @@ -538,11 +538,10 @@ struct dict_col_t{ the string, MySQL uses 1 or 2 bytes to store the string length) */ - unsigned mbminmaxlen:5; /*!< minimum and maximum length of a - character, in bytes; - DATA_MBMINMAXLEN(mbminlen,mbmaxlen); - mbminlen=DATA_MBMINLEN(mbminmaxlen); - mbmaxlen=DATA_MBMINLEN(mbminmaxlen) */ + unsigned mbminlen:3; /*!< minimum length of a + character, in bytes */ + unsigned mbmaxlen:3; /*!< maximum length of a + character, in bytes */ /*----------------------*/ /* End of definitions copied from dtype_t */ /* @} */ @@ -720,6 +719,8 @@ struct dict_index_t{ dict_sys->mutex. Other changes are protected by index->lock. */ dict_field_t* fields; /*!< array of field descriptions */ + bool index_fts_syncing;/*!< Whether the fts index is + still syncing in the background */ #ifndef UNIV_HOTBACKUP UT_LIST_NODE_T(dict_index_t) indexes;/*!< list of indexes of the table */ diff --git a/storage/xtradb/include/dict0stats_bg.h b/storage/xtradb/include/dict0stats_bg.h index 8f3385eb..66fcf7a0 100644 --- a/storage/xtradb/include/dict0stats_bg.h +++ b/storage/xtradb/include/dict0stats_bg.h @@ -1,6 +1,6 @@ /***************************************************************************** -Copyright (c) 2012, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2012, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2017, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under @@ -83,7 +83,7 @@ dict_stats_defrag_pool_del( /** Yield the data dictionary latch when waiting for the background thread to stop accessing a table. @param trx transaction holding the data dictionary locks */ -#define DICT_STATS_BG_YIELD(trx) do { \ +#define DICT_BG_YIELD(trx) do { \ row_mysql_unlock_data_dictionary(trx); \ os_thread_sleep(250000); \ row_mysql_lock_data_dictionary(trx); \ diff --git a/storage/xtradb/include/fil0fil.h b/storage/xtradb/include/fil0fil.h index 5fe2d20b..8c3bf7d2 100644 --- a/storage/xtradb/include/fil0fil.h +++ b/storage/xtradb/include/fil0fil.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 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 @@ -1161,7 +1161,7 @@ Reads or writes data. This operation is asynchronous (aio). i/o on a tablespace which does not exist */ UNIV_INTERN dberr_t -_fil_io( +fil_io( /*===*/ ulint type, /*!< in: OS_FILE_READ or OS_FILE_WRITE, ORed to OS_FILE_LOG, if a log i/o @@ -1189,16 +1189,18 @@ _fil_io( void* message, /*!< in: message for aio handler if non-sync aio used, else ignored */ ulint* write_size, /*!< in/out: Actual write size initialized - after fist successfull trim - operation for this page and if - initialized we do not trim again if - actual page size does not decrease. */ - trx_t* trx) /*!< in: trx */ - - __attribute__((nonnull(8))); - -#define fil_io(type, sync, space_id, zip_size, block_offset, byte_offset, len, buf, message, write_size) \ - _fil_io(type, sync, space_id, zip_size, block_offset, byte_offset, len, buf, message, write_size, NULL) + after fist successfull trim + operation for this page and if + initialized we do not trim again if + actual page size does not decrease. */ + trx_t* trx = NULL, /*!< in: trx */ + bool should_buffer = false) + /*!< in: whether to buffer an aio request. + AIO read ahead uses this. If you plan to + use this parameter, make sure you remember + to call os_aio_dispatch_read_array_submit() + when you're ready to commit all your requests.*/ + MY_ATTRIBUTE((nonnull(8))); /** Determine the block size of the data file. @param[in] space tablespace diff --git a/storage/xtradb/include/log0crypt.h b/storage/xtradb/include/log0crypt.h index 0ad7e7d7..b7a221e0 100644 --- a/storage/xtradb/include/log0crypt.h +++ b/storage/xtradb/include/log0crypt.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (C) 2013, 2015, Google Inc. All Rights Reserved. -Copyright (C) 2014, 2017, MariaDB Corporation. 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 @@ -73,6 +73,8 @@ log_encrypt_before_write( /*=====================*/ ib_uint64_t next_checkpoint_no, /*!< in: log group to be flushed */ byte* block, /*!< in/out: pointer to a log block */ + lsn_t lsn, /*!< in: log sequence number of + the start of the buffer */ const ulint size); /*!< in: size of log blocks */ /******************************************************** @@ -83,6 +85,8 @@ void log_decrypt_after_read( /*===================*/ byte* frame, /*!< in/out: log segment */ + lsn_t lsn, /*!< in: log sequence number of the start + of the buffer */ const ulint size); /*!< in: log segment size */ /* Error codes for crypt info */ diff --git a/storage/xtradb/include/log0online.h b/storage/xtradb/include/log0online.h index 5c3e7d07..2d1febe9 100644 --- a/storage/xtradb/include/log0online.h +++ b/storage/xtradb/include/log0online.h @@ -129,7 +129,11 @@ log_online_bitmap_iterator_next( /** Struct for single bitmap file information */ struct log_online_bitmap_file_struct { - char name[FN_REFLEN]; /*!< Name with full path */ + /** Name with full path + 61 is a nice magic constant for the extra space needed for the sprintf + template in the cc file + */ + char name[FN_REFLEN+61]; /*!< Name with full path */ pfs_os_file_t file; /*!< Handle to opened file */ ib_uint64_t size; /*!< Size of the file */ os_offset_t offset; /*!< Offset of the next read, diff --git a/storage/xtradb/include/mem0mem.ic b/storage/xtradb/include/mem0mem.ic index 63e68150..2b463871 100644 --- a/storage/xtradb/include/mem0mem.ic +++ b/storage/xtradb/include/mem0mem.ic @@ -305,8 +305,8 @@ mem_heap_free_heap_top( mem_block_set_free(block, old_top - (byte*) block); ut_ad(mem_block_get_start(block) <= mem_block_get_free(block)); - UNIV_MEM_ASSERT_W(old_top, (byte*) block + block->len - old_top); #if defined UNIV_MEM_DEBUG + UNIV_MEM_ALLOC(old_top, (byte*)block + block->len - old_top); /* In the debug version erase block from top up */ mem_erase_buf(old_top, (byte*) block + block->len - old_top); @@ -315,7 +315,7 @@ mem_heap_free_heap_top( mem_current_allocated_memory -= (total_size - size); mutex_exit(&mem_hash_mutex); #endif /* UNIV_MEM_DEBUG */ - UNIV_MEM_ALLOC(old_top, (byte*) block + block->len - old_top); + UNIV_MEM_FREE(old_top, (byte*)block + block->len - old_top); /* If free == start, we may free the block if it is not the first one */ @@ -396,11 +396,11 @@ mem_heap_free_top( /* Subtract the free field of block */ mem_block_set_free(block, mem_block_get_free(block) - MEM_SPACE_NEEDED(n)); - UNIV_MEM_ASSERT_W((byte*) block + mem_block_get_free(block), n); #ifdef UNIV_MEM_DEBUG ut_ad(mem_block_get_start(block) <= mem_block_get_free(block)); + UNIV_MEM_ALLOC((byte*) block + mem_block_get_free(block), n); /* In the debug version check the consistency, and erase field */ mem_field_erase((byte*) block + mem_block_get_free(block), n); #endif @@ -412,11 +412,7 @@ mem_heap_free_top( == mem_block_get_start(block))) { mem_heap_block_free(heap, block); } else { - /* Avoid a bogus UNIV_MEM_ASSERT_W() warning in a - subsequent invocation of mem_heap_free_top(). - Originally, this was UNIV_MEM_FREE(), to catch writes - to freed memory. */ - UNIV_MEM_ALLOC((byte*) block + mem_block_get_free(block), n); + UNIV_MEM_FREE((byte*) block + mem_block_get_free(block), n); } } diff --git a/storage/xtradb/include/mtr0mtr.h b/storage/xtradb/include/mtr0mtr.h index ef6cd617..42a57f10 100644 --- a/storage/xtradb/include/mtr0mtr.h +++ b/storage/xtradb/include/mtr0mtr.h @@ -35,7 +35,6 @@ Created 11/26/1995 Heikki Tuuri #include "ut0byte.h" #include "mtr0types.h" #include "page0types.h" -#include "trx0types.h" /* Logging modes for a mini-transaction */ #define MTR_LOG_ALL 21 /* default mode: log all operations @@ -209,15 +208,6 @@ functions). The page number parameter was originally written as 0. @{ */ /* included here because it needs MLOG_LSN defined */ #include "log0log.h" -/***************************************************************//** -Starts a mini-transaction. */ -UNIV_INLINE -void -mtr_start_trx( -/*======*/ - mtr_t* mtr, /*!< out: mini-transaction */ - trx_t* trx) /*!< in: transaction */ - __attribute__((nonnull (1))); /***************************************************************//** Starts a mini-transaction. */ UNIV_INLINE @@ -225,10 +215,7 @@ void mtr_start( /*======*/ mtr_t* mtr) /*!< out: mini-transaction */ -{ - mtr_start_trx(mtr, NULL); -} - MY_ATTRIBUTE((nonnull)) + MY_ATTRIBUTE((nonnull)); /***************************************************************//** Commits a mini-transaction. */ UNIV_INTERN @@ -435,7 +422,6 @@ struct mtr_t{ #ifdef UNIV_DEBUG ulint magic_n; #endif /* UNIV_DEBUG */ - trx_t* trx; /*!< transaction */ }; #ifdef UNIV_DEBUG diff --git a/storage/xtradb/include/mtr0mtr.ic b/storage/xtradb/include/mtr0mtr.ic index a6d9df09..04c39cf7 100644 --- a/storage/xtradb/include/mtr0mtr.ic +++ b/storage/xtradb/include/mtr0mtr.ic @@ -43,10 +43,9 @@ mtr_block_dirtied( Starts a mini-transaction. */ UNIV_INLINE void -mtr_start_trx( +mtr_start( /*======*/ - mtr_t* mtr, /*!< out: mini-transaction */ - trx_t* trx) /*!< in: transaction */ + mtr_t* mtr) /*!< out: mini-transaction */ { UNIV_MEM_INVALID(mtr, sizeof *mtr); @@ -59,7 +58,6 @@ mtr_start_trx( mtr->made_dirty = FALSE; mtr->n_log_recs = 0; mtr->n_freed_pages = 0; - mtr->trx = trx; ut_d(mtr->state = MTR_ACTIVE); ut_d(mtr->magic_n = MTR_MAGIC_N); diff --git a/storage/xtradb/include/os0file.h b/storage/xtradb/include/os0file.h index f6923024..5e93b345 100644 --- a/storage/xtradb/include/os0file.h +++ b/storage/xtradb/include/os0file.h @@ -382,11 +382,12 @@ The wrapper functions have the prefix of "innodb_". */ pfs_os_file_close_no_error_handling_func(file, __FILE__, __LINE__) # define os_aio(type, is_log, mode, name, file, buf, offset, \ - n, page_size, message1, message2, space_id, \ - trx, write_size) \ + n, page_size, message1, message2, space_id, \ + trx, write_size, should_buffer) \ pfs_os_aio_func(type, is_log, mode, name, file, buf, offset, \ - n, page_size, message1, message2, space_id, trx, write_size, \ - __FILE__, __LINE__) + n, page_size, message1, message2, space_id, \ + trx, write_size, should_buffer, \ + __FILE__, __LINE__) # define os_file_read(file, buf, offset, n) \ pfs_os_file_read_func(file, buf, offset, n, NULL, \ @@ -454,10 +455,12 @@ to original un-instrumented file I/O APIs */ # define os_file_close_no_error_handling(file) \ os_file_close_no_error_handling_func(file) -# define os_aio(type, is_log, mode, name, file, buf, offset, n, page_size, message1, \ - message2, space_id, trx, write_size) \ +# define os_aio(type, is_log, mode, name, file, buf, offset, \ + n, page_size, message1, \ + message2, space_id, trx, write_size, should_buffer) \ os_aio_func(type, is_log, mode, name, file, buf, offset, n, \ - page_size, message1, message2, space_id, trx, write_size) + page_size, message1, message2, space_id, \ + trx, write_size, should_buffer) # define os_file_read(file, buf, offset, n) \ os_file_read_func(file, buf, offset, n, NULL) @@ -939,6 +942,12 @@ pfs_os_aio_func( operation for this page and if initialized we do not trim again if actual page size does not decrease. */ + bool should_buffer, + /*!< in: Whether to buffer an aio request. + AIO read ahead uses this. If you plan to + use this parameter, make sure you remember + to call os_aio_dispatch_read_array_submit() + when you're ready to commit all your requests.*/ const char* src_file,/*!< in: file name where func invoked */ ulint src_line);/*!< in: line where the func invoked */ /*******************************************************************//** @@ -1359,11 +1368,17 @@ os_aio_func( OS_AIO_SYNC */ ulint space_id, trx_t* trx, - ulint* write_size);/*!< in/out: Actual write size initialized + ulint* write_size,/*!< in/out: Actual write size initialized after fist successfull trim operation for this page and if initialized we do not trim again if actual page size does not decrease. */ + bool should_buffer); + /*!< in: Whether to buffer an aio request. + AIO read ahead uses this. If you plan to + use this parameter, make sure you remember + to call os_aio_dispatch_read_array_submit() + when you're ready to commit all your requests.*/ /************************************************************************//** Wakes up all async i/o threads so that they know to exit themselves in shutdown. */ @@ -1547,6 +1562,10 @@ os_file_handle_error_no_exit( ibool on_error_silent);/*!< in: if TRUE then don't print any message to the log. */ +/** Submit buffered AIO requests on the given segment to the kernel. */ +UNIV_INTERN +void +os_aio_dispatch_read_array_submit(); /***********************************************************************//** Try to get number of bytes per sector from file system. diff --git a/storage/xtradb/include/os0file.ic b/storage/xtradb/include/os0file.ic index 72ac9d9d..a2011da3 100644 --- a/storage/xtradb/include/os0file.ic +++ b/storage/xtradb/include/os0file.ic @@ -258,6 +258,9 @@ pfs_os_aio_func( operation for this page and if initialized we do not trim again if actual page size does not decrease. */ + bool should_buffer, + /*!< in: whether to buffer an aio request. + Only used by aio read ahead*/ const char* src_file,/*!< in: file name where func invoked */ ulint src_line)/*!< in: line where the func invoked */ { @@ -274,7 +277,7 @@ pfs_os_aio_func( result = os_aio_func(type, is_log, mode, name, file, buf, offset, n, page_size, message1, message2, space_id, trx, - write_size); + write_size, should_buffer); register_pfs_file_io_end(locker, n); diff --git a/storage/xtradb/include/rem0rec.ic b/storage/xtradb/include/rem0rec.ic index 5811a77a..89f69020 100644 --- a/storage/xtradb/include/rem0rec.ic +++ b/storage/xtradb/include/rem0rec.ic @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1994, 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 @@ -922,7 +923,7 @@ rec_offs_set_n_alloc( { ut_ad(offsets); ut_ad(n_alloc > REC_OFFS_HEADER_SIZE); - UNIV_MEM_ASSERT_AND_ALLOC(offsets, n_alloc * sizeof *offsets); + UNIV_MEM_ALLOC(offsets, n_alloc * sizeof *offsets); offsets[0] = n_alloc; } diff --git a/storage/xtradb/include/row0mysql.h b/storage/xtradb/include/row0mysql.h index 4326f120..4915e7c7 100644 --- a/storage/xtradb/include/row0mysql.h +++ b/storage/xtradb/include/row0mysql.h @@ -591,18 +591,6 @@ void row_mysql_close(void); /*=================*/ -/*********************************************************************//** -Reassigns the table identifier of a table. -@return error code or DB_SUCCESS */ -UNIV_INTERN -dberr_t -row_mysql_table_id_reassign( -/*========================*/ - dict_table_t* table, /*!< in/out: table */ - trx_t* trx, /*!< in/out: transaction */ - table_id_t* new_id) /*!< out: new table id */ - MY_ATTRIBUTE((nonnull, warn_unused_result)); - /* A struct describing a place for an individual column in the MySQL row format which is presented to the table handler in ha_innobase. This template struct is used to speed up row transformations between diff --git a/storage/xtradb/include/srv0srv.h b/storage/xtradb/include/srv0srv.h index e7f63509..6df60e0e 100644 --- a/storage/xtradb/include/srv0srv.h +++ b/storage/xtradb/include/srv0srv.h @@ -195,6 +195,9 @@ struct srv_stats_t { wait timeout */ ulint_ctr_1_t n_lock_max_wait_time; + /** Number of buffered aio requests submitted */ + ulint_ctr_64_t n_aio_submitted; + /** Number of times page 0 is read from tablespace */ ulint_ctr_64_t page0_read; @@ -720,6 +723,9 @@ extern ulong srv_sync_array_size; /* print all user-level transactions deadlocks to mysqld stderr */ extern my_bool srv_print_all_deadlocks; +/* print lock wait timeout info to mysqld stderr */ +extern my_bool srv_print_lock_wait_timeout_info; + extern my_bool srv_cmp_per_index_enabled; /* is encryption enabled */ @@ -1294,7 +1300,9 @@ struct export_var_t{ ib_int64_t innodb_n_rowlog_blocks_decrypted; ulint innodb_sec_rec_cluster_reads; /*!< srv_sec_rec_cluster_reads */ - ulint innodb_sec_rec_cluster_reads_avoided;/*!< srv_sec_rec_cluster_reads_avoided */ + ulint innodb_sec_rec_cluster_reads_avoided; /*!< srv_sec_rec_cluster_reads_avoided */ + + ulint innodb_buffered_aio_submitted; ulint innodb_encryption_rotation_pages_read_from_cache; ulint innodb_encryption_rotation_pages_read_from_disk; diff --git a/storage/xtradb/include/trx0rec.h b/storage/xtradb/include/trx0rec.h index 630818a8..fef12548 100644 --- a/storage/xtradb/include/trx0rec.h +++ b/storage/xtradb/include/trx0rec.h @@ -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 @@ -196,6 +196,7 @@ trx_undo_rec_get_partial_row( used, as we do NOT copy the data in the record! */ dict_index_t* index, /*!< in: clustered index */ + const upd_t* update, /*!< in: updated columns */ dtuple_t** row, /*!< out, own: partial row */ ibool ignore_prefix, /*!< in: flag to indicate if we expect blob prefixes in undo. Used @@ -228,7 +229,7 @@ trx_undo_report_row_operation( const ulint* offsets, /*!< in: rec_get_offsets(rec) */ roll_ptr_t* roll_ptr) /*!< out: DB_ROLL_PTR to the undo log record */ - MY_ATTRIBUTE((nonnull(1,2,8), warn_unused_result)); + MY_ATTRIBUTE((nonnull(2,8), warn_unused_result)); /******************************************************************//** Copies an undo record to heap. This function can be called if we know that the undo log record exists. diff --git a/storage/xtradb/include/trx0undo.h b/storage/xtradb/include/trx0undo.h index 19030811..0148cc61 100644 --- a/storage/xtradb/include/trx0undo.h +++ b/storage/xtradb/include/trx0undo.h @@ -243,13 +243,22 @@ Truncates an undo log from the end. This function is used during a rollback to free space from an undo log. */ UNIV_INTERN void -trx_undo_truncate_end( +trx_undo_truncate_end_func( /*=======================*/ - trx_t* trx, /*!< in: transaction whose undo log it is */ +#ifdef UNIV_DEBUG + const trx_t* trx, /*!< in: transaction whose undo log it is */ +#endif /* UNIV_DEBUG */ trx_undo_t* undo, /*!< in/out: undo log */ undo_no_t limit) /*!< in: all undo records with undo number >= this value should be truncated */ MY_ATTRIBUTE((nonnull)); +#ifdef UNIV_DEBUG +# define trx_undo_truncate_end(trx,undo,limit) \ + trx_undo_truncate_end_func(trx,undo,limit) +#else /* UNIV_DEBUG */ +# define trx_undo_truncate_end(trx,undo,limit) \ + trx_undo_truncate_end_func(undo,limit) +#endif /* UNIV_DEBUG */ /***********************************************************************//** Truncates an undo log from the start. This function is used during a purge diff --git a/storage/xtradb/include/univ.i b/storage/xtradb/include/univ.i index 5886b078..93ab71bf 100644 --- a/storage/xtradb/include/univ.i +++ b/storage/xtradb/include/univ.i @@ -48,7 +48,7 @@ Created 1/20/1994 Heikki Tuuri #define INNODB_VERSION_BUGFIX 36 #ifndef PERCONA_INNODB_VERSION -#define PERCONA_INNODB_VERSION 82.2 +#define PERCONA_INNODB_VERSION 83.0 #endif /* Enable UNIV_LOG_ARCHIVE in XtraDB */ @@ -691,14 +691,6 @@ typedef void* os_thread_ret_t; # define UNIV_MEM_ASSERT_W(addr, size) do {} while(0) # define UNIV_MEM_TRASH(addr, c, size) do {} while(0) #endif -#define UNIV_MEM_ASSERT_AND_FREE(addr, size) do { \ - UNIV_MEM_ASSERT_W(addr, size); \ - UNIV_MEM_FREE(addr, size); \ -} while (0) -#define UNIV_MEM_ASSERT_AND_ALLOC(addr, size) do { \ - UNIV_MEM_ASSERT_W(addr, size); \ - UNIV_MEM_ALLOC(addr, size); \ -} while (0) extern ulong srv_page_size_shift; extern ulong srv_page_size; diff --git a/storage/xtradb/lock/lock0lock.cc b/storage/xtradb/lock/lock0lock.cc index 20e3f5ad..a9077cb1 100644 --- a/storage/xtradb/lock/lock0lock.cc +++ b/storage/xtradb/lock/lock0lock.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 @@ -6970,7 +6970,7 @@ lock_rec_block_validate( /* Make sure that the tablespace is not deleted while we are trying to access the page. */ - if (fil_space_t* space = fil_space_acquire(space_id)) { + if (fil_space_t* space = fil_space_acquire_silent(space_id)) { mtr_start(&mtr); block = buf_page_get_gen( diff --git a/storage/xtradb/lock/lock0wait.cc b/storage/xtradb/lock/lock0wait.cc index a0f557e1..da4b0301 100644 --- a/storage/xtradb/lock/lock0wait.cc +++ b/storage/xtradb/lock/lock0wait.cc @@ -33,6 +33,20 @@ Created 25/5/2010 Sunny Bains #include "srv0start.h" #include "ha_prototypes.h" #include "lock0priv.h" +#include "lock0iter.h" + +#include + +extern "C" +LEX_STRING* thd_query_string(MYSQL_THD thd); + +struct blocking_trx_info { + uint64_t trx_id; + uint32_t thread_id; + int64_t query_id; +}; + +static const size_t MAX_BLOCKING_TRX_IN_REPORT = 10; #include @@ -187,6 +201,46 @@ lock_wait_table_reserve_slot( return(NULL); } +/** Print lock wait timeout info to stderr. It's supposed this function +is executed in trx's THD thread as it calls some non-thread-safe +functions to get some info from THD. +@param[in] trx requested trx +@param[in] blocking blocking info array +@param[in] blocking_count blocking info array size */ +void +print_lock_wait_timeout( + const trx_t &trx, + blocking_trx_info *blocking, + size_t blocking_count) +{ + std::ostringstream outs; + + outs << "Lock wait timeout info:\n"; + outs << "Requested thread id: " << + thd_get_thread_id(trx.mysql_thd) << + "\n"; + outs << "Requested trx id: " << trx.id << "\n"; + outs << "Requested query: " << + thd_query_string(trx.mysql_thd)->str << "\n"; + + outs << "Total blocking transactions count: " << + blocking_count << + "\n"; + + for (size_t i = 0; i < blocking_count; ++i) { + outs << "Blocking transaction number: " << (i + 1) << "\n"; + outs << "Blocking thread id: " << + blocking[i].thread_id << + "\n"; + outs << "Blocking query id: " << + blocking[i].query_id << + "\n"; + outs << "Blocking trx id: " << blocking[i].trx_id << "\n"; + } + ut_print_timestamp(stderr); + fprintf(stderr, " %s", outs.str().c_str()); +} + #ifdef WITH_WSREP /*********************************************************************//** check if lock timeout was for priority thread, @@ -235,6 +289,8 @@ lock_wait_suspend_thread( ulint sec; ulint ms; ulong lock_wait_timeout; + blocking_trx_info blocking[MAX_BLOCKING_TRX_IN_REPORT]; + size_t blocking_count = 0; trx = thr_get_trx(thr); @@ -411,6 +467,8 @@ lock_wait_suspend_thread( #endif /* WITH_WSREP */ trx->error_state = DB_LOCK_WAIT_TIMEOUT; + if (srv_print_lock_wait_timeout_info) + print_lock_wait_timeout(*trx, blocking, blocking_count); #ifdef WITH_WSREP } diff --git a/storage/xtradb/log/log0crypt.cc b/storage/xtradb/log/log0crypt.cc index a5fbbab1..2a0a7abb 100644 --- a/storage/xtradb/log/log0crypt.cc +++ b/storage/xtradb/log/log0crypt.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (C) 2013, 2015, Google Inc. All Rights Reserved. -Copyright (C) 2014, 2017, MariaDB Corporation. 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 @@ -69,22 +69,6 @@ struct crypt_info_t { static std::deque crypt_info; -/*********************************************************************//** -Get a log block's start lsn. -@return a log block's start lsn */ -static inline -lsn_t -log_block_get_start_lsn( -/*====================*/ - lsn_t lsn, /*!< in: checkpoint lsn */ - ulint log_block_no) /*!< in: log block number */ -{ - lsn_t start_lsn = - (lsn & (lsn_t)0xffffffff00000000ULL) | - (((log_block_no - 1) & (lsn_t)0x3fffffff) << 9); - return start_lsn; -} - /*********************************************************************//** Get crypt info from checkpoint. @return a crypt info or NULL if not present. */ @@ -161,6 +145,8 @@ Crypt_result log_blocks_crypt( /*=============*/ const byte* block, /*!< in: blocks before encrypt/decrypt*/ + lsn_t lsn, /*!< in: log sequence number of the start + of the buffer */ ulint size, /*!< in: size of block */ byte* dst_block, /*!< out: blocks after encrypt/decrypt */ int what, /*!< in: encrypt or decrypt*/ @@ -170,21 +156,18 @@ log_blocks_crypt( Crypt_result rc = MY_AES_OK; uint dst_len; byte aes_ctr_counter[MY_AES_BLOCK_SIZE]; - byte is_encrypt= what == ENCRYPTION_FLAG_ENCRYPT; - lsn_t lsn = is_encrypt ? log_sys->lsn : srv_start_lsn; const uint src_len = OS_FILE_LOG_BLOCK_SIZE - LOG_BLOCK_HDR_SIZE; - for (ulint i = 0; i < size ; i += OS_FILE_LOG_BLOCK_SIZE) { + for (ulint i = 0; i < size ; i += OS_FILE_LOG_BLOCK_SIZE, + lsn += OS_FILE_LOG_BLOCK_SIZE) { ulint log_block_no = log_block_get_hdr_no(log_block); - lsn_t log_block_start_lsn = log_block_get_start_lsn( - lsn, log_block_no); const crypt_info_t* info = crypt_info == NULL ? get_crypt_info(log_block) : crypt_info; #ifdef DEBUG_CRYPT fprintf(stderr, "%s %lu chkpt: %lu key: %u lsn: %lu\n", - is_encrypt ? "crypt" : "decrypt", + what == ENCRYPTION_FLAG_ENCRYPT ? "crypt" : "decrypt", log_block_no, log_block_get_checkpoint_no(log_block), info ? info->key_version : 0, @@ -213,7 +196,7 @@ log_blocks_crypt( // (1-byte, only 5 bits are used). "+" means concatenate. bzero(aes_ctr_counter, MY_AES_BLOCK_SIZE); memcpy(aes_ctr_counter, info->crypt_nonce, 3); - mach_write_to_8(aes_ctr_counter + 3, log_block_start_lsn); + mach_write_to_8(aes_ctr_counter + 3, lsn); mach_write_to_4(aes_ctr_counter + 11, log_block_no); bzero(aes_ctr_counter + 15, 1); @@ -458,19 +441,6 @@ add_crypt_info( return true; } -/*********************************************************************//** -Encrypt log blocks. */ -UNIV_INTERN -Crypt_result -log_blocks_encrypt( -/*===============*/ - const byte* block, /*!< in: blocks before encryption */ - const ulint size, /*!< in: size of blocks, must be multiple of a log block */ - byte* dst_block) /*!< out: blocks after encryption */ -{ - return log_blocks_crypt(block, size, dst_block, ENCRYPTION_FLAG_ENCRYPT, NULL); -} - /*********************************************************************//** Set next checkpoint's key version to latest one, and generate current key. Key version 0 means no encryption. */ @@ -522,6 +492,8 @@ log_encrypt_before_write( /*=====================*/ ib_uint64_t next_checkpoint_no, /*!< in: log group to be flushed */ byte* block, /*!< in/out: pointer to a log block */ + lsn_t lsn, /*!< in: log sequence number of + the start of the buffer */ const ulint size) /*!< in: size of log blocks */ { ut_ad(size % OS_FILE_LOG_BLOCK_SIZE == 0); @@ -540,7 +512,8 @@ log_encrypt_before_write( byte* dst_frame = (byte*)malloc(size); //encrypt log blocks content - Crypt_result result = log_blocks_crypt(block, size, dst_frame, ENCRYPTION_FLAG_ENCRYPT, NULL); + Crypt_result result = log_blocks_crypt( + block, lsn, size, dst_frame, ENCRYPTION_FLAG_ENCRYPT, NULL); if (result == MY_AES_OK) { ut_ad(block[0] == dst_frame[0]); @@ -560,13 +533,16 @@ void log_decrypt_after_read( /*===================*/ byte* frame, /*!< in/out: log segment */ + lsn_t lsn, /*!< in: log sequence number of the start + of the buffer */ const ulint size) /*!< in: log segment size */ { ut_ad(size % OS_FILE_LOG_BLOCK_SIZE == 0); byte* dst_frame = (byte*)malloc(size); // decrypt log blocks content - Crypt_result result = log_blocks_crypt(frame, size, dst_frame, ENCRYPTION_FLAG_DECRYPT, NULL); + Crypt_result result = log_blocks_crypt( + frame, lsn, size, dst_frame, ENCRYPTION_FLAG_DECRYPT, NULL); if (result == MY_AES_OK) { memcpy(frame, dst_frame, size); diff --git a/storage/xtradb/log/log0log.cc b/storage/xtradb/log/log0log.cc index 1542f4a6..8f8984f8 100644 --- a/storage/xtradb/log/log0log.cc +++ b/storage/xtradb/log/log0log.cc @@ -1490,7 +1490,7 @@ log_group_write_buf( ut_a(next_offset / UNIV_PAGE_SIZE <= ULINT_MAX); log_encrypt_before_write(log_sys->next_checkpoint_no, - buf, write_len); + buf, start_lsn, write_len); #ifdef DEBUG_CRYPT fprintf(stderr, "WRITE: block: %lu checkpoint: %lu %.8lx %.8lx\n", @@ -2582,7 +2582,7 @@ log_group_read_log_seg( log_block_get_checksum(buf), source_offset); #endif - log_decrypt_after_read(buf, len); + log_decrypt_after_read(buf, start_lsn, len); #ifdef DEBUG_CRYPT fprintf(stderr, "AFTER DECRYPT: block: %lu checkpoint: %lu %.8lx %.8lx\n", @@ -2890,7 +2890,8 @@ log_group_archive( MONITOR_INC(MONITOR_LOG_IO); //TODO (jonaso): This must be dead code?? - log_encrypt_before_write(log_sys->next_checkpoint_no, buf, len); + log_encrypt_before_write(log_sys->next_checkpoint_no, + buf, start_lsn, len); fil_io(OS_FILE_WRITE | OS_FILE_LOG, false, group->archive_space_id, 0, diff --git a/storage/xtradb/log/log0online.cc b/storage/xtradb/log/log0online.cc index 27382977..af322372 100644 --- a/storage/xtradb/log/log0online.cc +++ b/storage/xtradb/log/log0online.cc @@ -479,9 +479,9 @@ log_online_make_bitmap_name( /*=========================*/ lsn_t start_lsn) /*!< in: the start LSN name part */ { - ut_snprintf(log_bmp_sys->out.name, FN_REFLEN, bmp_file_name_template, - log_bmp_sys->bmp_file_home, bmp_file_name_stem, - log_bmp_sys->out_seq_num, start_lsn); + ut_snprintf(log_bmp_sys->out.name, sizeof(log_bmp_sys->out.name), + bmp_file_name_template, log_bmp_sys->bmp_file_home, + bmp_file_name_stem, log_bmp_sys->out_seq_num, start_lsn); } /*********************************************************************//** diff --git a/storage/xtradb/mem/mem0mem.cc b/storage/xtradb/mem/mem0mem.cc index e066aff5..b9f19050 100644 --- a/storage/xtradb/mem/mem0mem.cc +++ b/storage/xtradb/mem/mem0mem.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1994, 2011, 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 @@ -506,13 +507,13 @@ mem_heap_block_free( #ifndef UNIV_HOTBACKUP if (!srv_use_sys_malloc) { #ifdef UNIV_MEM_DEBUG + UNIV_MEM_ALLOC(block, len); /* In the debug version we set the memory to a random combination of hex 0xDE and 0xAD. */ - mem_erase_buf((byte*) block, len); -#else /* UNIV_MEM_DEBUG */ - UNIV_MEM_ASSERT_AND_FREE(block, len); + mem_erase_buf((byte*)block, len); #endif /* UNIV_MEM_DEBUG */ + UNIV_MEM_FREE(block, len); } if (type == MEM_HEAP_DYNAMIC || len < UNIV_PAGE_SIZE / 2) { @@ -526,13 +527,13 @@ mem_heap_block_free( } #else /* !UNIV_HOTBACKUP */ #ifdef UNIV_MEM_DEBUG + UNIV_MEM_ALLOC(block, len); /* In the debug version we set the memory to a random combination of hex 0xDE and 0xAD. */ - mem_erase_buf((byte*) block, len); -#else /* UNIV_MEM_DEBUG */ - UNIV_MEM_ASSERT_AND_FREE(block, len); + mem_erase_buf((byte*)block, len); #endif /* UNIV_MEM_DEBUG */ + UNIV_MEM_FREE(block, len); ut_free(block); #endif /* !UNIV_HOTBACKUP */ } diff --git a/storage/xtradb/os/os0file.cc b/storage/xtradb/os/os0file.cc index 8b0fa059..634ebb2a 100644 --- a/storage/xtradb/os/os0file.cc +++ b/storage/xtradb/os/os0file.cc @@ -296,6 +296,16 @@ struct os_aio_array_t{ There is one such event for each possible pending IO. The size of the array is equal to n_slots. */ + struct iocb** pending; + /* Array to buffer the not-submitted aio + requests. The array length is n_slots. + It is divided into n_segments segments. + pending requests on each segment are buffered + separately.*/ + ulint* count; + /* Array of length n_segments. Each element + counts the number of not-submitted aio + request on that segment.*/ #endif /* LINUX_NATIV_AIO */ }; @@ -4276,6 +4286,13 @@ os_aio_array_create( memset(io_event, 0x0, sizeof(*io_event) * n); array->aio_events = io_event; + array->pending = static_cast( + ut_malloc(n * sizeof(struct iocb*))); + memset(array->pending, 0x0, sizeof(struct iocb*) * n); + array->count = static_cast( + ut_malloc(n_segments * sizeof(ulint))); + memset(array->count, 0x0, sizeof(ulint) * n_segments); + skip_native_aio: #endif /* LINUX_NATIVE_AIO */ for (ulint i = 0; i < n; i++) { @@ -4310,6 +4327,16 @@ os_aio_array_free( if (srv_use_native_aio) { ut_free(array->aio_events); ut_free(array->aio_ctx); + +#ifdef UNIV_DEBUG + for (size_t idx = 0; idx < array->n_slots; ++idx) + ut_ad(array->pending[idx] == NULL); + for (size_t idx = 0; idx < array->n_segments; ++idx) + ut_ad(array->count[idx] == 0); +#endif + + ut_free(array->pending); + ut_free(array->count); } #endif /* LINUX_NATIVE_AIO */ @@ -4957,6 +4984,83 @@ readahead requests. */ } #endif /* _WIN32 */ +/** Submit buffered AIO requests on the given segment to the kernel +(low level function). +@param acquire_mutex specifies whether to lock array mutex +*/ +static +void +os_aio_dispatch_read_array_submit_low(bool acquire_mutex MY_ATTRIBUTE((unused))) +{ + if (!srv_use_native_aio) { + return; + } +#if defined(LINUX_NATIVE_AIO) + os_aio_array_t* array = os_aio_read_array; + ulint total_submitted = 0; + if (acquire_mutex) + os_mutex_enter(array->mutex); + /* Submit aio requests buffered on all segments. */ + for (ulint i = 0; i < array->n_segments; i++) { + const int count = array->count[i]; + int offset = 0; + while (offset != count) { + struct iocb** const iocb_array = array->pending + + i * array->n_slots / array->n_segments + + offset; + const int partial_count = count - offset; + /* io_submit() returns number of successfully queued + requests or (-errno). + It returns 0 only if the number of iocb blocks passed + is also 0. */ + const int submitted = io_submit(array->aio_ctx[i], + partial_count, iocb_array); + + /* This assertion prevents infinite loop in both + debug and release modes. */ + ut_a(submitted != 0); + + if (submitted < 0) { + /* Terminating with fatal error */ + const char* errmsg = + strerror(-submitted); + ib_logf(IB_LOG_LEVEL_FATAL, + "Trying to sumbit %d aio requests, " + "io_submit() set errno to %d: %s", + partial_count, -submitted, + errmsg ? errmsg : ""); + } + ut_ad(submitted <= partial_count); + if (submitted < partial_count) + { + ib_logf(IB_LOG_LEVEL_WARN, + "Trying to sumbit %d aio requests, " + "io_submit() submitted only %d", + partial_count, submitted); + } + offset += submitted; + } + total_submitted += count; + } + /* Reset the aio request buffer. */ + memset(array->pending, 0x0, sizeof(struct iocb*) * array->n_slots); + memset(array->count, 0x0, sizeof(ulint) * array->n_segments); + + if (acquire_mutex) + os_mutex_exit(array->mutex); + + srv_stats.n_aio_submitted.add(total_submitted); +#endif +} + +/** Submit buffered AIO requests on the given segment to the kernel. */ +UNIV_INTERN +void +os_aio_dispatch_read_array_submit() +{ + os_aio_dispatch_read_array_submit_low(true); +} + #if defined(LINUX_NATIVE_AIO) /*******************************************************************//** Dispatch an AIO request to the kernel. @@ -4966,10 +5070,11 @@ ibool os_aio_linux_dispatch( /*==================*/ os_aio_array_t* array, /*!< in: io request array. */ - os_aio_slot_t* slot) /*!< in: an already reserved slot. */ + os_aio_slot_t* slot, /*!< in: an already reserved slot. */ + bool should_buffer) /*!< in: should buffer the request + rather than submit. */ { int ret; - ulint io_ctx_index; struct iocb* iocb; ut_ad(slot != NULL); @@ -4981,9 +5086,31 @@ os_aio_linux_dispatch( The iocb struct is directly in the slot. The io_context is one per segment. */ + ulint slots_per_segment = array->n_slots / array->n_segments; iocb = &slot->control; - io_ctx_index = (slot->pos * array->n_segments) / array->n_slots; + ulint io_ctx_index = slot->pos / slots_per_segment; + if (should_buffer) { + ut_ad(array == os_aio_read_array); + os_mutex_enter(array->mutex); + /* There are array->n_slots elements in array->pending, + which is divided into array->n_segments area of equal size. + The iocb of each segment are buffered in its corresponding area + in the pending array consecutively as they come. + array->count[i] records the number of buffered aio requests + in the ith segment.*/ + ulint& count = array->count[io_ctx_index]; + ut_ad(count != slots_per_segment); + ulint n = io_ctx_index * slots_per_segment + count; + array->pending[n] = iocb; + ++count; + if (count == slots_per_segment) { + os_aio_dispatch_read_array_submit_low(false); + } + os_mutex_exit(array->mutex); + return(TRUE); + } + /* Submit the given request. */ ret = io_submit(array->aio_ctx[io_ctx_index], 1, &iocb); #if defined(UNIV_AIO_DEBUG) @@ -5046,11 +5173,17 @@ os_aio_func( OS_AIO_SYNC */ ulint space_id, trx_t* trx, - ulint* write_size)/*!< in/out: Actual write size initialized + ulint* write_size,/*!< in/out: Actual write size initialized after fist successfull trim operation for this page and if initialized we do not trim again if actual page size does not decrease. */ + bool should_buffer) + /*!< in: Whether to buffer an aio request. + AIO read ahead uses this. If you plan to + use this parameter, make sure you remember + to call os_aio_dispatch_read_array_submit() + when you're ready to commit all your requests.*/ { os_aio_array_t* array; os_aio_slot_t* slot; @@ -5168,7 +5301,8 @@ os_aio_func( goto err_exit; #elif defined(LINUX_NATIVE_AIO) - if (!os_aio_linux_dispatch(array, slot)) { + if (!os_aio_linux_dispatch(array, slot, + should_buffer)) { goto err_exit; } #endif /* WIN_ASYNC_IO */ @@ -5192,7 +5326,7 @@ os_aio_func( if(!ret && GetLastError() != ERROR_IO_PENDING) goto err_exit; #elif defined(LINUX_NATIVE_AIO) - if (!os_aio_linux_dispatch(array, slot)) { + if (!os_aio_linux_dispatch(array, slot, false)) { goto err_exit; } #endif /* WIN_ASYNC_IO */ diff --git a/storage/xtradb/page/page0page.cc b/storage/xtradb/page/page0page.cc index 800f76e1..fc93eebd 100644 --- a/storage/xtradb/page/page0page.cc +++ b/storage/xtradb/page/page0page.cc @@ -2839,7 +2839,7 @@ page_warn_strict_checksum( ulint space_id, ulint page_no) { - srv_checksum_algorithm_t curr_algo_nonstrict; + srv_checksum_algorithm_t curr_algo_nonstrict = srv_checksum_algorithm_t(); switch (curr_algo) { case SRV_CHECKSUM_ALGORITHM_STRICT_CRC32: curr_algo_nonstrict = SRV_CHECKSUM_ALGORITHM_CRC32; diff --git a/storage/xtradb/rem/rem0rec.cc b/storage/xtradb/rem/rem0rec.cc index c62e8c90..2314f110 100644 --- a/storage/xtradb/rem/rem0rec.cc +++ b/storage/xtradb/rem/rem0rec.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1994, 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 @@ -865,13 +865,10 @@ rec_get_converted_size_comp_prefix_low( if (fixed_len) { #ifdef UNIV_DEBUG - ulint mbminlen = DATA_MBMINLEN(col->mbminmaxlen); - ulint mbmaxlen = DATA_MBMAXLEN(col->mbminmaxlen); - ut_ad(len <= fixed_len); - ut_ad(!mbmaxlen || len >= mbminlen - * (fixed_len / mbmaxlen)); + ut_ad(!col->mbmaxlen || len >= col->mbminlen + * (fixed_len / col->mbmaxlen)); /* dict_index_add_col() should guarantee this */ ut_ad(!field->prefix_len @@ -1259,14 +1256,10 @@ rec_convert_dtuple_to_rec_comp( it is 128 or more, or when the field is stored externally. */ if (fixed_len) { #ifdef UNIV_DEBUG - ulint mbminlen = DATA_MBMINLEN( - ifield->col->mbminmaxlen); - ulint mbmaxlen = DATA_MBMAXLEN( - ifield->col->mbminmaxlen); - ut_ad(len <= fixed_len); - ut_ad(!mbmaxlen || len >= mbminlen - * (fixed_len / mbmaxlen)); + ut_ad(!ifield->col->mbmaxlen + || len >= ifield->col->mbminlen + * (fixed_len / ifield->col->mbmaxlen)); ut_ad(!dfield_is_ext(field)); #endif /* UNIV_DEBUG */ } else if (dfield_is_ext(field)) { diff --git a/storage/xtradb/row/row0ext.cc b/storage/xtradb/row/row0ext.cc index ad852577..32b78391 100644 --- a/storage/xtradb/row/row0ext.cc +++ b/storage/xtradb/row/row0ext.cc @@ -78,8 +78,7 @@ row_ext_cache_fill( crashed during the execution of btr_free_externally_stored_field(). */ ext->len[i] = btr_copy_externally_stored_field_prefix( - buf, ext->max_len, zip_size, field, f_len, - NULL); + buf, ext->max_len, zip_size, field, f_len); } } } diff --git a/storage/xtradb/row/row0ftsort.cc b/storage/xtradb/row/row0ftsort.cc index 0f9c15f6..bd57685b 100644 --- a/storage/xtradb/row/row0ftsort.cc +++ b/storage/xtradb/row/row0ftsort.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2010, 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 @@ -106,8 +106,9 @@ row_merge_create_fts_sort_index( field->col->prtype = idx_field->col->prtype | DATA_NOT_NULL; field->col->mtype = charset == &my_charset_latin1 ? DATA_VARCHAR : DATA_VARMYSQL; - field->col->mbminmaxlen = idx_field->col->mbminmaxlen; - field->col->len = HA_FT_MAXCHARLEN * DATA_MBMAXLEN(field->col->mbminmaxlen); + field->col->mbminlen = idx_field->col->mbminlen; + field->col->mbmaxlen = idx_field->col->mbmaxlen; + field->col->len = HA_FT_MAXCHARLEN * field->col->mbmaxlen; field->fixed_len = 0; @@ -150,7 +151,8 @@ row_merge_create_fts_sort_index( field->col->prtype = DATA_NOT_NULL | DATA_BINARY_TYPE; - field->col->mbminmaxlen = 0; + field->col->mbminlen = 0; + field->col->mbmaxlen = 0; /* The third field is on the word's position in the original doc */ field = dict_index_get_nth_field(new_index, 2); @@ -162,7 +164,8 @@ row_merge_create_fts_sort_index( field->col->len = 4 ; field->fixed_len = 4; field->col->prtype = DATA_NOT_NULL; - field->col->mbminmaxlen = 0; + field->col->mbminlen = 0; + field->col->mbmaxlen = 0; return(new_index); } @@ -540,7 +543,8 @@ row_merge_fts_doc_tokenize( field->type.mtype = DATA_INT; field->type.prtype = DATA_NOT_NULL | DATA_BINARY_TYPE; field->type.len = len; - field->type.mbminmaxlen = 0; + field->type.mbminlen = 0; + field->type.mbmaxlen = 0; cur_len += len; dfield_dup(field, buf->heap); @@ -559,7 +563,8 @@ row_merge_fts_doc_tokenize( field->type.mtype = DATA_INT; field->type.prtype = DATA_NOT_NULL; field->type.len = len; - field->type.mbminmaxlen = 0; + field->type.mbminlen = 0; + field->type.mbmaxlen = 0; cur_len += len; dfield_dup(field, buf->heap); @@ -709,8 +714,7 @@ fts_parallel_tokenization( doc.text.f_str = btr_copy_externally_stored_field( &doc.text.f_len, data, - zip_size, data_len, blob_heap, - NULL); + zip_size, data_len, blob_heap); } else { doc.text.f_str = data; doc.text.f_len = data_len; diff --git a/storage/xtradb/row/row0import.cc b/storage/xtradb/row/row0import.cc index 3efc2a30..f0035302 100644 --- a/storage/xtradb/row/row0import.cc +++ b/storage/xtradb/row/row0import.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2012, 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 @@ -1259,7 +1259,8 @@ row_import::match_table_columns( err = DB_ERROR; } - if (cfg_col->mbminmaxlen != col->mbminmaxlen) { + if (cfg_col->mbminlen != col->mbminlen + || cfg_col->mbmaxlen != col->mbmaxlen) { ib_errf(thd, IB_LOG_LEVEL_ERROR, ER_TABLE_SCHEMA_MISMATCH, @@ -2877,7 +2878,9 @@ row_import_read_columns( col->len = mach_read_from_4(ptr); ptr += sizeof(ib_uint32_t); - col->mbminmaxlen = mach_read_from_4(ptr); + ulint mbminmaxlen = mach_read_from_4(ptr); + col->mbmaxlen = mbminmaxlen / 5; + col->mbminlen = mbminmaxlen % 5; ptr += sizeof(ib_uint32_t); col->ind = mach_read_from_4(ptr); diff --git a/storage/xtradb/row/row0ins.cc b/storage/xtradb/row/row0ins.cc index f653a4df..472be8ad 100644 --- a/storage/xtradb/row/row0ins.cc +++ b/storage/xtradb/row/row0ins.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 @@ -571,7 +571,8 @@ row_ins_cascade_calc_update_vec( if (!dfield_is_null(&ufield->new_val) && dtype_get_at_most_n_mbchars( - col->prtype, col->mbminmaxlen, + col->prtype, + col->mbminlen, col->mbmaxlen, col->len, ufield_len, static_cast( @@ -1330,7 +1331,7 @@ row_ins_foreign_check_on_constraint( row_mysql_freeze_data_dictionary(thr_get_trx(thr)); - mtr_start_trx(mtr, trx); + mtr_start(mtr); /* Restore pcur position */ @@ -1358,7 +1359,7 @@ row_ins_foreign_check_on_constraint( btr_pcur_store_position(pcur, mtr); mtr_commit(mtr); - mtr_start_trx(mtr, trx); + mtr_start(mtr); btr_pcur_restore_position(BTR_SEARCH_LEAF, pcur, mtr); @@ -1571,7 +1572,7 @@ row_ins_check_foreign_constraint( } } - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); /* Store old value on n_fields_cmp */ @@ -2390,7 +2391,7 @@ row_ins_clust_index_entry_low( search_mode = mode; } - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); if (mode == BTR_MODIFY_LEAF && dict_index_is_online_ddl(index)) { @@ -2628,10 +2629,9 @@ Starts a mini-transaction and checks if the index will be dropped. @return true if the index is to be dropped */ static MY_ATTRIBUTE((nonnull, warn_unused_result)) bool -row_ins_sec_mtr_start_trx_and_check_if_aborted( +row_ins_sec_mtr_start_and_check_if_aborted( /*=======================================*/ mtr_t* mtr, /*!< out: mini-transaction */ - trx_t* trx, /*!< in: transaction handle */ dict_index_t* index, /*!< in/out: secondary index */ bool check, /*!< in: whether to check */ ulint search_mode) @@ -2639,7 +2639,7 @@ row_ins_sec_mtr_start_trx_and_check_if_aborted( { ut_ad(!dict_index_is_clust(index)); - mtr_start_trx(mtr, trx); + mtr_start(mtr); if (!check) { return(false); @@ -2697,14 +2697,13 @@ row_ins_sec_index_entry_low( ulint n_unique; mtr_t mtr; ulint* offsets = NULL; - trx_t* trx = thr_get_trx(thr); ut_ad(!dict_index_is_clust(index)); ut_ad(mode == BTR_MODIFY_LEAF || mode == BTR_MODIFY_TREE); cursor.thr = thr; ut_ad(thr_get_trx(thr)->id); - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); /* If running with fake_changes mode on then avoid using insert buffer and also switch from modify to search so that code takes only s-latch @@ -2766,7 +2765,7 @@ row_ins_sec_index_entry_low( if (err != DB_SUCCESS) { if (err == DB_DECRYPTION_FAILED) { - ib_push_warning(trx->mysql_thd, + ib_push_warning(thr_get_trx(thr)->mysql_thd, DB_DECRYPTION_FAILED, "Table %s is encrypted but encryption service or" " used key_id is not available. " @@ -2802,8 +2801,8 @@ row_ins_sec_index_entry_low( DEBUG_SYNC_C("row_ins_sec_index_unique"); - if (row_ins_sec_mtr_start_trx_and_check_if_aborted( - &mtr, trx, index, check, search_mode)) { + if (row_ins_sec_mtr_start_and_check_if_aborted( + &mtr, index, check, search_mode)) { goto func_exit; } @@ -2837,8 +2836,8 @@ row_ins_sec_index_entry_low( return(err); } - if (row_ins_sec_mtr_start_trx_and_check_if_aborted( - &mtr, trx, index, check, search_mode)) { + if (row_ins_sec_mtr_start_and_check_if_aborted( + &mtr, index, check, search_mode)) { goto func_exit; } @@ -3147,7 +3146,7 @@ row_ins_index_entry_set_vals( = dict_field_get_col(ind_field); len = dtype_get_at_most_n_mbchars( - col->prtype, col->mbminmaxlen, + col->prtype, col->mbminlen, col->mbmaxlen, ind_field->prefix_len, len, static_cast( diff --git a/storage/xtradb/row/row0log.cc b/storage/xtradb/row/row0log.cc index 82fde841..040fb37e 100644 --- a/storage/xtradb/row/row0log.cc +++ b/storage/xtradb/row/row0log.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2011, 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 @@ -1064,7 +1064,7 @@ row_log_table_get_pk_col( mem_heap_alloc(heap, field_len)); len = btr_copy_externally_stored_field_prefix( - blob_field, field_len, zip_size, field, len, NULL); + blob_field, field_len, zip_size, field, len); if (len >= max_len + 1) { return(DB_TOO_BIG_INDEX_COL); } @@ -1183,7 +1183,7 @@ row_log_table_get_pk( dict_field_t* ifield; dfield_t* dfield; ulint prtype; - ulint mbminmaxlen; + ulint mbminlen, mbmaxlen; ifield = dict_index_get_nth_field(new_index, new_i); dfield = dtuple_get_nth_field(tuple, new_i); @@ -1212,7 +1212,8 @@ row_log_table_get_pk( goto func_exit; } - mbminmaxlen = col->mbminmaxlen; + mbminlen = col->mbminlen; + mbmaxlen = col->mbmaxlen; prtype = col->prtype; } else { /* No matching column was found in the old @@ -1222,7 +1223,8 @@ row_log_table_get_pk( dfield_copy(dfield, dtuple_get_nth_field( log->add_cols, col_no)); - mbminmaxlen = dfield->type.mbminmaxlen; + mbminlen = dfield->type.mbminlen; + mbmaxlen = dfield->type.mbmaxlen; prtype = dfield->type.prtype; } @@ -1231,7 +1233,7 @@ row_log_table_get_pk( if (ifield->prefix_len) { ulint len = dtype_get_at_most_n_mbchars( - prtype, mbminmaxlen, + prtype, mbminlen, mbmaxlen, ifield->prefix_len, dfield_get_len(dfield), static_cast( @@ -1455,7 +1457,7 @@ row_log_table_apply_convert_mrec( data = btr_rec_copy_externally_stored_field( mrec, offsets, dict_table_zip_size(index->table), - i, &len, heap, NULL); + i, &len, heap); ut_a(data); dfield_set_data(dfield, data, len); blob_done: diff --git a/storage/xtradb/row/row0merge.cc b/storage/xtradb/row/row0merge.cc index cbcc3cc6..d9585818 100644 --- a/storage/xtradb/row/row0merge.cc +++ b/storage/xtradb/row/row0merge.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2005, 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 @@ -268,8 +268,8 @@ row_merge_buf_redundant_convert( mem_heap_t* heap, trx_t* trx) { - ut_ad(DATA_MBMINLEN(field->type.mbminmaxlen) == 1); - ut_ad(DATA_MBMAXLEN(field->type.mbminmaxlen) > 1); + ut_ad(field->type.mbminlen == 1); + ut_ad(field->type.mbmaxlen > 1); byte* buf = (byte*) mem_heap_alloc(heap, len); ulint field_len = row_field->len; @@ -285,7 +285,7 @@ row_merge_buf_redundant_convert( field_ref_zero, BTR_EXTERN_FIELD_REF_SIZE)); byte* data = btr_copy_externally_stored_field( - &ext_len, field_data, zip_size, field_len, heap, trx); + &ext_len, field_data, zip_size, field_len, heap); ut_ad(ext_len < len); @@ -396,7 +396,8 @@ row_merge_buf_add( field->type.mtype = ifield->col->mtype; field->type.prtype = ifield->col->prtype; - field->type.mbminmaxlen = DATA_MBMINMAXLEN(0, 0); + field->type.mbminlen = 0; + field->type.mbmaxlen = 0; field->type.len = ifield->col->len; } else { row_field = dtuple_get_nth_field(row, col_no); @@ -531,7 +532,7 @@ row_merge_buf_add( if (ifield->prefix_len) { len = dtype_get_at_most_n_mbchars( col->prtype, - col->mbminmaxlen, + col->mbminlen, col->mbmaxlen, ifield->prefix_len, len, static_cast(dfield_get_data(field))); @@ -546,8 +547,7 @@ row_merge_buf_add( fixed_len = ifield->fixed_len; if (fixed_len && !dict_table_is_comp(index->table) - && DATA_MBMINLEN(col->mbminmaxlen) - != DATA_MBMAXLEN(col->mbminmaxlen)) { + && col->mbminlen != col->mbmaxlen) { /* CHAR in ROW_FORMAT=REDUNDANT is always fixed-length, but in the temporary file it is variable-length for variable-length character @@ -557,14 +557,11 @@ row_merge_buf_add( if (fixed_len) { #ifdef UNIV_DEBUG - ulint mbminlen = DATA_MBMINLEN(col->mbminmaxlen); - ulint mbmaxlen = DATA_MBMAXLEN(col->mbminmaxlen); - /* len should be between size calcualted base on mbmaxlen and mbminlen */ ut_ad(len <= fixed_len); - ut_ad(!mbmaxlen || len >= mbminlen - * (fixed_len / mbmaxlen)); + ut_ad(!col->mbmaxlen || len >= col->mbminlen + * (fixed_len / col->mbmaxlen)); ut_ad(!dfield_is_ext(field)); #endif /* UNIV_DEBUG */ @@ -2626,7 +2623,7 @@ row_merge_copy_blobs( BLOB pointers are read (row_merge_read_clustered_index()) and dereferenced (below). */ data = btr_rec_copy_externally_stored_field( - mrec, offsets, zip_size, i, &len, heap, NULL); + mrec, offsets, zip_size, i, &len, heap); /* Because we have locked the table, any records written by incomplete transactions must have been rolled back already. There must not be any incomplete diff --git a/storage/xtradb/row/row0mysql.cc b/storage/xtradb/row/row0mysql.cc index 43f4d4bc..549a1979 100644 --- a/storage/xtradb/row/row0mysql.cc +++ b/storage/xtradb/row/row0mysql.cc @@ -1,7 +1,7 @@ /***************************************************************************** -Copyright (c) 2000, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2015, 2017, MariaDB Corporation. +Copyright (c) 2000, 2017, 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 the terms of the GNU General Public License as published by the Free Software @@ -58,6 +58,7 @@ Created 9/17/2000 Heikki Tuuri #include "btr0sea.h" #include "btr0defragment.h" #include "fil0fil.h" +#include "srv0srv.h" #include "fil0crypt.h" #include "ibuf0ibuf.h" #include "fts0fts.h" @@ -1998,7 +1999,7 @@ row_unlock_for_mysql( trx_id_t rec_trx_id; mtr_t mtr; - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); /* Restore the cursor position and find the record */ @@ -2888,7 +2889,7 @@ row_add_table_to_background_drop_list(table_id_t table_id) /*********************************************************************//** Reassigns the table identifier of a table. @return error code or DB_SUCCESS */ -UNIV_INTERN +static dberr_t row_mysql_table_id_reassign( /*========================*/ @@ -3585,7 +3586,7 @@ row_truncate_table_for_mysql( index = dict_table_get_next_index(index); } while (index); - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); fsp_header_init(space_id, FIL_IBD_FILE_INITIAL_SIZE, &mtr); mtr_commit(&mtr); @@ -3614,7 +3615,7 @@ row_truncate_table_for_mysql( sys_index = dict_table_get_first_index(dict_sys->sys_indexes); dict_index_copy_types(tuple, sys_index, 1); - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); btr_pcur_open_on_user_rec(sys_index, tuple, PAGE_CUR_GE, BTR_MODIFY_LEAF, &pcur, &mtr); for (;;) { @@ -3661,7 +3662,7 @@ row_truncate_table_for_mysql( a page in this mini-transaction, and the rest of this loop could latch another index page. */ mtr_commit(&mtr); - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); btr_pcur_restore_position(BTR_MODIFY_LEAF, &pcur, &mtr); } @@ -4003,6 +4004,16 @@ row_drop_table_for_mysql( ut_ad(!table->fts->add_wq); ut_ad(lock_trx_has_sys_table_locks(trx) == 0); + for (;;) { + bool retry = false; + if (dict_fts_index_syncing(table)) { + retry = true; + } + if (!retry) { + break; + } + DICT_BG_YIELD(trx); + } row_mysql_unlock_data_dictionary(trx); fts_optimize_remove_table(table); row_mysql_lock_data_dictionary(trx); diff --git a/storage/xtradb/row/row0purge.cc b/storage/xtradb/row/row0purge.cc index 333677ed..0cd09419 100644 --- a/storage/xtradb/row/row0purge.cc +++ b/storage/xtradb/row/row0purge.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 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 @@ -823,7 +823,7 @@ row_purge_parse_undo_rec( if (!(node->cmpl_info & UPD_NODE_NO_ORD_CHANGE)) { ptr = trx_undo_rec_get_partial_row( - ptr, clust_index, &node->row, + ptr, clust_index, node->update, &node->row, type == TRX_UNDO_UPD_DEL_REC, node->heap); } diff --git a/storage/xtradb/row/row0quiesce.cc b/storage/xtradb/row/row0quiesce.cc index 6c4e6adb..53b4040f 100644 --- a/storage/xtradb/row/row0quiesce.cc +++ b/storage/xtradb/row/row0quiesce.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2012, 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 @@ -237,7 +237,11 @@ row_quiesce_write_table( mach_write_to_4(ptr, col->len); ptr += sizeof(ib_uint32_t); - mach_write_to_4(ptr, col->mbminmaxlen); + /* FIXME: This will not work if mbminlen>4. + This field is also redundant, because the lengths + are a property of the character set encoding, which + in turn is encodedin prtype above. */ + mach_write_to_4(ptr, col->mbmaxlen * 5 + col->mbminlen); ptr += sizeof(ib_uint32_t); mach_write_to_4(ptr, col->ind); diff --git a/storage/xtradb/row/row0row.cc b/storage/xtradb/row/row0row.cc index 96d25e15..9bf9e718 100644 --- a/storage/xtradb/row/row0row.cc +++ b/storage/xtradb/row/row0row.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 @@ -173,7 +174,7 @@ row_build_index_entry_low( /* If a column prefix index, take only the prefix. */ if (ind_field->prefix_len) { len = dtype_get_at_most_n_mbchars( - col->prtype, col->mbminmaxlen, + col->prtype, col->mbminlen, col->mbmaxlen, ind_field->prefix_len, len, static_cast(dfield_get_data(dfield))); dfield_set_len(dfield, len); @@ -588,7 +589,8 @@ row_build_row_ref( dfield_set_len(dfield, dtype_get_at_most_n_mbchars( dtype->prtype, - dtype->mbminmaxlen, + dtype->mbminlen, + dtype->mbmaxlen, clust_col_prefix_len, len, (char*) field)); } @@ -702,7 +704,8 @@ row_build_row_ref_in_tuple( dfield_set_len(dfield, dtype_get_at_most_n_mbchars( dtype->prtype, - dtype->mbminmaxlen, + dtype->mbminlen, + dtype->mbmaxlen, clust_col_prefix_len, len, (char*) field)); } diff --git a/storage/xtradb/row/row0sel.cc b/storage/xtradb/row/row0sel.cc index 6131129d..03ae6822 100644 --- a/storage/xtradb/row/row0sel.cc +++ b/storage/xtradb/row/row0sel.cc @@ -2,7 +2,7 @@ Copyright (c) 1997, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. -Copyright (c) 2015, 2017, MariaDB Corporation. +Copyright (c) 2015, 2018, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -98,8 +98,10 @@ row_sel_sec_rec_is_for_blob( /*========================*/ ulint mtype, /*!< in: main type */ ulint prtype, /*!< in: precise type */ - ulint mbminmaxlen, /*!< in: minimum and maximum length of - a multi-byte character */ + ulint mbminlen, /*!< in: minimum length of + a character, in bytes */ + ulint mbmaxlen, /*!< in: maximum length of + a character, in bytes */ const byte* clust_field, /*!< in: the locally stored part of the clustered index column, including the BLOB pointer; the clustered @@ -138,8 +140,7 @@ row_sel_sec_rec_is_for_blob( len = btr_copy_externally_stored_field_prefix(buf, prefix_len, zip_size, - clust_field, clust_len, - NULL); + clust_field, clust_len); if (UNIV_UNLIKELY(len == 0)) { /* The BLOB was being deleted as the server crashed. @@ -150,7 +151,7 @@ row_sel_sec_rec_is_for_blob( return(FALSE); } - len = dtype_get_at_most_n_mbchars(prtype, mbminmaxlen, + len = dtype_get_at_most_n_mbchars(prtype, mbminlen, mbmaxlen, prefix_len, len, (const char*) buf); return(!cmp_data_data(mtype, prtype, buf, len, sec_field, sec_len)); @@ -234,14 +235,14 @@ row_sel_sec_rec_is_for_clust_rec( } len = dtype_get_at_most_n_mbchars( - col->prtype, col->mbminmaxlen, + col->prtype, col->mbminlen, col->mbmaxlen, ifield->prefix_len, len, (char*) clust_field); if (rec_offs_nth_extern(clust_offs, clust_pos) && len < sec_len) { if (!row_sel_sec_rec_is_for_blob( col->mtype, col->prtype, - col->mbminmaxlen, + col->mbminlen, col->mbmaxlen, clust_field, clust_len, sec_field, sec_len, ifield->prefix_len, @@ -458,7 +459,7 @@ row_sel_fetch_columns( data = btr_rec_copy_externally_stored_field( rec, offsets, dict_table_zip_size(index->table), - field_no, &len, heap, NULL); + field_no, &len, heap); /* data == NULL means that the externally stored field was not @@ -1406,7 +1407,7 @@ row_sel( /* Open a cursor to index, or restore an open cursor position */ - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); if (consistent_read && plan->unique_search && !plan->pcur_is_open && !plan->must_get_clust @@ -1447,7 +1448,7 @@ row_sel( plan_reset_cursor(plan); mtr_commit(&mtr); - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); } if (search_latch_locked) { @@ -2828,7 +2829,7 @@ row_sel_store_mysql_field_func( data = btr_rec_copy_externally_stored_field( rec, offsets, dict_table_zip_size(prebuilt->table), - field_no, &len, heap, NULL); + field_no, &len, heap); if (UNIV_UNLIKELY(!data)) { /* The externally stored field was not written @@ -3933,7 +3934,7 @@ row_search_for_mysql( } } - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); /*-------------------------------------------------------------*/ /* PHASE 2: Try fast adaptive hash index search if possible */ @@ -5159,7 +5160,7 @@ row_search_for_mysql( mtr_commit(&mtr); mtr_has_extra_clust_latch = FALSE; - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); if (sel_restore_position_for_mysql(&same_user_rec, BTR_SEARCH_LEAF, pcur, moves_up, &mtr)) { @@ -5226,7 +5227,7 @@ row_search_for_mysql( /* It was a lock wait, and it ended */ thr->lock_state = QUE_THR_LOCK_NOLOCK; - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); /* Table lock waited, go try to obtain table lock again */ diff --git a/storage/xtradb/row/row0umod.cc b/storage/xtradb/row/row0umod.cc index 2e5cc14b..bb2fc536 100644 --- a/storage/xtradb/row/row0umod.cc +++ b/storage/xtradb/row/row0umod.cc @@ -269,7 +269,7 @@ row_undo_mod_clust( pcur = &node->pcur; index = btr_cur_get_index(btr_pcur_get_btr_cur(pcur)); - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); online = dict_index_is_online_ddl(index); if (online) { @@ -298,7 +298,7 @@ row_undo_mod_clust( /* We may have to modify tree structure: do a pessimistic descent down the index tree */ - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); err = row_undo_mod_clust_low( node, &offsets, &offsets_heap, @@ -350,7 +350,7 @@ row_undo_mod_clust( if (err == DB_SUCCESS && node->rec_type == TRX_UNDO_UPD_DEL_REC) { - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); /* It is not necessary to call row_log_table, because the record is delete-marked and would thus @@ -363,7 +363,7 @@ row_undo_mod_clust( /* We may have to modify tree structure: do a pessimistic descent down the index tree */ - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); err = row_undo_mod_remove_clust_low(node, thr, &mtr, BTR_MODIFY_TREE); @@ -410,7 +410,7 @@ row_undo_mod_del_mark_or_remove_sec_low( enum row_search_result search_result; log_free_check(); - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); if (mode == BTR_MODIFY_TREE && index->space == IBUF_SPACE_ID && !dict_index_is_unique(index)) { @@ -471,7 +471,7 @@ row_undo_mod_del_mark_or_remove_sec_low( which cannot be purged yet, requires its existence. If some requires, we should delete mark the record. */ - mtr_start_trx(&mtr_vers, thr_get_trx(thr)); + mtr_start(&mtr_vers); success = btr_pcur_restore_position(BTR_SEARCH_LEAF, &(node->pcur), &mtr_vers); @@ -587,7 +587,7 @@ row_undo_mod_del_unmark_sec_and_undo_update( ut_ad(trx->id); log_free_check(); - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); if (mode == BTR_MODIFY_TREE && index->space == IBUF_SPACE_ID && !dict_index_is_unique(index)) { diff --git a/storage/xtradb/row/row0upd.cc b/storage/xtradb/row/row0upd.cc index 113d2f10..9ac72f8d 100644 --- a/storage/xtradb/row/row0upd.cc +++ b/storage/xtradb/row/row0upd.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 @@ -261,7 +262,7 @@ row_upd_check_references_constraints( DEBUG_SYNC_C("foreign_constraint_check_for_update"); - mtr_start_trx(mtr, trx); + mtr_start(mtr); if (trx->dict_operation_lock_mode == 0) { got_s_lock = TRUE; @@ -1155,7 +1156,7 @@ row_upd_ext_fetch( byte* buf = static_cast(mem_heap_alloc(heap, *len)); *len = btr_copy_externally_stored_field_prefix( - buf, *len, zip_size, data, local_len, NULL); + buf, *len, zip_size, data, local_len); /* We should never update records containing a half-deleted BLOB. */ ut_a(*len); @@ -1207,7 +1208,7 @@ row_upd_index_replace_new_col_val( } len = dtype_get_at_most_n_mbchars(col->prtype, - col->mbminmaxlen, + col->mbminlen, col->mbmaxlen, field->prefix_len, len, (const char*) data); @@ -1855,7 +1856,7 @@ row_upd_sec_index_entry( } #endif /* UNIV_DEBUG */ - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); if (*index->name == TEMP_INDEX_PREFIX) { /* The index->online_status may change if the @@ -2398,7 +2399,7 @@ row_upd_clust_rec( /* We may have to modify the tree structure: do a pessimistic descent down the index tree */ - mtr_start_trx(mtr, thr_get_trx(thr)); + mtr_start(mtr); /* NOTE: this transaction has an s-lock or x-lock on the record and therefore other transactions cannot modify the record when we have no @@ -2613,7 +2614,7 @@ row_upd_clust_step( /* We have to restore the cursor to its position */ - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); /* If the restoration does not succeed, then the same transaction has deleted the record on which the cursor was, @@ -2686,7 +2687,7 @@ row_upd_clust_step( mtr_commit(&mtr); - mtr_start_trx(&mtr, thr_get_trx(thr)); + mtr_start(&mtr); success = btr_pcur_restore_position(BTR_MODIFY_LEAF, pcur, &mtr); diff --git a/storage/xtradb/srv/srv0srv.cc b/storage/xtradb/srv/srv0srv.cc index 65a15b15..02314db6 100644 --- a/storage/xtradb/srv/srv0srv.cc +++ b/storage/xtradb/srv/srv0srv.cc @@ -82,10 +82,6 @@ Created 10/8/1995 Heikki Tuuri /* prototypes for new functions added to ha_innodb.cc */ ibool innobase_get_slow_log(); -#ifdef WITH_WSREP -extern int wsrep_debug; -extern int wsrep_trx_is_aborting(void *thd_ptr); -#endif /* The following counter is incremented whenever there is some user activity in the server */ UNIV_INTERN ulint srv_activity_count = 0; @@ -479,6 +475,9 @@ UNIV_INTERN my_bool srv_print_all_deadlocks = FALSE; /* Produce a stacktrace on long semaphore wait */ UNIV_INTERN my_bool srv_use_stacktrace = FALSE; +/** Print lock wait timeout info to mysqld stderr */ +my_bool srv_print_lock_wait_timeout_info = FALSE; + /** Enable INFORMATION_SCHEMA.innodb_cmp_per_index */ UNIV_INTERN my_bool srv_cmp_per_index_enabled = FALSE; @@ -2137,6 +2136,9 @@ srv_export_innodb_status(void) scrub_stat.page_split_failures_unknown; } + export_vars.innodb_buffered_aio_submitted = + srv_stats.n_aio_submitted; + mutex_exit(&srv_innodb_monitor_mutex); } diff --git a/storage/xtradb/trx/trx0purge.cc b/storage/xtradb/trx/trx0purge.cc index ff82bb2a..cbf78362 100644 --- a/storage/xtradb/trx/trx0purge.cc +++ b/storage/xtradb/trx/trx0purge.cc @@ -584,32 +584,6 @@ trx_purge_rseg_get_next_history_log( mutex_exit(&(rseg->mutex)); mtr_commit(&mtr); - - mutex_enter(&trx_sys->mutex); - - /* Add debug code to track history list corruption reported - on the MySQL mailing list on Nov 9, 2004. The fut0lst.cc - file-based list was corrupt. The prev node pointer was - FIL_NULL, even though the list length was over 8 million nodes! - We assume that purge truncates the history list in large - size pieces, and if we here reach the head of the list, the - list cannot be longer than 2000 000 undo logs now. */ - - if (trx_sys->rseg_history_len > 2000000) { - ut_print_timestamp(stderr); - fprintf(stderr, - " InnoDB: Warning: purge reached the" - " head of the history list,\n" - "InnoDB: but its length is still" - " reported as %lu! Make a detailed bug\n" - "InnoDB: report, and submit it" - " to https://jira.mariadb.org/\n", - (ulong) trx_sys->rseg_history_len); - ut_ad(0); - } - - mutex_exit(&trx_sys->mutex); - return; } diff --git a/storage/xtradb/trx/trx0rec.cc b/storage/xtradb/trx/trx0rec.cc index 8cd51c80..dc9b0829 100644 --- a/storage/xtradb/trx/trx0rec.cc +++ b/storage/xtradb/trx/trx0rec.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 @@ -467,7 +467,7 @@ trx_undo_page_fetch_ext( { /* Fetch the BLOB. */ ulint ext_len = btr_copy_externally_stored_field_prefix( - ext_buf, prefix_len, zip_size, field, *len, NULL); + ext_buf, prefix_len, zip_size, field, *len); /* BLOBs should always be nonempty. */ ut_a(ext_len); /* Append the BLOB pointer to the prefix. */ @@ -1076,6 +1076,7 @@ trx_undo_rec_get_partial_row( used, as we do NOT copy the data in the record! */ dict_index_t* index, /*!< in: clustered index */ + const upd_t* update, /*!< in: updated columns */ dtuple_t** row, /*!< out, own: partial row */ ibool ignore_prefix, /*!< in: flag to indicate if we expect blob prefixes in undo. Used @@ -1103,6 +1104,13 @@ trx_undo_rec_get_partial_row( ->mtype = DATA_MISSING; } + for (const upd_field_t* uf = update->fields, * const ue + = update->fields + update->n_fields; + uf != ue; uf++) { + ulint c = dict_index_get_nth_col(index, uf->field_no)->ind; + *dtuple_get_nth_field(*row, c) = uf->new_val; + } + end_ptr = ptr + mach_read_from_2(ptr); ptr += 2; @@ -1123,6 +1131,10 @@ trx_undo_rec_get_partial_row( ptr = trx_undo_rec_get_col_val(ptr, &field, &len, &orig_len); dfield = dtuple_get_nth_field(*row, col_no); + ut_ad(dfield->type.mtype == DATA_MISSING + || dict_col_type_assert_equal(col, &dfield->type)); + ut_ad(dfield->type.mtype == DATA_MISSING + || dfield->len == len); dict_col_copy_type( dict_table_get_nth_col(index->table, col_no), dfield_get_type(dfield)); @@ -1256,7 +1268,7 @@ trx_undo_report_row_operation( rseg = trx->rseg; - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); mutex_enter(&trx->undo_mutex); /* If the undo log is not assigned yet, assign one */ @@ -1333,7 +1345,7 @@ trx_undo_report_row_operation( latches, such as SYNC_FSP and SYNC_FSP_PAGE. */ mtr_commit(&mtr); - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); mutex_enter(&rseg->mutex); trx_undo_free_last_page(trx, undo, &mtr); @@ -1370,7 +1382,7 @@ trx_undo_report_row_operation( /* We have to extend the undo log by one page */ ut_ad(++loop_count < 2); - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); /* When we add a page to an undo log, this is analogous to a pessimistic insert in a B-tree, and we must reserve the diff --git a/storage/xtradb/trx/trx0roll.cc b/storage/xtradb/trx/trx0roll.cc index 9a5fcea7..1075064a 100644 --- a/storage/xtradb/trx/trx0roll.cc +++ b/storage/xtradb/trx/trx0roll.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 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 @@ -751,7 +751,8 @@ trx_roll_must_shutdown() mutex_enter(&recv_sys->mutex); if (recv_sys->report(time)) { - ulint n_trx = 0, n_rows = 0; + ulint n_trx = 0; + ulonglong n_rows = 0; for (const trx_t* t = UT_LIST_GET_FIRST(trx_sys->rw_trx_list); t != NULL; t = UT_LIST_GET_NEXT(trx_list, t)) { @@ -765,9 +766,9 @@ trx_roll_must_shutdown() } ib_logf(IB_LOG_LEVEL_INFO, "To roll back: " ULINTPF " transactions, " - ULINTPF " rows", n_trx, n_rows); + "%llu rows", n_trx, n_rows); sd_notifyf(0, "STATUS=To roll back: " ULINTPF " transactions, " - ULINTPF " rows", n_trx, n_rows); + "%llu rows", n_trx, n_rows); } mutex_exit(&recv_sys->mutex); diff --git a/storage/xtradb/trx/trx0undo.cc b/storage/xtradb/trx/trx0undo.cc index 24d14e06..0d5a0f55 100644 --- a/storage/xtradb/trx/trx0undo.cc +++ b/storage/xtradb/trx/trx0undo.cc @@ -1070,9 +1070,11 @@ Truncates an undo log from the end. This function is used during a rollback to free space from an undo log. */ UNIV_INTERN void -trx_undo_truncate_end( +trx_undo_truncate_end_func( /*=======================*/ - trx_t* trx, /*!< in: transaction whose undo log it is */ +#ifdef UNIV_DEBUG + const trx_t* trx, /*!< in: transaction whose undo log it is */ +#endif /* UNIV_DEBUG */ trx_undo_t* undo, /*!< in: undo log */ undo_no_t limit) /*!< in: all undo records with undo number >= this value should be truncated */ @@ -1087,7 +1089,7 @@ trx_undo_truncate_end( ut_ad(mutex_own(&(trx->rseg->mutex))); for (;;) { - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); trunc_here = NULL; @@ -1774,7 +1776,7 @@ trx_undo_assign_undo( ut_ad(mutex_own(&(trx->undo_mutex))); - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); mutex_enter(&rseg->mutex); diff --git a/strings/CMakeLists.txt b/strings/CMakeLists.txt index 65eeb457..2a7f0b71 100644 --- a/strings/CMakeLists.txt +++ b/strings/CMakeLists.txt @@ -34,4 +34,5 @@ ADD_DEFINITIONS(-DDISABLE_MYSQL_THREAD_H) ADD_CONVENIENCE_LIBRARY(strings ${STRINGS_SOURCES}) ADD_EXECUTABLE(conf_to_src EXCLUDE_FROM_ALL conf_to_src.c) -TARGET_LINK_LIBRARIES(conf_to_src strings) +SET_TARGET_PROPERTIES(conf_to_src PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD TRUE) +TARGET_LINK_LIBRARIES(conf_to_src mysys strings) diff --git a/support-files/mariadb.service.in b/support-files/mariadb.service.in index fe00f160..ef9fa5c2 100644 --- a/support-files/mariadb.service.in +++ b/support-files/mariadb.service.in @@ -87,7 +87,6 @@ ExecStart=@sbindir@/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITI # Unset _WSREP_START_POSITION environment variable. ExecStartPost=/bin/sh -c "systemctl unset-environment _WSREP_START_POSITION" -KillMode=process KillSignal=SIGTERM # Don't want to see an automated SIGKILL ever diff --git a/support-files/mariadb@.service.in b/support-files/mariadb@.service.in index 000724d7..465a0d94 100644 --- a/support-files/mariadb@.service.in +++ b/support-files/mariadb@.service.in @@ -108,7 +108,6 @@ ExecStart=@sbindir@/mysqld --defaults-file=@sysconf2dir@/my%I.cnf \ # Unset _WSREP_START_POSITION environment variable. ExecStartPost=/bin/sh -c "systemctl unset-environment _WSREP_START_POSITION%I" -KillMode=process KillSignal=SIGTERM # Don't want to see an automated SIGKILL ever diff --git a/support-files/mysql.server.sh b/support-files/mysql.server.sh index ed0da3cc..c9ea270a 100644 --- a/support-files/mysql.server.sh +++ b/support-files/mysql.server.sh @@ -2,7 +2,7 @@ # Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB # This file is public domain and comes with NO WARRANTY of any kind -# MySQL daemon start/stop script. +# MariaDB daemon start/stop script. # Usually this is put in /etc/init.d (at least on machines SYSV R4 based # systems) and linked to /etc/rc3.d/S99mysql and /etc/rc0.d/K01mysql. @@ -21,14 +21,14 @@ # Required-Stop: $local_fs $network $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 -# Short-Description: start and stop MySQL -# Description: MySQL is a very fast and reliable SQL database engine. +# Short-Description: start and stop MariaDB +# Description: MariaDB is a very fast and reliable SQL database engine. ### END INIT INFO -# If you install MySQL on some other places than @prefix@, then you +# 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 MySQL installation directory +# - Run this script from within the MariaDB installation directory # - Create a /etc/my.cnf file with the following information: # [mysqld] # basedir= @@ -37,11 +37,11 @@ # - Add the path to the mysql-installation-directory to the basedir variable # below. # -# If you want to affect other MySQL variables, you should make your changes -# in the /etc/my.cnf, ~/.my.cnf or other MySQL configuration files. +# If you want to affect other MariaDB variables, you should make your changes +# in the /etc/my.cnf, ~/.my.cnf or other MariaDB configuration files. # If you change base dir, you must also change datadir. These may get -# overwritten by settings in the MySQL configuration files. +# overwritten by settings in the MariaDB configuration files. basedir= datadir= @@ -291,7 +291,7 @@ case "$mode" in # Safeguard (relative paths, core dumps..) cd $basedir - echo $echo_n "Starting MySQL" + echo $echo_n "Starting MariaDB" if test -x $bindir/mysqld_safe then # Give extra arguments to mysqld with the my.cnf file. This script @@ -307,7 +307,7 @@ case "$mode" in exit $return_value else - log_failure_msg "Couldn't find MySQL server ($bindir/mysqld_safe)" + log_failure_msg "Couldn't find MariaDB server ($bindir/mysqld_safe)" fi ;; @@ -321,12 +321,12 @@ case "$mode" in if (kill -0 $mysqld_pid 2>/dev/null) then - echo $echo_n "Shutting down MySQL" + echo $echo_n "Shutting down MariaDB" kill $mysqld_pid # mysqld should remove the pid file when it exits, so wait for it. wait_for_gone $mysqld_pid "$mysqld_pid_file_path"; return_value=$? else - log_failure_msg "MySQL server process #$mysqld_pid is not running!" + log_failure_msg "MariaDB server process #$mysqld_pid is not running!" rm "$mysqld_pid_file_path" fi @@ -337,7 +337,7 @@ case "$mode" in fi exit $return_value else - log_failure_msg "MySQL server PID file could not be found!" + log_failure_msg "MariaDB server PID file could not be found!" fi ;; @@ -358,10 +358,10 @@ case "$mode" in 'reload'|'force-reload') if test -s "$mysqld_pid_file_path" ; then read mysqld_pid < "$mysqld_pid_file_path" - kill -HUP $mysqld_pid && log_success_msg "Reloading service MySQL" + kill -HUP $mysqld_pid && log_success_msg "Reloading service MariaDB" touch "$mysqld_pid_file_path" else - log_failure_msg "MySQL PID file could not be found!" + log_failure_msg "MariaDB PID file could not be found!" exit 1 fi ;; @@ -370,10 +370,10 @@ case "$mode" in if test -s "$mysqld_pid_file_path" ; then read mysqld_pid < "$mysqld_pid_file_path" if kill -0 $mysqld_pid 2>/dev/null ; then - log_success_msg "MySQL running ($mysqld_pid)" + log_success_msg "MariaDB running ($mysqld_pid)" exit 0 else - log_failure_msg "MySQL is not running, but PID file exists" + log_failure_msg "MariaDB is not running, but PID file exists" exit 1 fi else @@ -383,17 +383,17 @@ case "$mode" in # test if multiple pids exist pid_count=`echo $mysqld_pid | wc -w` if test $pid_count -gt 1 ; then - log_failure_msg "Multiple MySQL running but PID file could not be found ($mysqld_pid)" + log_failure_msg "Multiple MariaDB running but PID file could not be found ($mysqld_pid)" exit 5 elif test -z $mysqld_pid ; then if test -f "$lock_file_path" ; then - log_failure_msg "MySQL is not running, but lock file ($lock_file_path) exists" + log_failure_msg "MariaDB is not running, but lock file ($lock_file_path) exists" exit 2 fi - log_failure_msg "MySQL is not running" + log_failure_msg "MariaDB is not running" exit 3 else - log_failure_msg "MySQL is running but PID file could not be found" + log_failure_msg "MariaDB is running but PID file could not be found" exit 4 fi fi @@ -401,7 +401,7 @@ case "$mode" in 'configtest') # Safeguard (relative paths, core dumps..) cd $basedir - echo $echo_n "Testing MySQL configuration syntax" + echo $echo_n "Testing MariaDB configuration syntax" daemon=$bindir/mysqld if test -x $libexecdir/mysqld then @@ -439,7 +439,7 @@ case "$mode" in *) # usage basename=`basename "$0"` - echo "Usage: $basename {start|stop|restart|reload|force-reload|status|configtest|bootstrap} [ MySQL server options ]" + echo "Usage: $basename {start|stop|restart|reload|force-reload|status|configtest|bootstrap} [ MariaDB server options ]" exit 1 ;; esac diff --git a/unittest/mysys/base64-t.c b/unittest/mysys/base64-t.c index 45616069..a3a37976 100644 --- a/unittest/mysys/base64-t.c +++ b/unittest/mysys/base64-t.c @@ -90,6 +90,9 @@ main(int argc __attribute__((unused)),char *argv[]) diag("src length: %.8x, dst length: %.8x\n", (uint) src_len, (uint) dst_len); } + free(dst); + free(str); + free(src); } my_end(0); return exit_status(); diff --git a/win/packaging/WixUIBannerBmp.jpg b/win/packaging/WixUIBannerBmp.jpg index a04177bed9da0e5f70573f4a6a4337cb6d40128f..66256b79255d04872a1c1670124ee513402363d6 100644 GIT binary patch literal 3856 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 literal 12411 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 -- GitLab 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 3/3] 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 852eec4d..9d638481 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 c3c140bb..acbb8d21 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 b4de70a2..fa1ed701 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 7572f6f5..1788b630 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 bd70a3ac..707e56e9 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 244d28b6..f9ccf7c6 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 7973c3c7..2cbb6ae2 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 cbdd398c..5eb49577 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 897c2eb4..d4d40b0a 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 b871a70e..9753125d 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 47cb3875..a4410eba 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 5c0ec2a5..f67e52c1 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 9c84d4a6..a9c24e20 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 f851c151..95ee8d69 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 6a0b2143..fd307764 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 844a2d7b..a58b83bd 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 ef675959..673361ab 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 08852a36..fde7e163 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 0541cca8..4e902d7f 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 b5dc8b9f..9fa12738 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 a1cddbb3..df180e72 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 ac154606..aa05b361 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 c019209f..d3253348 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 6f425e94..7f0ad8a8 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 7b1dfd7a..340ad66e 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 460e0e8c..1459da2f 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 8bf1321a..5962e9ba 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 4bb314c0..8e13e878 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 15801c8a..88f50857 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 3e2b1e01..00000000 --- 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 00000000..f1068d25 --- /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 b0f0f040..e30906b5 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 91a514dd..391a3455 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 b039d83b..27a8d968 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 42924a72..544929fb 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 7e97b258..a134abb3 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 56661b03..878b4c81 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 2228e542..84f57bde 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 78940e02..07c95a79 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 407e4092..6e181a99 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 724cf6c5..e92f649b 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 0ed94b09..bd3a21f0 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 acc54398..dcfd607b 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 bef75576..4d88e992 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 110a2ee9..1c564981 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 e3aa11ee..c488aaf1 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 1dbe8c7e..fc0a3ce2 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 678ff0b7..dd55daf7 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 39b8ce18..9c67034d 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 ed758313..20c79ed4 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 e20f01fa..a726116f 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 00000000..fb94d61d --- /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 00000000..8c6357e5 --- /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 00000000..5ee57c0b --- /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 00000000..2f6c2848 --- /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 a0447280..940e081c 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 04dff714..e31f26aa 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 5fbde695..d40b0e4d 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 6f64ef45..b13d07e9 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 1ac0120a..c5ac2ab5 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 8f18b137..f8bed800 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 00000000..5985fe33 --- /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 eaec51b8..9df96f63 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 17e2dc9b..513bb2ed 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 be1f01a2..238baff5 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 00000000..4ed61701 --- /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 315aea0e..cb66ff48 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 00000000..0452b238 --- /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 927c0bcc..36d033f4 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 70b4b98b..27aafa97 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 85035982..66c5a377 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 f9f0acf7..55caabba 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 5a77ea3a..3da74d12 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 d45b6b23..904f432a 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 81446da9..fe4ee3f7 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 92af85f7..c6d96389 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 e8fbba78..0258267b 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 545d5151..1f9aa212 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 3c84134d..3d9c9bc1 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 371dffdd..2180ec2b 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 826d1f6c..38d01367 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 cf58a2dc..bdd88e12 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 00000000..fedfaf98 --- /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 f7503597..3845f119 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 07536ab0..b0cd0b75 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 2b5a5363..631dd8ea 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 3f4a26a7..d130854e 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 78cdfe6e..312b36c1 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 861b2240..a006bafc 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 176a93c7..228c1be7 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 501c379b..0dcc0de8 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 32580804..b3b83af0 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 e114f424..999f4894 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 0829c1e8..6ae282cb 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 06116a2e..6e18d16f 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 e84921bf..fdb4d8c2 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 a5fe01d6..48e77421 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 d3c5107d..791cb5ac 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 b10f175b..24140583 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 26f4b018..3ebd84ff 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 432a4fd4..46554442 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 26e7bc37..1b40a734 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 00000000..775055e8 --- /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 74370ba7..c90aaf24 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 01847006..6cb79346 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 070cc49c..e0227163 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 0eddfa70..a3754d25 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 b3405705..8dee7404 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 57d704c3..bc33c08d 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 2d0f18f1..d5a112cc 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 00000000..348681c3 --- /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 4e706151..a7e2bd9d 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 934aca92..924317db 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 df6b543b..d33f1488 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 643034f4..77dea34e 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 c8ee451c..db4ae171 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 6d9dc373..0741eb23 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 c7e04225..47970668 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 8455450e..8852a622 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 b5689d31..fc287e86 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 a61c658d..067fe9b8 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 b621fc13..df0d1623 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 88f40b2c..e8c96e49 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 4d921d1b..5ac3bd3e 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 4e4fd89d..51fc7a8c 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 94ed922a..1ed78a9e 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 227b8cc3..a491b084 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 15c2a410..ce73b808 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 06f4abab..406460d0 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 dd2b0255..4d15098d 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 3f3a2afb..7d63f47d 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 2f2cc025..53ca0845 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 e12dad6d..ed578d80 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 dcbe1f5a..1ea706db 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 00000000..06f1c986 --- /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 ec92825a..14933e52 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 d08a6e94..a2a4f25b 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 ab958004..1c834113 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 a0b7596d..658b7dc2 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 66546872..9d61770f 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 52ee442c..0c312f1f 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 14d88614..0c52bfe3 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 cb69f22f..4a81dae5 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 9feaacc4..54471ae3 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 38f36076..6ade8d6e 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 dd4ee51b..cb644012 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 07a2b162..6ea05288 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 15964654..69de4f0f 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 e55e2ade..68d831fc 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 00000000..24e00a00 --- /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 ea6bd65d..fe132c0c 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 192233a5..29c762a5 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 8f098607..60afb603 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 00000000..7010d2c1 --- /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 00000000..2b90f474 --- /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 34dcbdf5..5232bcb5 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 56ce31f5..2250dd20 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 27729924..52802b17 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 2a7e61ee..7e413b9a 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 8057a026..20926458 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 7e42c864..d307ce4b 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 b67dea0f..397ad22d 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 f68fe524..00000000 --- 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 d5490280..00000000 --- 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 761a1a89..aeab7e6e 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 cbd2c1c8..16af5742 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 81ba54aa..3a49f4f6 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 bae37755..0b96de55 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 b8dd0fda..44a1513f 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 1a65ef1b..6c09b0ce 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 00000000..0dd693f2 --- /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 00000000..726fc6e2 --- /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 00000000..0dd693f2 --- /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 c61bad8e..d7f665df 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 4ee3d178..57af9203 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 9d1c3e56..c9c00698 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 a79ba598..4666d131 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 9bdb61c1..34874198 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 00000000..05399b21 --- /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 28a6f1ac..459a6103 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 00000000..6a07d035 --- /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 e96d39ae..06de9ccf 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 3978a3df..23679244 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 28c3f4dd..5c5fdabf 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 00000000..63f6c281 --- /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 9f5cbdd7..a5b87c0e 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 40f3f1c0..58a9d3f5 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 788d6005..a7ce7c6c 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 db3c75e2..cdcebdb4 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 16e9037a..0d40ac16 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 00000000..677ed982 --- /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 3b10815c..0b19ef7d 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 00000000..edf20da9 --- /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 00000000..efedb1b4 --- /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 00000000..cec0f21e --- /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 00000000..a7ed54af --- /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 5c0d9a45..2369c1d6 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 227e1c15..074481af 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 00000000..323a0a92 --- /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 df2d9190..cec0f21e 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 00000000..2692482f --- /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 df2d9190..cec0f21e 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 357a0d4f..ebddb4c4 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 81781fbe..1726bb64 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 c1bb0659..b9b00cfe 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 7c56e22e..8245cdf6 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 f141b332..5a108ddf 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 cf36e964..a9c900d8 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 00000000..5958e6ae --- /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 f4d17ad9..22a3105a 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 2340d25d..70f3b8ee 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 06fc27ae..5bde4874 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 00000000..c55610fd --- /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 3b8aee61..0c91e10a 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 4617d595..ec6c4a6e 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 fc647a20..3e8cfdb4 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 da57b9d0..7ecaff77 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 f5c0fabc..1822201f 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 361743f1..5cdb751a 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 7add82f1..5e17baa1 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 08deb317..1b2e322f 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 d9f9a787..bf045832 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 79d8951a..9572489e 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 00000000..df4fa35a --- /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 55a3fd57..09f444fd 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 00000000..3c8490b6 --- /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 93f9224b..49f3c993 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 30ce9bc4..cd7621bf 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 24c29778..13e48f8f 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 f0dcf8e4..6c4e8be6 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 32fc2409..facc5180 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 00000000..0f7f80b7 --- /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 00000000..c42c3dbd --- /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 5a1fb674..a084db15 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 768f4ea4..24acd9ec 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 3bfcdc9f..08165f30 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 ae1e0d8b..80d3a5cb 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 5329dc24..8b5aaaae 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 8ef87452..19bfd8e1 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 a9ff8c41..f60d5549 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 8b399e77..c44b0642 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 1903df44..41063788 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 bd581842..2745bfe5 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 551307b1..73c5fc16 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 00000000..b6f601c5 --- /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 00000000..d32d7e75 --- /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 41cd0c8e..2cd84012 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 84fd3a91..f24ca5cd 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 00000000..93e24244 --- /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 00000000..336296e9 --- /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 00000000..bcb9ade3 --- /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 0b717159..835fac94 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 e108484b..44e5573b 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 c813e041..0dbc63b5 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 c6823795..5c08707e 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 31bd1af0..3abf2549 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 4573f176..db2b706b 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 47cb3e02..0025b259 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 aac68221..c270e4d0 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 969516f5..63d05104 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 24d9589d..2f685ca7 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 aa4543cf..6f0f8014 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 1f446938..9f161afc 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 821f7a6e..dbd2510c 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 00000000..0a036108 --- /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 d65a35be..ee31be94 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 03706bbb..6d99d35c 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 cba8488b..1f01c4aa 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 3353652d..22e98e3a 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 00000000..6859855c --- /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 bf4da323..142f0254 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 5e56800c..0afda948 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 3c7988a4..ecf255f5 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 360681d7..c570dd7d 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 769bb665..7daa5446 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 acc7c735..351e457f 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 5af86fb2..11ef6416 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 381f9bb4..33a2b157 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 1464222a..7e0d282e 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 a87f19ac..03236a3c 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 c118b748..d69881aa 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 c71dc53e..25c72965 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 89dec29f..c9cffba3 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 2ef617c3..06797ed6 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 00000000..54685f91 --- /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 00000000..68091190 --- /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 00000000..4bce2f86 --- /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 99f6efe9..9d266c68 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 00000000..1f4f78ee --- /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 00000000..6ba83f04 --- /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 00000000..bb23b782 --- /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 00000000..35aa402e --- /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 00000000..4e90922d --- /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 00000000..981188f0 --- /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 e9711b2a..2769bfdf 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 fadbcce3..d41df53e 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 eca77972..5d2101d8 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 18f7fb5e..19d0a875 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 74cfa9bc..824b671e 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 00000000..0210ced9 --- /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 7d6133ad..29b0127f 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 3f594f79..07e58f44 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 00000000..d949ac94 --- /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 00000000..6bbabc8d --- /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 00000000..593bcae4 --- /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 861461dd..47398c1c 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 00000000..49ce3254 --- /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 00000000..5ebd6753 --- /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 00000000..f0883802 --- /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 00000000..03e6ec38 --- /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 00000000..0f433b1f --- /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 00000000..e0981abf --- /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 00000000..202ecee6 --- /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 00000000..c16ca068 --- /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 bb5cdee0..d039459f 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 af754827..0d3cc6f1 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 775d52c9..17fd194d 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 b4085228..85a257a1 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 1cc6c917..34b18294 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 532ec294..0186c24e 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 61a09375..cfc6f3c3 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 454333d6..c52a58fc 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 00000000..8dbad90d --- /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 9cc7742f..061bf35c 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 00000000..bf76a5de --- /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 00000000..402cbeba --- /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 28b80cd3..42d98ca3 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 00000000..695c0915 --- /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 00000000..242a0340 --- /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 fe767476..ae23b93d 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 09571313..58f36be0 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 fe3d7992..e961d0ca 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 584a8a5d..2695df64 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 53d739fe..282b588c 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 e8ba98f1..e9bac78f 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 1a7daf5a..c63688dd 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 abca4865..09672cdf 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 00000000..1e87010e --- /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 00000000..f8a1e98c --- /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 90250568..1c9d6b18 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 57447a18..4f3d4e80 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 8078687d..f4d7f3d3 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 27e9a45f..17dfb803 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 00000000..52b6b743 --- /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 00000000..fe211e71 --- /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 00000000..6717f16d --- /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 00000000..6e59da6d --- /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 00000000..e858c834 --- /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 00000000..01b1d91e --- /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 00000000..96d3e2a5 --- /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 00000000..8adeb18e --- /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 0d4929d9..ac69169a 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 6424ba28..5a223cf6 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 29076a3c..87c113a2 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 fd09c0bd..5f1f882d 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 41af6af7..4098ebba 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 d7a77e5e..40551154 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 e21f0dfa..e0b92563 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 b2bd0e72..7e984921 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 35dc2d5e..31448c7a 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 31e4bc9f..69e1ddb2 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 4416b78d..56eb6fe6 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 00000000..9bc62426 --- /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 3bf5ef3b..a76e04ea 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 0ced7954..96a5d10d 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 00000000..073a41e9 --- /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 00000000..d08ea9d3 --- /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 3971504b..5c355b34 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 00000000..5aacef31 --- /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 9be0d555..4af1ed88 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 00000000..5cedea51 --- /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 328c3c34..7efb1f71 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 0177e65b..a6da3399 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 95167311..1618ee31 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 00000000..4762ac8d --- /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 cb702ad6..7efb1f71 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 00000000..ac499157 --- /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 41fb6ebb..28bf4a77 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 00000000..2f6da180 --- /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 00000000..971b8b9d --- /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 708342b0..f9b2c034 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 9419f251..d3de7707 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 a57fc129..65439e3a 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 0a2757c5..dafdde75 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 161f740d..05bb199a 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 f851dfcc..7f046a18 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 5bc6a6e1..72550ffb 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 0c206975..db932ae8 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 4c635783..bc373003 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 6db52eb8..3e1fb6ca 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 00000000..f9aabf49 --- /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 5bf5d9c8..a97256d8 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 462e83d9..c3eec59b 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 00000000..c3f0d3bd --- /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 00000000..c3f0d3bd --- /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 9e50cbf8..59f69c14 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 966fd278..fa1da2ae 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 62d7f624..4ecc1ca3 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 1769f567..1315f090 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 5cb33516..420f733a 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 00000000..401e7bf9 --- /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 20989e70..c2d44c08 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 00000000..299b605b --- /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 abf470b6..c1441d21 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 1ee48eed..3455b043 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 e21cd1f0..0055a2f2 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 e013109d..be17eb46 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 77ace195..af4c1690 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 2c93f75c..7807d1a9 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 e563e65e..c3b3440d 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 5f279783..e7e2b96f 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 ffb7838e..2509f55c 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 b3143ecb..46b4dc2e 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 bc553e6f..38082213 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 a8ddf350..51d59844 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 a40fd2af..f0721b3e 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 00000000..55b09232 --- /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 1bbde3e7..dadeaca3 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 bcd87c26..385e372b 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 acbe19b5..34b0551a 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 4dbe1309..668d3b74 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 78f0e2ec..6cfaf9fc 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 fe259b37..7380e7a3 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 62260ba4..77baa695 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 49fe9c33..670dfd1a 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 30069561..fc2ae849 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 60a129c3..8fba5750 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 fca334a7..aacb812c 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 c49c4ab3..81115d59 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 b2eb101a..60f41042 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 fec5df1a..4a61cebd 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 e27db9c4..1aba207f 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 f7008f57..e1e8dfee 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 00000000..e09a2bf4 --- /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 a55bc845..67732d5b 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 3e60f242..cf12bdae 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 6e19fd88..9d43245d 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 23715166..e44a853e 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 4b2230ea..467d3b5a 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 3f08e2e1..0463885e 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 00000000..de22a5a4 --- /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 d4ccbcf6..d5a40419 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 9c7c9683..bf5de741 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 f90f1e2e..623e4143 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 cfb6c8c2..0665cdf6 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 ff6f38b7..a6d4107e 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 27679b9e..10b75f27 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 6e29b849..fc91c530 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 8f29528a..45832732 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 68adc6e1..6ff226d7 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 34639ef3..9b005799 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 7354b169..5e407e9c 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 1c5a4152..53edfc5d 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 a0ddc3e4..56b1ae3f 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 82043dc0..b82792fc 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 2358aed8..5c4e3314 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 06f6a29e..8580fac3 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 291657ca..eb9b1a44 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 590a7542..7b53195f 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 20998407..8865734f 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 dd9071a8..f6ef7fd7 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 36be07cb..09b4ad36 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 39100591..37f61644 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 718a1850..dcdef6a9 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 39100591..37f61644 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 667a45ed..d4d78926 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 1a916693..9b9da46f 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 bc09ced3..f333381d 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 fa84d924..93256d32 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 249edbe8..2bad74b0 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 317f7454..a406be96 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 7b404a71..a76d6bfc 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 08c6f39a..8ba4dc4d 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 28561a93..c94008c3 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 811bbefc..61ed8d9d 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 bab989ca..090e1e1c 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 e62be946..c03ea12b 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 00000000..446c64d0 --- /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 00000000..b49db3c0 --- /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 00000000..122b3d3f --- /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 00000000..bd6befc5 --- /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 00000000..13a0762a --- /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 00000000..afbbe2b0 --- /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 00000000..c64ef3b3 --- /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 0a266ab1..b5f6e996 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 880458c1..b994c9f6 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 a8f671de..e160bf5c 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 9e3fc542..549161aa 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 35824735..faa3f106 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 64dd182e..00efdaee 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 867aab62..5bf380a8 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 da18a0fd..b1c2d9cf 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 7369dcd1..a0d05af3 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 cb81e98a..b7b26397 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 9bc1fcbf..64c51677 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 b2a00e48..1027a8b1 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 68de7563..a047f276 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 2cc45dc6..e23829c7 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 a9b8006c..139ce40b 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 4e2e5bd4..6ffd582c 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 076e6da9..03f234ad 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 0700d71a..05a34a9a 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 1209fc5c..3219c813 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 97f75c4b..8c6edaca 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 cd47257a..db1ba152 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 e19efd31..49faed2f 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 7dbaf313..b275f749 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 0e2e9f07..b4e31ba0 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 4a94c3a5..44105bd4 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 29f8c563..bcfaf517 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 81bc6836..e70d97c5 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 abd48977..d2b4470b 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 56515d42..86fc5fa3 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 ae314d82..f26a437a 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 120b4c10..e0f6ed4d 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 36de05e5..9bb60809 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 0de9d7a9..5bf5e3f7 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 0725d862..97ecf889 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 d7371fa7..89338928 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 14f301e2..df0a733f 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 cf86ecf1..203969d6 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 52be5e14..d73a22c8 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 da394ff7..6fe6de68 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 2e268e48..a5a14ec8 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 8bf78d97..0d24ed04 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 07b0715d..a5c91b49 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 98584ec4..be23cd33 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 bff45e08..f17931ae 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 098e99e8..68299d02 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 01f40bb2..c2bf37a1 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 c73ea374..74154184 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 e3b7b31b..0a95d2e2 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 91030145..fb3604b8 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 d3ef2452..abb234ab 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 946cf13e..0cd214d8 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 bc067b66..453d7ffd 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 ac6bee05..82107f9b 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 662fa33d..5a022ba7 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 0a9ce00c..e103c3b3 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 3fa5ec71..085ad1a4 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 4fcd090e..3b47b1d2 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 4dd8d9e1..89b5adff 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 da9721df..602a3e8d 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 13e5f166..65c76127 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 e850677f..1ac9e748 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 d57137b3..7e4be9ae 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 b515578e..92d2b1c6 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 ef3dd680..e30060c8 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 35222bce..4c164a3a 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 b5cca334..569c3d2c 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 067c7120..c52f74fb 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 5a78a27a..bbf2cb30 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 1e8e9593..b7ccbb5c 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 20772adc..c22e3318 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 44df4bba..3c914635 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 2e2c5932..6323538f 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 70e9b36c..d9999e2a 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 c08c75f7..8a70e6f6 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 1bdc76a6..6bd6b6a7 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 99944f1a..caac1c42 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 1d380ce0..fcfc6343 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 30363393..5470acc7 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 ea0bc8f5..4407d631 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 5abb99cd..bf9b5508 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 bed5f416..7df2ad7d 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 e5c95780..723804c7 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 690c1a4b..28bd3a44 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 75c1526c..e5c754a9 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 285bb520..b127d3a8 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 fd68fab9..272e4ac4 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 119f17c2..b00bfda1 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 94804a6d..4df96949 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 7b73273b..eb26da61 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 ad1f4ec0..216bab0c 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 55eb2fbc..53952173 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 1b15fa16..e87bc70a 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 6842319b..d70757e8 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 e283da97..6e8c8baf 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 aaf1b7bf..afa54fa4 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 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 delta 37949 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 diff --git a/storage/connect/JdbcInterface.java b/storage/connect/JdbcInterface.java index a1b1360e..72ee4ab0 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 adce0616..9f611eeb 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 639edf63..cd1785b4 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 802095f2..76c9d09a 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 8ac7be80..737c74c1 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 0c234dfb..9029e616 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 44fac561..edee1874 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 2ffe51d2..a9cf43f3 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 5e80201f..39123b18 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 13f325d8..670131b8 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 e24e1083..ba8eb829 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 84dff422..6e71e1bf 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 44abd962..893e3da0 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 1d6194b1..0a98ec5b 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 df366ef1..880db54c 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 c456ee9e..7c222eb3 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 871613cb..244acfdc 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 dfd9343a..e76dc496 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 079128f9..469cd90d 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 a8d48a5d..729b1b88 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 e4b00786..472d0940 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 5964b1d0..af329c0c 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 96ae0a67..c039a980 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 90f834ef..d1be0ca1 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 4c21c2c9..ddbc3115 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 56f318d2..0c36ccca 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 c7115cdd..30f62791 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 4736641e..1731ccbe 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 b86d2da2..98a4659c 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 37553221..dcc97287 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 33af95a2..794a84f2 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 cd3b9768..23e8c0e1 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 700d247d..9b30b315 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 b9600bda..f95f3adc 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 088dc2d2..53e2bf37 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 bb77512b..cc8f75b2 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 fe00f6a1..253c42bb 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 6d77d79d..7969672d 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 783d86e6..1a90132d 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 a301e027..4c5fc94f 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 8adc006a..550e94f2 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 7d81ca5e..09544bb1 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 0c009d61..d0819619 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 c7aadcf1..132bb34c 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 708b6f1c..67c67653 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 672d9f15..665178bd 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 e07fc098..9633f358 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 00000000..4c59a3b0 --- /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 za;ufmKhhLmv`Du%g}{{2_k}@bLnKGi!?*Rv*Qc^H^8Iq}V%S?O#hbXBUVE}|aZVgz zA3pYAadz}rvi-gr%^+LI!iF-qn+>GT{lQaqkhQ8Xl|sh5ELy(>fy+Nt2>V6u5}0Tq z0P3o`A#7KtWRYm?2u4eHG!Fn<0A}{KG0MrJY`Q(A4xJj>szeAkizEOVsILtM zDwRr$YV(Cv5h%XiMD!|RU<&M5-CZW?#0pfJEIb$XxZF>sftF0|jSFDMf$(3bB98~+ zq<;2swF0U_G2a$-#fF-S*dquN(kd*%aqJaXv7GgDjf{&_%t^q=&oyEfUL+dj$J?%0yyj!Qp z6U>#~Le)wVuc}}&oDd*UJKIHfCoAE(v$C?VwHMQ}Dg*#`JH-{9xiKEJm}dZwS5F5_ zaREU#@Z_j9C(L%qWPrm_gacd0AY%p_1q3^Y9HfA|`2M{oJ9&0tR@O?wo_$Y92HY;e z&=`2vIo&G6fd+n?TSvcpEuzsfS-K9TZdt%z-ogaRl9Iy`tqBOmwUXRTa9+69K;x)h z!l|Q?H!l-kbAZ8a#dS&-Fy$BH$AOU_1?w73pKBVbP8F7eANkN(2)7LptXs6OeX-G-jiPyU zyal;hjACDbKn1urBQP>Px(FJo5H`i7OoI$lCC6Ua+21QO#5Cz9p`8%>M13AP96ORd z7DRHku>Ga4985ZwrS_t`m4L5+(=u+xafMNd=$KAgg5i=xGC_H1NQ0R$B2JSO5$VGt z!Pf0T&r2ZFrJO9SvwgbB))}u56r_s;#Ck(i<)7jkuaA#vxi+#gB;Y}Dh!<_%Brxj zizkXj89p4rrs|E?Zv%z?JYwFpP%p=d(ji`xMp)OP94fX)y2emX3~5cqfTzwuF+9Ty z*8mK8H!DI;5}DF0NvC4scr%A$Lh6M@*Ad-;L%wG54eUHQ)16zSOPt-C_t{_eT|w`H zZw*%OMkpS8ni8XeO2Z}+PHmc(?j3^N+9i0lhOdZ+uabh$KUxfQAk^(b0P~w{9D}!E zm@N?`F@cZ%;>Yb@;`M-2uWa)L1G+mtn*-cR41@e8>;^E+5#c4L>~7+hF8H386@^i? zR;T`iUSrGeMBAS2=WUIim9$Xjvi;$8(&ObRKQpWZqAx1ya|f*qJ9J;4Qdrk_1Y4+f z$`)-@x-ECrOW)&cJu2a zNqixzEkv;-7VH2cDQb^wAvE9KDFH&+|9kLbmlBu;dm_!b-vwkm00Qj+?J%ZN5F$)J z)Td8q@ki|lGV@xbQ?#G6L6N5CEFa)^78*DYeb$04SVC95M8vdWkhYhvSnm#)&THIr zdMWp5qDA>js9VOCsZC65S)Onw;~$8dA2ICh+_q#14Gq48PtM!&EfUudn*?!0-J?Gv z5*VDXT;E^gOqs`G-c{f&Bk>C| zbK_6_cfBq!)^Nuo77@xlX-W)J^B`^5UN|cSqxX$dJZb_m5{z{NhSo%>VY28d;#z-( zZ?qn3CT=@E(R5=Dmp-kS^bi3ULfv2~Q-9XgjIZ;U&4|L0CrCKGxyEZRprozR=*5Sc z!F~GFGtN*P7<#M!rbnb38GK-pncTI`uJT;Tg2(br#9h}u^N@zI`Jq@Op^{X90s<(6 zeAYIGE`i0D=ANvbiO)U5VV6S63h&N6p%FG3o7u?D7C`OhIO5@7vBUoe*RO5$ zxI_Xbg_Iv<6(I%#!%9{jR}`(nwqa-$?SzsHnnj_yV-{zGd0CO&9;Pwwc>#k#$B)e{ zE*M2{t`mSjkp=5Jqe%!5ZhW7*|2-n06icHv0qyGtYHxgn{NQoJCnI-8UejyGB4e6U zr^R|g*a~5X5hQ+~B_xOU`Qh<4Ms`KDJaMq3XYdtCC4-4tKG{otlq|!pr2EhRQkUa0 z8{s^^h&NltT(CXXAESX+gYEP`J7q%mGgw+JuG#VNZ)^Q(?_u5%*C#D^!u1xH{fPOa(HlJHXyyC)aS?4 zfcpJtKitytOTV$|4y2Y3f%TJ5UAm6i|N8m+lb)TMz$4pr{%2GJSD4D$pz0nJwjbQm z94{)2irB;|!#r%Kcb94%PngqMR)7Chi99-v^%?km)8Eng|Gw#~*#BQc1Yh4b{ri_s z^ehN#1SBbmtP&j*ugQ}PqVNwxH^hG`kwyQhL{2;$AqPcl#c0J|?)C8Q(a5Lic$2b9jCaNK!W$eX~1Sa+t|5yYJ8G?iS78@uz=V?yzf~^cym)Jp%H_r=PHkD@hy0ul&Mxd?~o|-34E=86qn5Q9OtAWv3vqF=0P+qaj82 zn%(|6dPBz^iwj+9eru7dLW_B96cynNNNIJO==|V_8U30iHP&5@*!PMR)YPQ~(|6AN`GcO#a)r`Fw#$ngdTt-JcRyW<&Qawu_Nn$7bf`apu0LvV> z4Fv2G&5{$`nGhVl5G-Kdg9I>xe7a@rbX2$(@~E~}|4A8kJN#YaQr8H-gMN{B57F~t{6PKIOy8?JS<8O=WKZ!;|Nfl2 z>h)CdaJlV|XsxEbSbZ34#+`U?12jiYcg}gAi8DTJO#KhK-Z410Z`=BfZQHh1?5x;X zv2EK=Y}>|)ZQD*(Y}-y&ZvOk6bKiURyKmL3S+iz6Pu2V|szz_4xBhGH&7m_iQ1cOc zam_~itGM3HkTZhY>%@_=tr3Flh=?;QM8-A-MsIZm(Vn*!JK)5#X5`B$-e?e{pHywl z4^g~-is-$Qv@65~38C^WoJX4lIYc%;1ohfKs-JKr>WEch#0L+NLE270t^y4tGzG;5 zh2H_Aebas;K;mjjviwDJyxlelZ{QYxw&OGRx8-B(5=-X|fI#M-%+dTcAp>zeA=k3h zYvivr*&6ft987$gfSJEq=|?#u14a!pxHj&w>giOr^8`1iyNdDWaOe?f`KpXJzPO7iTRIg|; z*PwM8hw-`_N;iJJ)0X`F@uDcf5(o@TVefkpI{6vsd<*8|?WgA>4*}ec)(xcUq|X}xDOGzY0rRVfIiF}uD$n5S}t%r;$SVY{#%f z%~ai`H*1Gt+*(<)PWWIEBNw{yw=xpg4qp)E%94Y7PlrxjdJo`z+!oR& zl!qyEL2miViO?unM5qrlF@Pa*>1J-sC(+eT5Q&T`n(Fl&INM7gp10ioN*RZx-l7g2?!|c%t-9s061WSs+WC!C^fzc4WUw<|W zn>og!gYsWC19I9MWCI8<0PtGqlv4E%Ge}QjIjzNUnx4rf+Z7aPojDxVA{!^FBL4E><5n%C1?NAxq*Cz|DQ7WG1jRiv>;q zfm)S3$r;i#Sw`*RWcWTs+yc(P4-4C%j#?~_9COn-N^D1OC4<=_i&7vHfs-9|%hf=j zkrE3R9g#>&wdzp@pQE&7@P2giGpU)1QU@1uA37+&mxRU z?p#p<|7KD+7k)tjz)gBc;%RWYnFZ*?sIX>wz9l@i6263Lh9xY+NOINJ0imw_k*sG* zNO@e2Fdmonh>&^3C_D)BTv&YuG$U#;nsN!oFEkr#N3%F)Cp&A~$i!=ypRxJ;{#k8%pIj|6Q@fKg+kLYnIlEq0BVmu=j`A=X*IS5s7;or zpQgg*b{w}Y!s%nJPIZlT$yAh&JdU0n!L*??fjjLIZH(cv$pP@DxN1IVJ9R5|} zu0X)>E0~_DyM$@?n!NTWevufE6Vh^BkCavu`d`Q1RYEm%hQ=V_Hm2c1Wb7n$mT&VZ zFZD6*^o#esfHK7WJ|=eFw?fliP*DLyYt(%br?lTcT;o?{ozm@X%mXKi5S7Etr9$i* z%bcjJUBT#@7z5Zc%d#* zOT`N{A_xr3Mg}<5fm4gxOyZ~+&tTL7_O61}V+IA{0PQmfEM?b_brPtg#}r|iv$)F1 zu8wmiYxIP=I8c>qjM!)e!z@_Myjv7()Wc(^=;HZ}L;5zR8h;TinV*{?l` zfb|Dj2k>kdfdOgB?1F-pB4aZ%d0Ga<^jg({aZ|5D;0x!136Mu?R7X$@ZDbfrHjI$= zqv}!oP?|PC;Ux>|g;r3~7sZN7NxLxl{E*IsH;y)WZNoWQkLhi!q14KLDF zlH(Ya@#-GFrc384uYbx!N(^Q_>Ep$9rZQGH1VCh>lamCr2YJGJQWDL`StrFKm@W1v zGT%#tRY`V?PvhdH%z|c{P@F3aZH;j@2E4GKc9hwB&NVTkisbyU!ratrXFxdZ&y={Z#|JzMgRpi1aDcLouK^3WiTYX)JIZ96lC6PX(KWV zfIi~SW8h9KSBZb_U1@F&J+^eOTSz68ypp#@ru!Jb%eg|a@t@QoerAj-du=D#DiKyJ z3X;8ZStZ)vwK(5!tI|x+ql%}L&`)XAAL?R*csh$iNcfEp2S(^pPXaBTF+D$eG8*nR zDicn=n7n5k2%)u!XIuP?%|hX$n>BbdIIk3$T$w=hTl%r6yM**R?-p+QpKjZ_R{cgUK)t2&%uYB(XjffuA$Hej}U=vEfB z{llw8EYmMsXb{o4hK=@Ez-k|JnBJ1$ufF|6M8dK2A4FGT zzYtO=o(f79$=maD#uUD(qGm$9E~-u%$ZHzNlx!}Ly6=EJjp9WOfcUY%QMVgbfttB8 zeG(y5`fpG0N@{OqI$IdXU|W=^gtY!2861KwKJb5R24JRBMXy4WJkOCx6vW*y8Y4L^ zoF+hxrh9upe_*fNF!SmCHCQc3$M;1?`~T_%lHKHOmP)0lpJ7tSiqkn|ePVC#C7E3n z95!<{cx9O#Pwh_tDpc$oC_+KauI$GHqbz~tnb5BjWZ$P^O2k8aP+w=)X*a9`O+6&U z2o&S%rrpIS;Sc9xBuOT&x{5pOxEN{-uWe`|Rib<1I?_GYwPmuW6$*_@Ut6O-v43=s zlMd?D3uulL3Mw(bc%BnFB25)42dk=#d%K!Um?@~Pt`NxrR8-RMv!V}HjO5o3@x_{UOmv!rUumCQ55;;;Axf^~|^87himH}vPq+fa%>G}p1D$Mq09l0Z%hfoT9LG(8PO1j}!3kOXnz(E10=_X_7lL{*A$JzNOIaR*pZ5ZJM0Aa-GpdS#G@Yo)X z?8+Msw<(DZqUz-*9Lr@U4fQ<7`MQOFt{OMOmN#YJG`) zl5^z&0vt1)G*)jEy!TPjixzfR)b2*3FSug!m{D1anNx2rPuXNfc32kR4tNi++i_Hc z^v?-DgN=r+C6m+O`^B{z5dgQ=Jl z)o;P!iS@w+Q52Hq5iDrQ1)OKOi=P^_J6_# z{y&*yNqTl`OlU*f@6@)Ri~NH}@+0jrL{$phB{BK&mTL>fD5H?l<29yPRMoOoyX`NdW4hOIN4?*uB~cCmru?K`fma4-ed?8z-V8($_Qd9b z4t%lUvqJH(IZOT0`N4;}#!TzI^m@0GMfQtDrH!|R3tSL|#AB&9;a27@dAC=Un_ONC zevuX+RbuxxDtSmbBE6A=GsOVyp(49R%r)^bQ(~y1B^{a0)@SltF9|2x?3-H`mMA&U z#8lmIT}v2EEIy9as1m6?2JRM?4hMT>2615K@k(uISQ}4ats4Ut?yGuBujm2~V#5Rj zEv+F?+eLG+DmkjsqHa)HWtpsPs$EB7Uf|fyAEsw`{u>dQX$s>60C|9=Ce3&|b9%_( z&bbmTrtdlxl3E2=mMoxwmT*=}+;j5{LROtGFMW*NKwDM<-Hm~Q)mCxz+1}tguP8>P zua1VZdFK?LAb6BMGGHAZ{*{!Y#VIN`X;>uEKR$KfnkB~F166~i&C@TQ8}->>UV9Il zW=7?lI2Jj?*3O-#whmBg^n}5AJtU=JA<_x#)sSdvG3z_>S9px+0zT?VCu34EU@C33H$-HGT9z5yB2d;F^4dzNjuO`))IgTXn3o>uRvOk1O(PzzSCLT!)@2xsP()aj?}x| z!2Yvh^}IP^Ex)6~xFP<1#pXf$UvTRGS+V~sKuq1j?t2vcGe@uQ3>Y8sHyMxZLOR(K zQC%W?;Nn>1rUw?9sGxLXu~-TlnaxPr7y$5`uxL7AGk+-JkEKBu!RxlGgW&N{30TGb zba9c|irLbMt9YiwJmxc8tp>dJxX!q|7k2yJ&RaB(hApTEvB((Wv|XL{lBg1ycro9Vi_?_!sH0S8+lELx*-a!^VMwON*U@r6YBzfNw_yqXdS3$vrA2X`k z@Tdu!#w-b4Zr0Fqyjx)On4n&-zE-F*PPcbj8biLCt&Bs6!kDMcwCW+i-2f2HHl`x| z^O%s%D!pg17mLpbW01^xm@j}_lpkWFJon_$s-M-EojOgx)y=)l=lJMYC?#W7Y4obE zD#=-H#i8}I#UByb{{l#{$8ez|RzpSw{%11f;fJNCusYd}^?V)P$P^%AH6|nfz_pSX zfwcO@J#Cx?$+A+Mo}{$}qEweNH)x5E1rca310IL+@0oO(&c-l42;rF80pTOOz-|y* z!C)blFv8kyP~FTG17)*zrZG&ipA-N0XN3cP>Vf;|5Sz*ehHQmR65r zY~=vnhi~Z%ERLs8phJ#i&$fdOx=OIX9@*DfXyg^4pTHtNH2AHE&@tBs&liV}Y>WcA~Q&=FSye zr(rwRud8176oB(jMn?;m;#T*dnIzy zWCy|llxInq;_0@vJ0xfuF*oU-`PHShn83t9@bYejX zMX2LmbP<}%a9IwbU0S~tUOR0OkI`e>c9i8C$;~FAZ~%SF5pkYBd{P{b3>+Frnda%P zjtdd}6u68Qs8}LrZeM}VK`@Hh$zn8~FbJe8HawK!k-6oL?m%cB@aVv2QX6hyPxZ1R zdH9T(xb(>;d{GpT|0_cbJJek9RzX+0itsJbpi?vqp|6)F0wxN-dTOM+0j!i<8j=*{ zJVFH!);M~9tTJkLv!z+X^TJGoZjdMFaoc|JK7QX-O$R0|9WZq0yYR~{rf$Zw#eg@M zf7hW5g1m& zGk7ekMCn4T%{yf!GTa4n*$viQAlCQibl%jFdRW%Th!u;`$8FI8)2cZZk>Eh*{~wK zf)=AqDw2Guuoc5+5g>?gb}LZxOck<+{I8$!IHr4Izrt`uteUa4>1y|l1L~uUVhbf` zXBTSD+qXoh>7kgZFh~Db-G3UpTyZp?)PM+NrA3`N>(f;@shEq`c|xWcGM;BAHy!S>H)m&YY?pgm|y zn>n*sS-O0*B>C~=G*ysmX+`kkRUd<04c*Xyq&ey;VvNwnYe-0$wGue|JlV;1>6UQI z*WNYZr8-205gHA_!`b6vW*Pwibc;(I2l8*0|l{+vHzJikZbi{0bzn+8x2@!KGY zV^|5}9QykX@hhMaAlfs9BcX0DHvi0kJgCmxY#BR_a6`Jh1bIebVHMoyA(2%}$oE@= zIMd?1-$<|EgXv@?y2R2{bchoXUD*N&qwTeNW>(0Kl-Aj~M4L^)afpBbNV)z(!_H0MCBDqzn!;J2U^|l;2;u!aKYqjteB}&Y@la3h+jc)4*CE% zvV>%LAuE{2yN9q%vPL=pWLlDbVPz5e8;%%aGDx-Dh7keWE(DGZVGb(QJE={q$A~iO zOJL396{n(z6N@nOu@g#8oqsJ@l$8s=+3F;GL;HcZSgmc8s4H?&-={F6=n2CL-d3Qu zkfoLa8Z_ksN%qqjK2=)fRC@dPiJ8X^+^IOCT;m+QSTFp^NiyyL7S=?8>ncJNzUu|M zXBF&yTwWKhR28+Ug^0qud5T|@qsi6y!xh(%a2kl?gmNiLK8 zkvJdITF#z1p7vfwc0BP+y^@F>P_v~9GL*{$J=eGT3bsjP$kdx9CT)fXk4!7d059qx(mRQQ=%;Kdxo=o#-CD0eMMkz`Bk!3DySRuSX0&sA-s%R} z#wF6mUa)1@8G;&>Pzya(c?4Yjk^>^&Tz6CDB-EPSOpMiN;#MnA-vDHPm`vgV_pfEDILHxk7mtC04SvYNx?NC8Fp|5R+%R@##<-{&hgM;%nv zHPf$bVk3l|!^4oB#0LYAr{K_XSj1mm){kR;R~rnXFOo?~QU0K!yC&;y#m613tw@y& zAmw`2*rAOLP;o?4N8+fMHfkh3r{CEhLQGpuoyHJGu}uGc{oyHm*|l5`xCyCxZEDs=1=DNM{#WU6P%}CDpn>+d=|#b zJxBSPket#Kpg2m9Y}eq~&~6*iCD_;VYE`KsU&A7CR{&}%{~@b3f9gBmJfe_+;< zG7D;r(GY|fTnJM7>MYH$AJ*uT%{j&_b~;iL(oYAh;e5dty%Md`Ub06OqgPh0F{5n( zXK+HFf&eC@2{lKf^9x&%C#%4pi08P`)vS?zFsg=u}SgiB}FkNUL^=+^zNJ zvtBZ=X#ONA4HjN_Y>31Wz3CpW;R{lg2uqSFhU*37u{Ce#JY&gkhtpi+=H zQ4+r3f5e60B9HZ}g2xsAtp>4fA|XHKt87UU9|Krk6nVRz1{vbh!3%Ei3}2_2563;W zJvhK4HzDLyWKX^xL?NiF*bA33O+8Qs+8uQ>Gir11nhuI;v@C!1f24W*ZTCi*aBqPQ z5iH^SNea1WHu{GJQhyokSD>vSKqLv|k{u!euL!J%CZ}oDjX=X}yKnh)X>PH{K(jcx z918&T(*0+pt1gKRQ+Rv^1f6JI%vEjXh9uo(S4JJCP?*A7ptZW$X7 z2?P{K{$D%%|C@xBm_Le7^1p+yjO>g}jQ%|j%i!_H9>y|4A65Df=EfVRYBWFF=|~2tb^X%N+cz`R96Fc7nS;b}{;U zmz1==0t*nOgTvddk70x}d?++;wbDo&8_crKB)-;oN?wYE_#1N=nx9vK=^hd9v(%m&W_u(Quc zK@~L@(t_pqB=^`>pHNtwC4n`{rDv*NgCx1^zPpn=7P(Bh>>{xNWPwa4!76B#XAbNo z-=EEMgu&IytFzsL7LP$>57B7r&XhhGM`hduXx7;Dj0}9Cdy(RNJP!%8^`?1C5`zdA zl%mg~4HA0Gay<{R&|Lje0{P{dAhI0I&Q5Bz>&PBe->G1}WQo+bX%Tam^IFP;^Zo|% zqVDO$o$uy^xej5wi{mdpXg4ZwhwH1Js{AqQqTnNw6+H$LtJ~6^Oql)~1a(}f>I|6> zFh{s7*(Fz=d5-P)0f&!pZWh2E1@R&(?^gE7{DhLyVs+X>l)7G{Ful)gw@e57XntW2 z!n2CVCv4A$6;`#>vCOAIl9>GiD6VP8#sw|O3%B5VW<#lt*@V>c`jA&i)cf z&YR`H{OIvTWbLUhSyq#B&{iiQGH@FKv3jp#Jk1~2!ABfww#D9kH%e&Aa33ZM;4rdF z(KsR~f);;xKs}_E5=Z0Y87ylWB4j8ui*PYgN%@$Z7abs(#JK10naYjt{hDYm<*D7k%wu6%2`zSK6p>aP` zhYKY<;LlOg#YH>zq9TlwFHuTog=##8dw2_CxCD5n88S9rqQ8-H%76DW`oqIvqHe5; zL~srs&v_>Zce)jW%s$L1+WG|j=o}m_);Auj0t^Gx@knsCU-Nk6%<1O~Z-w=!-xhw8H3j3ay{CxufF6;-n@OLmw zP%)Q_U!CPxnykyuVN8k^#Vu67>9-QC70Y^m?f(cuURkPN$x~Zrx2Sy_b{_B_qDzx) zSZ9T#>-95~m$J`J&J!o)>*VaL%iaRF{z)@hx^~RxXhTy20Dgx9AcMXnp2WF|$k7@G zY6sS~{DO^J^%=R384-+Li4Z#EPIo9Y#A}*%337*^6>~VA2j3vl8NqBcW~E{~7KpWANZKB^U%jQ8S{XG!Y5{buBS9qj4=U z{J!nf4v!2O#*JdO+{Pb8|9d2;uq;lVUArV0h zXE6-H)ePzr{cXxMWd7#^>b_U>wcEO6FA_$o`$W)Udhr(^!xG8Wf%6iPIBBZVIUGsq z8Dkt#A887_r4A1r!A`DgJc?T4USG$??UB22$UM!=W}I#;=*IbkhXYCl-(FnLgv3vb zoZg+ep9s!exb!a2IweV6*On*g)r76ODxg}YDXENITcMXkzUi-4r$_&9fpcA)8Q}=% zzN67-VcRpn3WD&D)i5s?%C2!|C8cD*`n2vG{=yeV1=$U z5SidpW+8qPu5L~mdG);{@^wC0`wTP4OZM+c9z+Qr)sVn3_QPScu=TJEv3-WxsKZOU zAx>JC3^b-;iCN`3`b)6%FV!;nxhA-WGz8eB#xhkvZJs<=;;9X?rE?!tlujCP5VyWQ zR1FHz??<_<+AQKkdJK%PO4VcevvT8|W5cq%9ciLZ6C$i@?l|>8BOwY37G|6=wO_Xr zq_^Iu*P4z_maFw|syRIF%D|y=xAVK?+{G9wYZsEH$RI3S_;Bc&!e>4>^12uOC1bps znc3WcyPPFt10=7ytaHVR3@w=xJHxL*>hrb$lef9=bgzD((a)%BZEnsuxF{JPx$*hP zC-%_-C;oz$U`AFe**l+^cTRQBtqf!IWB70VoF?3G;#8@;Cm)6z)E zW;@Ac?C~+A8UW2O)Fh44LEhpwr%u6z-8q!Z6B)N_aH~G9+d0{P2G z`H+%ri!Mc4Dm+=}0+I+$P&>{spfl!!4#it{Y0#4>b!2Cy`LWvpY<^H2c;hZI0m|f@ zi-WUL)kY?Y#^dn%hY;#`HFt)V4-u=kJaWN@y12dsx6$ z`KVZu*-Ke{`vfny?t$>x%QX0#-q!7@aAxOVITH6-L0$!XofFuHOpp5*Mo83*ag*IVWH z8{2@1kmO;=Hz-JFRg$0q4!^Rtp9Hy>q?urW?w-9a-I~HQA?tDGN1_8@v~%f~B92VO z$#qtrrt&pYkIayXRHjQohGheesfCSd0$t@)xmUR)s)tW1yMWgfnMvY!du9INvWud~ z#IItKS$##3UwA3agf=eN=UG;YTF)-L&s5-}n&%?4z;BIK=)dk&2C#V*=g&e0RK7zo zWi{;6N+Z?SaBc-9F0IZ0KjyiyAMw5Y0-+0(wUWNEXAHbVN0=oHioa%lh8ju1G^p?9 zWTNElWQ00uCWNv~CC$++bvWPM>F;M!F4Ha}g2KGj)p{oY4XwM^@9ogOEsx%cHnsLh zOO$c))}_@CkN?%Rd^OCV#DK5lYyJopjkL&7XY&?@$+yIw`+g0;pob#;)1@KCBzj9{ zi2w5UE&+HB6&5r2GOQu5CCZw43N@15LA^0bedUYmCkWVORk=FRAm2}El058@-uqbi z#e3L2gAs^Vr@%s^_nn7}x>)!h=RAKW$xN3DUIIk(`@t`K5%&(yTdUT=@B=vJNJ9szGX85 zs4>> zUA}_%_ZmKkclRs1f_U5U&oW#vW!cMc<&FZ5q_b2?)qEXc)uKG`ywQX+FYqs}^}=Ml zXI`Z?{j)`L-?v9cHuYJBCjMZR%1XA6RH_9&CZ95ZlZfFy`Uj>$DvbZkqRa2|C@}Ju zaqzw1IA(AIuzV^Yj?-O4^>o^YlSmV|NCK5@ofKMXt(kWl?J>K} z5&&-MU$(1Sll7|mkDAjGU)*KrLMptZZlIr=o+~_pY_a0L@L_vzcNB4{9R8i1&c9zJ#NdNdhZr$n>zoZ9)0k z&JEZE@?g=w98YmtY}S5}(SGqvnGYp_0Iip3X z2FOa{kMXm42C*f$*6upb&#j)@PboUDU8+0%@x(H9lgI+v{Nb`Tle53m)E%d*87=-{ zB;eS?g`02KanTJUe=`zTZ$KllOB2A0c)kyrq2W<-7yoQN+wPyQ16nG`!X?d^Cv8{~ zodX2h^y?qXoU{S4Y2PjG=6CL#SqC2`7@|mf*X4fSy{J* zO(L&U$_kzw3U)z&A-6F-rJv|wiP(2#?CG;lFNYC)%h9i~=opkGCIg3+h!F4h$L}H7 ze$=l)cfvu3@k?H8r(DSLEM;NX)R^9zAjUWcGvH4Z0`f-g;qSMN?VyGZBVQoG8EYjD z=n}WO&7mr7;+uGHslUqGH>gh%^itjtmIr&58%zi*Q=&D1r(A_af9U-@UHY++3xSHF zC6dR-B|I))v82Ec?b(Q1q@J`x-(`NTb?Wo=j=WbgjD%tSiN~&y zZrKx1l}9c>VjDjzaP)x?3OOEy!-bo;+wB4OW&L(Gn(E*;6hY^y}rN+uKAC@LL3pA1lrDR7KM>qJCF#|)s_3dnCG`?Ef?R+b1yY~M+X^h z%+v$#>(tLK+Vu)VRwg3fpTR(U(qhNXAZI3sDgYTuopBxWmXHv0l2{Dtp%y0crI8bK z_BJkv(=mTneF5lqDS7A|Sx%VbDb84(JvxdOOh;lN6qTLf_#p_e()>7Tzk6pC8yuF& z;=l|)Zh2u>9nAgRxVy5*lF8LBrYRh}SGD{K^XU1qXo`Sf&oB0g7iJll zL|{K&2al`u{%b88Pw2HRu&V3JZ+6s$0o5J=cAuYfL0^?jWx`=p4-gM-RjCQDIa)*a z_SsVl_W2Dx|0wN8t2;Ad*555D^nRz1-D+$MO3A~tWPC|&nL zo~IFjfEy3|y75vkYpZ>EIb#6GB~}6gkUVQJ?p9L#8HM-j%0?EneYQZtll8-~p@m4U zFqRXa;_BpNMc$*9h}xYt0nsMq!+}<orFrMCicl|I{9qb}CO%0OSw)sIl~O zljX|JP|Z>K35IR4ELFIqz<`#l8X7i5Rk2A2kqIVl`3EI4tZ6MqXi$3<#iES#m-4{G z8VY?)qKK#x0!ltW*7S=gl!en?HBi3GjqWS3jA84JubNiq=c%MZW&@auOn(j+pbDc= zqe9*IvYc)#n8^igjyj`~p|#kK2Do>iSnlo_?)<6z)o%>~N zzF^Xdb)`tK<*&*WFM2vyG`k zXxwAS+~itHC?S>DcHoxMG_W4b>O@(uOsg$)MA^jLtAWd&;jh$>8@f3z&P}V9v0YuW z*v2Ch?lf!Gt4XYTgbX#aXNC&PTLkt>AysbKqZJ&=A3YhL{e3)J`i1k$X=@OkN;tzf zJ|*M^y!yNVWedC2hcsanJl|akB#=ITk^2fbi2JQFgxDD2r9Fe)(T009^2=D2(soagr{cArx9(@JKf^Kc^1Yn zoYvOSp@^bh@K_fihO;zqsU~}9(3mBP4^XAv&AC?GVE)tK+6m9qB5wOU9f)J!>KhfX zx_~zn$lg6dwLY0!RpAZ|F6|j(Eqh29obt`%D+26QDXn?Z419kmpDU1~P!$oP7)QmW z`P(9ZAy7Ve!RX~zOhPgYj;Ll#y;)J7u&@nK5s6sn8gbTB728Rpc*!X{tf%I#8Vvh- z>zqlfL!TR-c2*0IS}p=NrdrYG>4o+6*>b|QdWgr_GmS{_s?t)P1#c~mq|60~Z(g{I zBi+ZUWQg^O$p)Og1jlY34t*&wLWt-b6iW>Nsp7BfCob4|#rCXSiCXd7olJXJn^-MF z(fwa%D6#-HgdM$pTO#4eh5B^)tk7IjWbkvL4snN_i?!B%>oyaRil01Wkm(hX z3`B5b{qkZ`F&1$J{-h-XlVR8Hj(+`%+U}ad^(xxd@KT-8B$)b^x2CUiMu)cGnYWez zIkT?r-pYb_1>uUS3{W#s>OkkioVAhpc!N(EGFLk^0XN{fpsizwat-z@JRyHTxxa>M3pvD?i;a;BZbi+I zS4>upH)7P(p+ToO)*)^3bwJ%L7M>9xzsDS5I)UgSSY{oh(~V6mPtZ-uY_u_8!$430 z&%pNj7#k&eA}wJ#e&ee1YQm-*+R$<6&EEJGO@_pNG_xo4XOiVxC`3{TjM&6Fd=TKHE`&S=5-b(qx`_zK zK%Yrhcw92%8C$M@51JT+Qbi*+vgpQwVa|J7UW7=&^e6R#!!cSLQJAns@xvUBdI<-c zLKr3N4h6wfQf%ReXi%mvVaPR;W&H*&@s*tNqk$={d1!^+3Pw2XCoF_s_2+1Rqa{s49l;pYa`nIf`@CA##dsb? z4GRY|SWU0@8Jdt($R-8-#YzqjM&Y0~D6S>U>EWHv`OWrQ>F<~JS{Wsn@mEM?<=y?{ zuO^RWkl>#Lj18XNVE}TZU+OdH>_lp~!R#uMeXAAwhH^K(9dY8LkF*gv!^A5*0rgXW z>N2ZCaHwudaHFv`(jyTClNzDL8ilUW+%9+zSFfZ$Mvf}xvyaLxIl@f@=NVH}iS61n zcGF>w+-zC_X5rd~pnLfeg{c(h3QnSYnpQK?HxK7L$elFz!m)9yyysWac;A zTH4#=beaQAjsQSXHXth3KU2SBW={`k+)7SNf+pLNn6OlON7r-^JP~c*xF2x5W}Htn ze59JaGS1xT?jdfu{Zk4E=vg zqW|&V{2y<6Q=+UqE;CZd^+!Y>CFjaCq^w0o^dba^a*~*d;?l3f%FxO_tJ3DgIDnp) z8)-qnc-g$Az{PFnOeZT3H}5<97+`vOm*vY7zM*4gSq+sa>7MWt`q=ChpwZya&#g0> z&7=!%5Vvg+LvQyD>Qk;y>RS zXDA5UFbb7{rdSYXvjdLfOp+J$ia{`_DWTP?n3`QbUDLONRq5ZU-G^zA$Kf{}Y5-vJ zUiQCV$Mej-dKb&CvuD%aN+>uj_UN^IadYqy8bmTW%e; zgch;8VTmoQFZQ5D6S!EPEt(DVtD~OP=DT zQG=yykitXI6{XcJR`=!!!b~Zv-Gd8VShe$vAWES*R-Iw>3+rX`oRZ@_M@KSMu;aa2 zoi%E&YF8z{ss73bq&HZR&wa`#WDgS{>zz8s+Lns*U_HkE;D7lSumG`CxrX%HQ*H|O z?;8C7zrp)I3+{hg%YE$D*-^g)a`(z1Pw?^*vRY+Z$e!XjB{PX#?iRNQc&Q@%Qp}|z z={&xzMxQ)gFyIr^{IC5AH>dYP(EVSar%W$9_&{hiI0@d=FZRe|o6^kU zh|+OK6$0e`r5qN2Y)a)9!017d<(FtMplwX? z<49J1E?RBX%%9?|1Mj{3(HfxB=7(4(&b#I$VZF+Bz>LAPV&A?&=|^M$gkm6U zJnU`l{yX=)R6~)*?T@JA>|CTCI~i1ID5J3uXow#n*DRUPSP|C5Z8tGKYf+rE2hMP7 zuaIwniLs!q-F|(K@DFmnTzs!-H5vNiKu{|0(_TJC!5k}dkJ|W+DW3C< zG~3?T;!uMz_4dAf@N6#mlD)xzbxAc-;EaOFL;qQyHyNq&bHegF9)~#IT@Vm*BJyBa z&LSKmm{?3qw91~P6mu@#KA%vde?a9VE2mpyb1upp2;ee>o;N~H>WAFeyniZVMI593 zriQ%eLmd&iDOE4cE%$Zk_)DKLb{<=zVu8m><6;MD`9PmeR*e7rYKY|7qQg$Czz!_; z9}8A95L=JCb$}xHJs~r{kM1(iWC2I^*zeo1zUz|--^v%0lTMK1N8O6Y=GUiCj_Kpg z5y>XgMF81HfLTLI0dq#Ne@vWM_UsT%;sjf(EDOdwe^t~^(Fi4EsF=_*-d#3JPIeZz zSV2#;##R?nYYW){B?SYO0_GH%wX^qI;|*&M-p&7queS_}v+K6CaYAr+cY-@X8@E7k zC%C)&9oz}7!9BPHcXxN!;O?5QpZDEz_CBY+u2t2&?&^PC)pN}?#vB(AC}FlUC}cHD z9NjMSQ~63@24k&Cmi5m_ZA$SdB;mspdLdbMdiIa44G!$eP``oWuzo-^^ID0yM#`;7t9tXKuV6I_&TEFo%4CzgvaUX8uA@KQHG-%A}_z-Zf7v} zOwRiJE?D~@1f-$t-GnPWAa7sWyi-oxzoTJbNo^Eu_;tP z%z(>k^L#~!0;5wTau(FoXjA~9$m(q%Z{M#(DzEfWomrE$m4O4qUn!h+>Cs`CzprKD z@$g&Bnk$Kfe!of3;Os{{zpRKmw6q}+>Znf9Qjjd?FWBwsWrdIbv|095-JX|YG z4Ros9c5>?7+6?&q(ED&HRHv~YG;x%%_A;F&>Q`?mFf=V&=S0WV*+$|t#3uLA11%;#%Y9vTTbusj4@%K6Svz#!Ifn743Q6>40U zBN59$n_m}^9t*aLRe5*q8aBSx{nY7QJdCHVn&Ej;3R9FaMeVsg$dDa*bW2D!dB+qA z9w{`}Fjg0xD@IEK!Z;5K=E#HMsUH{n=ebJ+KhV+~x{eXDl5uLmw87Qg)1L-Bv;%$2 zJQNv&c&)(Zh!Ee#;*zD6B{^XQO+?ihqU`W{trG!6w7hb;g-3bx68U<8#(}Ufs>8Qz z^XFP+#GB7wGy1tN?x)|i;ea_phlYqpF4fe7hfd4SsIHhfzn-KA5-fXa@;i;hYMq4@ zp#3!W3cm`Y24^NO_V_nchAfxI?6*!H-5EH%=ON&~UEf;X;1d8E_yiCz|9uRO zVMJlYrOX&LJfR+6ncun|SxgD0UVPQYWSG*De@9^8$*5ds`_Cto}}FFa}AWjydABH^ym`Iw-2*~uHBU3=?x=={)s&h(n_ZwQBW-w~(OPA*Aq}b4}Ej(*44>h%&tu z@>}TZ2)WAepkAnQ)vE^USB~M5^UoU6lG6;aMwO$rQ-_JiXw-qW;bu{ON(vWK9p8y2 zCG8V~P6qq#SqJ!GNSGG)+;5Oc*=VBa5b*xsO4yf#iTUvp@pRyfz>)*Hq8qNibuX(j z3RbD@TD6P@%_pcN;b%r@p1C%5prIK+a|FpMuWC9<0MY|q`tSqmr;+sa_qd% zM~{cb-0603Xd+N97(GDT7`zRF(vTC2*(iDf*5R@wHGRV1ub;<~d*zl5zQI)57_qc? zQ=nI6d3j!hB32W5Cj2`SX1i7KK~Vi6b&x2is-)osDaF2l{5%2r&bu8n+?yC(rSmJgKX-iHije1|=w zvyhF&gi-{$Mh+#nD%8B=RW54W#3Gi}nIpkTelZt{#+la^=RNneKQFd__Z>3jSq)Sx z)lT7l-NUVBL<_st_brfCJuup;;+4;Gil6_$ZfYefZWAWCoffpmcBEuhsh)N_Y|Hi|!E9)a{zK^_tk9f$pKM_Jou zVQ`2+p-lC{nr+owE2YhRcXSvn%%`=5__^lYSmAdv)JM&O@pu`h@%(Q91n!Jt?A6gt z5j+)f!A)>Fw-DbYv5_Y=r!Z<}N}uQa#wIZ9b#rEY;Cur(s_)|Ogk>9eFF0`yMDnuY z&y;X{CN;GphF?_b5&dcYQ)x?jLlA1%P$g56Xp+COZXkk6EiWQT@ zPI9wFJl}Z%vECrR+#gT8ac#L^+c)dIoi(KFH25IU0%KR62}ZE*W%-9Vv%eak&%u`C z4Gv)=KE_9B6?lAM<&FJB@Y}3=ZiqP%yFMhLkFJ`cUGh|~t_HNe1n)V^MAr~mM7rP6 zfS1;wzNkpT9EvB2$k>LZ=|Nw8Sqqn&TWP)yy50w7f1SP=nWOEOC_F-7IF@1jRdbg& zW`*i(-3-EFpI;K;Oo*-4J6I7xP~n=Re7n&<2h|e(m}{$}-WQq-`;faS9!Ku%nn@96 z9ce}4(6Z&YYZ7&Q8c!mjWF;m{Txsp1*x!=VC)+H-`mMG9$KrwEE(xxDWn|5|_&W1c z?Tk8r{RMfa_&fChx{mQWKFGeAEfw26Y&k~JI4U9az(?n+8+5fTR5w#~GMlRZ$iKqCxrI4rkmBPe~l37sDarnSpfU*!3Bpy2`A5UmixC7QR$Dst*V7pl~YK2SQX{ z;LoajO{cLZGx=T?{v>y0q2T;-#ztDJ-c6p}%{kj6U*vodjeohMix&~vw&8Fa3{Nlq zW_R>1wY=06ZZ5GZJn;#aA*SB^<5wt{AD9O1|>;HOb{w zuBMvn>JavQoqnCRQN!q$QgvJnq(L!Ylhm&y`J_TyP_|yd?DqrG(bQ(ERW81kQ63;iTQWjVcXGia-<&7Qo9yHEz3rL8 zkpI+TjJMe}25>E=C;fLV{x3K7KeaeTtsMrR{C^fCf z?El0Sih3#-+L|glxLDfT{Rbgj*H?v*2lH>XVy?cKHb>wE1ZF&h8!0PQE_5n9zi&~( zunBk?Slzk9S+SP5al2KxHU50woDg1m24BGTN@itVcIE9X(ns+5s2-RAJh`z!o*4!gAV&f>=l-+qQ=}#|_?M62$W%D997oCT zm~D21b2_}>^TYdS<~>tKKqw`wR<;-Mr3x&ZTVaER^DE1#Djmiyuy8KOafytmDNcPO z?JoIVfO#CuTzb010-T-wczMa7LXrjx=bh8vPtOz1G~j=~1-5JKm9LY7^9EV|Eu3Hd zI;~>Mo~tm!lg1gcGUqnJalBJmk3X$b#URCS7oqGndDA;^y`vtXYQELl{nFRIcsA=m z@JN2AV5Z?Rq)oX72V&@DJq%UDsy&wQ>7h`rdpOl|@&SB1JohZ%BvT;{kCWjMN9BJ& zX*9b30%s29P6jGc8TqYaIQ`*ZGmzI759pKps_`KbiDIElr{T=xuMC0>m-H9C#+9Y0 z@?gTNxUp-|T-P!Q@x2LWRo{E?)DTe`{MK%2;Bm-?4fZM=$pM`Ik0`T$jfl5NG58%S zuZaF!EF=_K>fKA#_7BDa7fo4&mkNu1fWs@VH z<(D??3jV_4uY-amlmz~sfg=a~zF3HFslw;dN@ue?^Y1FY|iH z7OoN$_OKtewI2O^@9R`bUxBLAy3~d^e&8Pqa5`ueT~Objfk;a#3E9%l%IJH14+Tu~ z!taGl2EBF8SwHaVaOn6)JFsJ&K-l0Ap%?yRy}6 z6ds2S|D~%xQEM<1RU$QvoO?_^@&yHSpyiKR(v ztg{efPe>tqu$CS;va|e=Z2X5rzXb=LfC1Hj5_^u3h(`{=d{7nTSLQ+?Enr6g<3w?6 zm#MY{bFLRFEBCCLmE_9%;|q?0t*U{z#iz^}3gN#$&7UxDbtGU0e;CGRAi)e_;2w00 z3vOBk(R`RD54b&hRcPlM80vrP3lw_Pv-gu5Nj8pS`8E{Km0SUbeocAv_nCze^cR-o zLKsU!#HCn}AQH6S4!gO{xC-djI!~@pENm!L+#9|0mmMsGj?WiZnc}Ixq5RR2RXU1> z*07W=ls_y;iO|~e6K@Rv2OsW9O@bqUhBu!!d0A?NKfWeF)gxJ`wvm_fFMPPNKgXbX z7$+DXerX7_n$;ORG@pfth4NRYn^oDPdVXgc%#Gi2Ru2$LF!KT&*-xf~K0m0&KCF_W z44dn~!)Z87ps9Wrj-xHdl`N-d7&1q@ce8_LFIE)1uz{KjtH2Aii-#q~KB;%Lgc?Cy zVhf>7u>+?FDt)Vt?**p_W+=%XqhMXQ)YexR1vA7BJF*yhw`$SXF8zlN=;gQ$7?T>X-}Dz9eNhmdpV3P0VCucb+^>}~!WTJ9 z21pbT0xsd&Yz%U*o4s95UqG)g>a?5FCpO5+k zce!`8z|s#)EdG3oe4atW#ZUA21 z!9qjFW0uh^*UVrdVi1e?MSr;gv(pcRYpt>6c}q_eOmnv7ZOe(-HeS2N;UmX`)Hz&g z!PLCEq4eH66r<94O~~AuroeSPpCs7?Y6oL#k1}&WQ^sKr$xW{P2YpnIeWAcqq;yg+ zJT#7D5-l$JkZK+TbP%!VR~WZYgK~#JJ{HwbF)3XzKitzvdtErKY&PUuq-$uvuD^I% zpn=j4(GV2<4{1w7eO6T8Y{ywp7e))eIbz(;5RX}zc=l|wAv4ji$WtplCavgN-jI!O z%%-LQ?p2m>ZlG4i6rbgRRx9IH4qCL|_$cTt6$5w%cY`13S#2#6YXzKCNl89eLp>G_ zk06q(<33>Gc(NpopI!*g-wQtpcp7t_Kd(^>qLkm}#$HRylHMwhtB!7pbVDh|UfAbp z_4Z-X%?_XxjC(1eNgb*gK56ayAxC)t+IaP>zuXG z`_0dDk)FALY}wh`CeZPezvaGQnDsa|!)n~I!&QQRQ6Y(e`SAUw#L$)GB=m|33?`@r zhLEbId7`?Y7bcBr0 z_f@r)22a~Wn&JNVel@Hkuc5iI-yxY9f68l8u@6n{es>R7jMaByj8U!)5IivI|J*Ea z(q@}Ep|$lERgG7cvXUL+Pr7`2oq$y_u~xS>yrnwA(3tSO-a*)~oZT6|E=0);0ITe7 z6-b~Mz=*_h#fuDXyS}#7GYtFBtD2&ubEjlf`yKe7-w4Y->70Jx{n==4&TZ_Qfo~F( z9NP_-e%YSV4g0Of4-Vus4|4<+iP+XtzQ`rf%Gcy)$;B$;^lH`yn#8P)ZhIplZlUIX4og3o{1fM?vPwo zUe0yMWUla7WeDTEfO%An`U|J*-Ogsh`o2p3jLDIXvE)UH1cz_ZLA#7OPbs*ZrJy7ydw*NW>^W0X{|Sj zd5(oJKWQuT3-gAmRRW_Mg1B9ofJSeX*;rYxuW-ym4u4FhBS?AqVFs}nJ^FBp=z+`6 zeCxRHH9BDe=vBTyj#HiOW$HXvc317^10f738PK#Vp;B{h~YX__52-r}4jx5`ewR~|T|XyL3$Frx+}zY!GeEi&D7hR6U&&NIg@+9^+)lVjkg zgtGW3a+^?7dJo>{U6&qP?vR{|#fy+x`tTlJ#9O*YuHXNA2i}lgyME^kd*L^FMkU!v73YFaP*Yn7YDGKkAxLDuop!nV-0=-gpstIn-c(xLlU>>RrR@ z#YIek5EH*!hK;XCR7H|BI81%hUG+!S@0H^9P5X(V*7JFQy4e$O@^qB_7m(fWn76`C zPVsd0x86*&1zFRcp@{DwUu#1cSE7^87H{41Sl0X*D*^Aijyavwd&h2Qu0aE>U|F;4 zZMin}qK%sve3WV#>v!ug#XwN65o9GE`*B*Zy;c_mLz-zEiI!V z?@b95JoaFIwUwWA9GW1LK7}8Ed`m=4Y{01h${IFfxJE0qL-EBeTS^p)b|ft0k+!P211gX9>`ENz6DgwyoR(XY32xSJvGTWduQ#=` z`3&5J!Lt|8{4lEq@Qggxh?O^!4O2N2D~mrp%!qx{^%jJVzF698;36A98-&ODiz9nm zr=LB&*;hI!TDB}t0%Yr`kSkFbz#DxLE54;XxSbEGu&Xn;2tEs;4CQx7pMCElxq_Gt z7nA5-WQ2vL8Nc5#*(eOO{s+1qx-uwsJ-@*AmtYU+391jk^z3;y>|-zr^?^0Iz`=`+ z6S`}wqZi4y@9%TUU`#8~thi4a#$fR`Mxst(cL=>LWzh_0#X~x9ON?(33+7*EBrem; z9Z_;xlAGGF)%chX%P$?^^w}s6>I^lW=JD+gmj!Re5?*QkO!B-8Im?~bQ4~mBhAW%O@-8| z(?e(AG15&t;kvPRUNXqV8q8Zf%8d(Jg59NG*O4hm)Fe>(%6zUKYHzJ(ZB zFNgo9quFvnPhdL4;EBTwy~oDiKRHCY5~*XK54VPknVroCaA_y`Zc@ezhj~DUdVZ3^`+3GhWjra-tYmvm2 z%9hH<7Ug}dR%@S-gKNibZ zT|KT6>9OZ?8K*h3JXE5GnzLu`U5f$lm-qVB4(iMY4UIuCENyL)W(adpi@+8~hrPGO zamR|9Z5#DfhSW!|02A61PMv6h%u|JKHHBwQ)+u-5V3D z`y!d!-Z{GEpLd=|s=r(2hI80H*{L=7f0K4h(;74w;g!mbHOOU-l_+Awz;8V>u8C8% zosmoZLx)YLsl%MZGc>RDpa-=6HXz+Jr|1v*HTT&i?|LXCZnMAwvk0{_nXjZpbRm8% zcWQ&1JK<>B-he$V*eXTv6Lf5EHl4k;4pEpPZ`r9WsZk(1fE_zsZ%=LvIJ4_h;`i%- z@lwWxqd|UskJ%;YV6vXf~4$uczh*O~*8!ttX=a>=-8`bqvWz4Uyo9X-8qk;PJ})ng{-!zH`SFJ*zlT9fR;wQ#tHTHD*1D znmJrBQk&-=q_zpW+Vb$HJhaj zMSa0bW6NFs>e9}Ow(!%2;z_x;kK@x+MRwDspZ$T+pC>pOom+~O- zkWyI6nqZrJ998VXWcGLTIhv4*#^s=<|Jh~7cpQycq`$Nv)0UfgHr3~a!qxyQ=oRfO zG6{p*)wt9FK;(PSrqE-W;Iw5)+WMh~zaJSn<7AvxRH0{U!4z4hi6LKIjS(an<$-j~ zD1BQ>_BQp>XlFVBIt-Gt!qmWg;r9m&Gpan@T%|D3((9H3HEvW5IT7)zvn2u}y*wk$f z*DcDp0e>hBWeta_JF4)aUsghC*7Sl!*RjiGyB3+?UHnGR zwbe(%E~nwS^<|Z%uvR<8{^YcF&&=F)>6>f6u9In-NB_?a*6jM$^?S8i9Ek1W{GLukAE7>nADSNI+_ZinL>762e_jv7nTG!fbe8An)+x?T?_SeD7*HtpA z7BGElbTZRAh;~-0F}J&jm6U!Pie3j(oJ{rB2>K5D951G7Nk~b@2P5!bdfX-|v=Y|hfoBJVk< za|kxdD{PyotJx?h+%j7UlEsRCxkAf=0NJWN>L>V6Z~I}1c92`6yM82O3u6(?^rt%E zmvgasUc}ebC&y;CL$<)Bol>j5Q@JrVAquz95cJ40Qi7Cyo-mcu0WighsAavb(@o)atLKCldEHZh+^_w|xyVT|L)Y|0|bqP1wcF2CPg3}BO?&pn3 z-(giS8%55?qf-jf-Bf7;gyz?Jn_k%eixt z8WEIdbN}0tH+&bMa@JcZ{V1Q@L$;UWk0<{Fl7&Y|zcJY$xiN+fbVp1VB@aGr+-oiT zTjrrk1Bg$aODK_ee=KTj>PlkPZ~KnTeN?O-sGWm-{%k;Jk`+b2o{vB=&*N2pvNZ9oSU)OTFq|z z{&^`z5iVN8sJGDop-Ad zJK(-qA6U5$XtQS2sjr^42(_?D5e2e*hO@;P-Oir{1vc3GqtjE6HUh#F-{iNg*Pyby z6(PMbvTN1<1L0JwC7-C&A*D5LH5lf8fqDL){J+!M3L>+r>1Kr{DK6 zwL6EG!-z7))>iI2%zg@_!~vfBGck(zzs8C@u4#+q-NGd}lezzG)7t-m(Hrg2qg^E0(sO<-t-As%HH5_OSrs{Bx zfXd+Xn`Mh#a*ppXS<0d=+{)E>f?Vxj_QK-2 zoG&C?>07)H0-r^wS75}R(xjxC)|&0ofXaN*N5&)C02)Cnc^A)JMGXwCOzll* z$?Mr$*wy7pd*bU)639v(7wi&49QtWH{YgKs$OL#N0)Ublg*17%~G=zQe8#$13 zl7!B4#6?5YnKQEhp@oHuL}_2oV*!`7>Fxsen1?pUFthz-ykU;1Q<&@v^6-B~==4N_ z`!mrJlpaz0EPm^E9yN1YHjAK6|HN7qUlI2%-5oyLhQpY3&so$s_%VU~Q#-^&^vfav zTI!K=tkLihp?SOi(Ahm}?o6^uRcqHoZy&OQhireT+8D8iLsQg&mipe3j48nTX_1{^ z>-4-~qv@~1LQ^a49V!nG?L+52XBT4^=9yZ_WvB{SX2e{68+9Dc2OKY0%#PHr%7HFg zjl-hLU1Z~AFnX$74IoR_$rFF63!~>2iY)(XZXm>qPhgVoKni2HhAH3)4qcJv3t3lA z2lQXed)U+R>;hw(5sk>L>KMRpXVEk$i<`w~u!R1EOsn#H7o+1-U#4n`r@O(Jj0wD; z!eHOrhd%V;8<%ks9Y^?Z`kWvcD^XMUnz`ZbN@C-spAssuJa?M7H^rFWuGF4&QF

+s?{o1P`Y9min0k{nHry+mAFEUXPV06edLbyn1;~|X z6NEUvAfmVBwfJ^xe-sfsBe9(T@;n_zyvL6sYH|2cL|8wHC@JGBbD@m|e|kZy2k9*t z;Rb3Rkcxpyc_v3K*b6SzS7lqAJHIcwr|P2@HFPG|d*i(-SYj0fSu_sputR z+~dCCjqZo}gG_>6fi+oyU77_#N4XJ+#J>&14U|e6ksg|WC4oaWtzZFio=h-eE@l)A z2Tkp-{$c=35yAY_Ai;H&@RudHZQW$n1d9J4nyV&WBn_aXE{wYhe=4QG23Gn?xwVOEzT6kwt##0g(h`3g^5B_xvMFaO%0JI<$;Uroi8 z3Y**@z}*cOIPv_LXkH<7DqVAEd1zOT|Mtxw#)_@zOKDvqU=Z~asV;eS;!$LWfYF6!YUSmS)I;Q2|A%~P+RmxPE zlmn5Lr7V$iDqT>us7JpTOf4rP`tT!P2TO!*aUC|%Ip2KV>ehQ!loSlTy*_34jp^C$ zf4Dkx=K~Yr{$3(*7KoI53`4L1N3uz#XaTe(YC8J!6AQ7}r14L4X2GvFWz548d>>@c zM1`K*A(Pg+raPvIJNqy@*Q{%tfLd>3H_Cm(m0@ z{?_}moM-=xmmJKc)5n>NMb(0RkcWvdIHfzPWQ z+Y}T`@z4cNoW69gRKMvaNSGcC5C9g*cnsD=(HL7|QJ8qR2P+FN`r?IqxVgZ#;LL01 zYY0_=qyvVx`_iV(c>9<;k5I6Q@@JZPLVA}Iy6CpYKSqR_5%TYVWI1YK8F&cg>_^~Nf>^!Fee9n9{>;aw=Z zYFBB4b^DPo9XQYW&T8?7WOJRgYU!q7Z|zNg5(O;E@!>1@1?;UJ!gJU~(#h|DCwYZ# znvYHTH~`zb?&n)j65u}))}?shivr}QcMAT$zO*z$FR=grPtC>6&d$jB|CmK;dj0fJ zG5)j7sSfLEOO%*hEN_vy8l{_K9?$bnn>9*Y8LUZ6$J$g{bk03G$M@MUu9!i`o+qcU z*O2reUaC9k`XymxX1Z>s^LsYedEL1`~PF>9fLFL)^*|7wr$(CZQHh=7#%wu zcRIFhc5K_WlTLE-uC>?x_SxT=HEPxvHRsP!b>qVA?hTQ4+5RQ)Jt1S$^;%D{)5*to z2RiK_F=j4wsM?pgu@|Oj!l2{IY@O*!nGnRj!X03-&U7%2 z%W-J5{!g>dVzklmHdG@t8{A@dnr}B)nxNMUJZ~i!ybLji|5&ob)7NVyj18DEdw`KH z=tK16df<`5QaNKoh*Nj-k|unF5|u0y((s}kpv znS%senNR>ntUk=)0gGE&lH}(RIcJP##}W7pV#M#pBkt;S>RVECckGcEA%+QGQodwk z#E~u>am;qiLYk*~y;_Ci*|5heMMHl|BouY4Y6gdTojQZsfpq?--{W!-SUmgZ8iSH$0%~y+=*FI&nsGxV{9zi*?_vcX(BEZ z9|;6l2EVIKTwqPIrW_xhm_E=b+hL4^-z9YulEQdruV&DMAJGRaNo{y*2Xj-QkO*MIe#eC_(#?GKr|cEktFZiwc6rw+t2_qRFXa z_tpJwdQ`JaJE?O!RYFrCucJxC-~()#y}|*Gs~%-Uf5!6(`02F(JrpKS z-q+su^?PoNE0evN8(juJnq2Sfs9!HCGJbQXMx;~C7p?#Ua&|>0az{}$B!%m(J_S`*tjS+WY@PdEee(n$pl`s##T2{J8OlyqWu11(d`vj>#}o+ z2J7qI-O*23$c|{-Hmk{1v$KhUP@nz8xt;Fnz7$zf0YQClJD$PVQnc5ZcQ3H#I0qxq z4NJR#6|@8Dyux75JN;Hkb3zV0rFDQm1{fx6VKIpGN-3-^1<%s!BQL01^^9q@N43ii zgPd0OecI#>*G2*r`Mu~+2Z~0ldnFrjIQ$j89btP;(`*wT6|XJ3iB8d{rlY}q-I>0< zys0j6Aw1hnFFlM`gZ2hgw^we={YB{oSYAz)ds-=|0~v4}{YC_q*Lv$Y%U{4@bE!i9 z%V)zc(J-I2RG?8X39IdPbs*u?D8J}b!+xU-n`jO!dse6dAYVDW3gg^u8!IQ<9hr)% zMH^meO0qv(4`gvo53Kx~OH18oMFmI$hd=T?ZAJ2`8A7Ho4%N*hQIlCd1me)cDo59p zsWyeZGKTEL)h%Lj4ix&7#vlQyeufemh0u(r95bgl5V|8CxGxn%RwlF2yWYGg_I(9z zTstB;+fOhD79yK8w>0qSQnHTQ7#ndVv0cSL8_9_X5*6IP^ttj)Mr!j#@IS^Ar0sfF zczG z-C-@a@l>}ifGcC^ao3t_D|n!kaNkA6DgoilcYK`LgtB41fI`MEM||*%^Qmym=9J!S zQIOFD#t(O8+7OCb1qUeylc7m3m+My;N&*4|ZJY8@kaIo%bm`l{Dk2ZD-(Xg-)}g17 zH{OpXtA!X|w+Pc^5*q-3e?ZeJ4m+N(1r5Jg7f%7y&@xeOPw=Z%_3PXVhPS9eG+|jG z^{HjN@b;I6%GNlr?Mm;o;!78gRT;FERo$x>^kR^_Wi_-wNfwYPLfq+7tgG6Xe-ulz zMYT#pL9F`WNebiy{W9G`A7Yqjg;V8gh3S2Co+;X=V}_{a>3nJ z3hf4tbN2%y`K2*vb;@!ui8;71aOs;nr7h3NmN{hW@nBAeZU1RYZ&=j>ztQw=E&RN9 zc={0nkDh6cMSPKNtX3m+AWtKXjCjIM!~W6f*sZ?oT$Z&$$yWBVzfcN>Q_^P{nkS0yX}X67V1vt)QKY9@KMiK zj*lPwjhd!o$#SmeM|G4p2hcQEDoak&R?lf!j|aG=m*2iF*W}|V$<=?BL(blRwpU-z zB-Q=&fawmd-(TBjJPx=Tb{&bd3)`S8@Nhr-dVj;)dL?AoeJe>Gk5+Zkn|?RH zUbvt7+W>IeB|mrT)8t#4`$Kk=c%1W$?=(Ctx9zoMQfCy+pH`Z940sr}KWH3`A5wPqXv}|WZvBl!uSHroI6a_{z@s00c}#Q zlRHg8>AP}1vp=~QXr9P~l3XfO=@y_3*(QUTk2W9ofbPcrs+I2t%LJ?s0M44Ope%Yd zdAD<58RiFP^jTsbM4PG4wMmeicko zc35hO=i+4kE;!ebVu)0^V`IU!A*ml~J{VSYW_?shWvyJ~vXHrgHOYSA=ie^xx4$S! zRZPP{)Dktl1sApm=Ym1hlu^p55zo`!ZZk3+oGAB^o1>gI$>h(tZXRj>#>L66O|%8; zB7eLwsu6#P;p7R_*Z`f9WKBJ^K92TXpN!*L4~n030v(%sI$paUKO)v-PhXBGS6Q$j z|BV@4iJZlm+Uu2&s*pZ0Nj(Rc<84SlBUuSoTV_ApH#|Ec& z(1+F4X)vQMtwo&WZI)a+^LAl5yI@AX?lxI*;yeAtQ8Iv>^(SNPFer7Wo2E}HBc@A0 z`^|4bQZgmj@61mi&^PU=QQ!^xo%jjdl_We0h5iHNN_i!M9aODzdf*1&7q_BDYVBt; z5FVE1>hVaN6~-`Y63nNGa{~_NT__&H3KndO7rWcHGRN>UwKgqzP^?y>E9gSBqX|TR zG^C&{Eum7km~iov9e3qvaeMGn*@$^0{eB zRqCo^`l5!9>{%Xr?qNP)z84Kn6DxrKcnJZh8RA6JXItVT;Es>r*-_N4#Rq(e&cd@Gy%(ei8rnw<=wh{W1+U&olKkpJ5@Hb0ax|W%p19x1Ip1< z1EIm}4JxKOIa`q4hp86_G3;%NV%hh3`y+0wL2 zBUy@=dHm6E#N1#!Q@-G0zQO>n}(qD_Qh z#_%eXqN>IGNA}ltJ~UDthTp!}=yvVk?aA$GZBh=FVO!~WU6X-*y({jb3d8;cQpc;G zkKPHS+aBFC!5>S&JPMABiU%G-ax@ERV+@}9?r%vf06eD4+%sG+_l{Z-CQQgaOr=yUX5KNll>)(y{J zLk2U<=Dd1R7(N^|<*;KZyUk_F92hg3G3D2zi!a6Jp9-vfXH!JJ&w%&nVi&4c+bwqU zyRV|^EDkpKV0li3*D%%jo1gM|22ZLDAE}>K$36cP+V`Ty<3}AgYO==jmhB?r8Ffk2oU0>2ky;4)z(EBR?@mUTIdAy2=K7;;%0 z_%SHOd?0Or^$gh+;}9RPi=8fa5B28yGFVK9Ld@pTN!WFn6%s-b2^Z`I(o+xTfoSx; zc-|GV{9dzDiP?MgG$qU18)*vxHhlMozmZ)5>a-;qszqIc`0&ENy;ab=%e7j)NZ{23^w5p?h^VAdJ5onEuF_us|ZtU_gD3ewV0KmAd4=$$+>$=!X1<@PeYPyUWZ8r($% zRPkmH6g9n9?Qx30>_eoxFmHUMU1vp7V-TT^1D2_NHUq@p`8%MZf~k}%^Guvfu%?E@ zL=1oY+?(UQD`Q=wE>q=d!9aWno^l6DcO+`<40bqf*`InWScIU*31l*t*%gU)PM3G~ z$4pGAv(A%7JdB11*BG@_mv_&iQ@6kHlO(AzGs0%0lDwZcv%&*MOTdC{GQqKA9&(r4 z0uUw2?8__!Wqtb}l{zI-b%D+3BbYpk26l;M;E=C(44@B4Q~N8e6N|TmiRvFD?H!CN7Lnq)4{Dvi zmJX6XQs+8hoCr>2K@(2KD#E&h8zpSkUs$O(N&2L{;w4L=BXp}lhM9t2{ZMkjI)IMK z8V{0s7p)3++IxSjo;+Q(hbL9Swy-gLuz`HS7nG}68*_cIhX_w$x9`x`9c_%5b%fLA2G!6N7VkdW{AXi)I# zeb5PH3HW9vA3lw13UU!2vSNp! zYA;0~od+LTQkT?(Cret~Bc(_JgroJB`_tB9v|(uI#2;eOliJ?`Sa2M!z4_KZ`e29t zDEehjjvAfBCdJSk{StQ4lwdmGAvD0B2IaUYAcY|!Y!)Qw&#@fW!Tg9JM?Mc1I07a1 z{&o@K1@rA`1|q+1pyJ6Y;5bwwk(OVXnQ>BJ+&+vs2GNX3KK=pj2Mn49pfT8oi`yHE z)M;SiXpZiK(H=m?#;(+=VfNj&tCZ4w>Z^ajNb1a76Fhw5IL*4#(A4B07jelahE?9S z)TU@$?H;>^(Z7MtBF8K$JCTrvh4*R$t}z3OuEZfl)JL+3&pdr&`#I=k&&?UGoKg6TV<8#Rt)qX+XmYsN zS_ozLt+))?)!o#3P+q~_#!~CSgOxcy=q__fdVcP05zcY{xI&5!AxW1Qa_RbF|J8e8 z1!ybOi{;O=LPc1;xI{(f6I|4Df=rw$M~U0~NRo>!6|Fs718k21fEg9r@T`h?)#OjCygv5`We4DQvO9mBGzha4Cs`)= zgqLSx9*=lH0VzEiAZtOpnAFzARgv%Pa_MO0Z?6n`DETVRM&vrwxVP`FI_hwks_jr+ zVFUSx$d#_$<6j!!mh3yQBnUXyF>{M7m#-r0n^i7ml)P#Lnb%3dNl%)1I~+ZJGluzg zVK5OBm60Q0SneXv`qRY8xlG>6JlKjOBG7m+4yMz4<{+JD09gGkrqN%Au{mhZO~-y4 zH)!kg#DpX5KoMV1z4o0qipoMMrL6d)H(Q1GF+6gD>37-R@z_9!L?6CGy(kx{Qprx; zz;}=D4o;s}>mtO! z`_z~g&cT+F0DMZAF*mfH;eEDUfLwC_svNgk}JLSvHXzM7X2yq@M@vDjMfsy2BdUQk#|%O1`r z@`)fu(uJK~tH;QfGK3AS=p~w30-8_1I$p-@`Mw?To8H_$p4~n)AN<=tbp!bIzy52< z{d?#2q3M(jID$8d`#MFrarB37jgnrj`v709F}>#Yf4&DKF@1^5ZM`x6lU4xhdD`KA zBSlK2|4u9ZTLzVUF^!L9?CNUn@^9Ibk}T-|pr?FOb^-t6qws(K_itsC-mBw!E6QgV z0DK%oA2PC#OreJCsh_)jl4MzS!CwnaTv)cTNFuEhC1?Ng2moLubJuC!$J;bpmQa=@ zvwTU!3&L%$u9D_m41l`adA}P0B9sQ|Ki4Rv=xJK+8HnX z@gf*nOIyg~3#cZo#@gxW=||@CF?-$Sc{;gRVCNc0;?SJ>yK_&`Rq5fvaW99^=dLDL z34!KPz5M~vcSy2c*=_AR-;Sots2k*)ws$%DOq?!Kri*@#)qcM39#LY%bzR7>sbOZ9 z^xChrvwj_QpFtOZoK-V>^T(WWqh4@QsOcR*%-?8?%_xyRQR9_mQH7}ATRLhtw8Y4c zC?lrM{o>~hAG2QZ8KI0ITUTVz@pX&P)^G*2gxHazPNrYMBZb!0S+<3)^*xQ|Wq0jY z3GiOg?K5#A_L0+C+U!eP1)sf$)6x?m81jSey{Pf7!cjngK%DesvJ@}o>!wm`oijs& zg_PC$ISl>*Gqp^vIzcpXdMM2zm83xh<#ajr9?Hh9B155&qLBjJw&e!2X6Hczq?gE- z%)iumH~Y_0q>*^x9~LICa)NHJi_SH-$$41$p(94(^vLlqin4`^B*SMa!gzwB7@~PU znO=Sa3!H=lwmi5_EQ&9W#6JavTsk4*_Z!=@Fw?>?T>DHwK##>8M05@m&uV635yuw{ z)eUXWD$2T-cF!$T$Do!{K^(U`t-DuWM22AWi*tyGB4n^X+B<)YRwVdQ zS46PP!e}=HV@ncQqz_FNkj?%)ygcXJHEInvH5?DK2ZIbun z2L%L(C3Ci$dB2G_nLYV|T)?s@wQW{jgABb3bJFPb(G1b@Qi^S1RK(G#`a;RoS95T&tGCN1(atEn5AsTp^*ipzbj0zHqM)r} z<9@-*!IA7RV`&5Jvr>4yZ*0L3{efsv))1s=;|0Lk&Qur9Nhl<@T6@TXDN*(P@yu9> zY{>;qKUEef7jL1}8==;8ry3HPwW;I9{GjRC-nK#Sa0$ThobNC8T;d_xT@XA-mv?HxS=zt=jkXRhIE&KHs9{tWEW86QFx; zcjCWC>n$!N(Kkz9h~ZR4ov9?elm%dzRS z(Wp&e+!yMw(P*XK;%9@?*=T>}_sp?*w>}NK6$BmX&Sd5oY~#HU^B`uS^r<5Y=fUdx z*ZbQyd?Le%Asmd4Ez7%@m!p3|4P$qL>Mgc-Gyd=<)uzw{da|elh50?L=XnhRC`=Tc zHPjx4)U)6iMhDEl@n zloo0n2{*qSQTwo~8xB3%FQks^ZnhUh-jE$()(kkXY*Z$^Ajf=ph41xAk5MSq6)xn> zG8GCQdC;f5T4`KWQy+mZlR@kQtY#fuUej3FehO`|n#GeW1~TI(>j?W{X7EFqu_$(z zvA<_Mk=o#9q;vF_MxdX9gYk8WJTI!%K%8q#v8oj`;Tef3@y0gSJZ}zz-OT0w&E;6o zfSpr$qpILAzcC8l=73vapSonYd2Vw{orNhH-Bw_V5y>5;Mr_9tF)P*q;6RzzfJgJF z3XF!IjTN}}AGoWZ87@x53m{S)_K87m+lp9RfzwECFEAk6)7JR@fQ}{J4#S#891ax3 z+qd7S6mEWk5jOy@l1giNhsuU@X;&t)DonIesv@>s6At8r8cKyu%Z@}J+BL>gc_2no17ClMq{Y_|`tUu0 z!{Qqpf^>}lyRtBoYV{iv5G{{-PgHrb448--7HhSZ7~^~PxJq(23u+E*PVA<$qe5-_ z0bx9649t>?kyFt8y1bZGdmE$U#`pJs&KwG$!BOo(y>Maw5Sf{D=KuQVyLV;FULe%RaTsrE|h{j}2>!Jyzl%}AYwmHfE{UYgb zfj%ACgML7X`O#ST07RlbQqaR)b~fN8O0}FexcwOA%-GD&Bm8xgsK!6LxgV!q>Dm4Q zd>7fD27hKNnd0waX3Np|31ofc<>SN{NtvFrTJ0mUP|D7L3EjLaVU^}$O^k{#^nnS2 zUOb?-3gWX8ojVYp)DW<~-ViOHqb`>(kVAkf=_li~@?;hF;-ym~Z8ztmG@v}+=rgFG^yqSwTkui zp`~05fo7?k@Dw?$O|2r%`?Y#?DcFxQ)(sije}ruY`8S1%+qymlw`ZHO|Jd6jQ%Rjfn$4S?Y(;g@N47gv>2x=%u9;mtpo*!WoF z+H8-%9ILNn%?Yq|@?hIQ`4Ah`juL2`xJn+q^{FDrbu#MgB$c4;EdLgdmsZE%Q zt^BPqB?(4J(p5YiM4#$yW|cmHdEeWACkTSVWc5|n4}#!ADn z@)Z#GewDkqDoBLbww+7BtFZ2%X_@DK*H}@V2LBRbftdNBzWvsXi&_w7YhL zrfX`Nw*_J7T13%PquZ#iqju#XNzonEM7T3vzO$?|IaX3xJhQw}Xa~>O6T#VXIu!u^ zvLIks`;KV&yh=HZ*jsYSeZa;u#7gs6C?hBek>mB`N~@Fk9_U2Dycx!RaQ*&R^V`Xb zjX03oy{(gN$N3nqCPD3lC`@}d1g@*|T6vconc7{^q(80WE6BoD`*cOE3eKqj;$_SA zNwQt$>#U4leownY3YNjgO0a}&au!g7a*KMamWzM8d1Oh}V#49>z@N2wXZU+!z@=<~ z)vP1J+3M;}Hw}On|5r97ft&IrhW^u9)7GYXEXJ^E)N#p>H%9GyU+-oQ6R_1)qHr%;JIbKCIAk&ixAO&eD|z-yYnIX2LU%h0T&nE=4-|+q9%`Ar z`)$vj_dLnthMM_{5fg;Gdd8MouNNm@R`72!+*X#0z_`VwM4mXanFN(?n+z?0m^*J9 znW)J1ocOq7Gw#wyE(?9S`*v=ze!6H0Lwgs7MF2NP6~?nwHxeDBNC1hAC`_jaOkF93 z>W9J$GCIy~ZQvmR!H@*e!1^(bF~+kQpM(J_&I&NsAc1sh50rj z@2`}6a(Y0Ld6Mrhn4GPte|qu2h6Z)ekjq2hJfP6Bl==}RZX|njjgZ^7DX_&}P`}at z4r9%KWqD&w5 zOz(>?b5E)asU9L|vR(-pb+^audCJK8K?x6r9+bb&-&DQhj~1Gw-WVjvcUh+?)H@w8 zQ@0VpN?Dz-b>F^6CaFfd6h z{d@M`*OFyS3$<@?hNHJ22YWamqR2z*%zlIAU~IakPJ+jXHH#&7lI9_hDuiWkbY=-U z@$-GMg^sr{b#?~#-A+@E5;78F{eGU;%C$ z<^kyvRDI8f@M=rIm;3wUb4@m52V%0#Wa-LR zOyY{vEY9@2kng|n>hw`{oDDK;0PJbDhC~60I58C1h!Bq~mwyx9`Ol6BB7PSgzV_Yb z#uDSvvf85=&NLC8v-exKxvgif_UEyIy}c0u8&{rOuX(PbIj>Uk)(RP>-Ld*~$_nBv zxEm4~VS$z&yzh4W*)q^Iwk_de8LGe(nB(ZTOK|^|BUb*mp*7qzhLk)sAc^O<{!0C< z%Ue33eU@tw#=e_t5wKxz26+;v9>mBYj%1M*lJ!NBcH5FmeF~8634HByM^)2e6BiYY zZJUW~(W@rC!F^)2zPz}pE=eJ5<7UwG9GfbSUr`?Az0Yndir+0C{^+W)GJ1EerR|Mb z1br{)Lyvtg1+Jh0xjqsb;0n?G$@_Yq4wQ;wMzLcm)&bS6K0)`v7p|9x6~-ROejaiU ziB>-8#GJuVF2u<+D@{UueBL25HY%~{*f|O7s>GtBtd+l6U7P~rF!=3yxK=NtRL ztltj|3ykv)u7p|6i?DB$(L0ay&13uJStLGy&s61b4V5@=01vGnyY!$yOpBXS#C5Fe zx`rAM7n}+GhMHO|vo)s`I0vyRH|>nI-2ALD`?d<(9MI?iAkXaOq`Sx{7n|Lr@FJBi zb`%Z61>wtBithB$>pa4qjmux-TG{33U@flr0h{z(>ZFfWW%%3nx#wv1(5Q?!7X0r9 zSa-LxPnp>;A1&M4>yaPEW!2C<2Kg_;A@9H1F^^pU#zI=`%Is1_hKPaj_(!tl#6F3i zDyxmol^nWX#&-41SYLNe_DXq2=OwRi*4+V_HOthw|8@B6nO-)3zT3vDtNQy@M(wLR zvchI{?CPPKZnLf?czt|o;lulHHRN_A`2^-SHLMQ*e}`G88{q$EnEn5#VcPbNYf?y` zxrWS--?n&X>}1w+6hS`{3Z+v;7=H2Rl+);3fHyO9Y_cO=Wqt*)o@3fM$rPQZpP7gQ zPhU;&HL&tB?wzbkw`{(jpP^0pUNi1~%OelPap~5bKR2v-r=+g|WCkndO*{{1h>bC3 zSWer{3cMIvzo|0uxTgFBEbs9#%74vwcu35yY`gzuS_t+|v}A9I%U$Jg8~pnN5qyOM z#R~C-4~v5ic_uD#$DsbU3MzCj@g~0~kkN0rYbH!4r^}>iy{n5R6!_aJ+G_-KWh-Ru zJS3+pB%PhB>$J}UP}NOHixnLS+Sf3&T$asV>47Ci5_z#@LPF=X-x7`<_5O!Q0L*hR z6+?Mn^m-ydJc9)Lwcs?|lmj8e_~a3LS%-=T7~Y=Ha7T|s?Jy2QiP_h#-_}=VDl{0s zdA#|TySp;Ki-|ULbzr>sz}?I+9!kH%^4Zf9!ReE^6Qs-w0A5xS*6<_|DG?kwSdpni zN0&*(WTqC&b+6}8!y+wqF5F$z45eJ3oKo2UrZ2V(!|L$J9Gm97pz28ZE*K?yQ1N3% z*A8Wc%+Ue(yCUlqJi_I70YVpa8$r5L6(M^0FE}N{8tVk z7BwgseZMe8&PN4xnYk`Vji*1E3Y7Cv)$WfIwR;NiiJ8n^NBv;-kYl7njx=-2qZ{9m zP2Wk9?xcfAoH4OwqJRG;ubc|4oF;SAAJYOF-$`QrqjGw`o&fqACSRFI6n<h)CtfKCP#-)L$4&cw^)VqM!cWj5wRca$~R->BGh%3bb}WxQzC$LPeq_g%L3K{Ng# z(O%H$?Lm0z{MPjEQFTuDQbL))MuU$~W=4?`yFdGhn2i%G8IBTOq|LLFBO#Rd=uu(k z5Hz1ukACh)g}F)uNwp2>lsE3Y-WPmFT8FA50D%t*F}OJt(R63|`>&f%BucdW7!(x+ zZ!N*H7J8bts~os+E%MGsQfk(bV8`tpUXC~Ch64$v)0mfU0M z-Dv+m%rNXI*l8c&B?o^?%bw=1x1z_k_MeMd5+A*ioiRmtseNot@}X*DLY5VJj3Cc| zCB!z#_ZVgz_)(jXZ->7^Rl^zGAsLbeAE->_nZ2c^+9Gz+v|yNVq%KqU!m2pZk%2V? z)V?R#@WiPr0FbdNn{Yy18N@<^oXscyqROt8P{XR0EqjaO1ym zZ=*RTEQ`4eW)*OnVjy65PVXRO<(4UtjoS9S(+a`Zq+d7qSlMe4SZfZvk*)@3_$WRtg zJ$_r^GRc8zlJk~n5pZc(@I!i@DRg(2bui0zF&UJIpDD6inBy9B=SM{|kX|5vv?9Bd zOAod)j$3=$geNxT;cC!MeXOcVvduhxhmM&iWDj_(6;{XKYq*95N;u*IW}HE>AuDK8 zWlJP)$E<`buD3p$)PexImfd0mONPN3qHLa*5Z()Hv}J54*|@e-MVL&|u^mk&E8_DS)UDp> z*wJl!8Hb~4_uKqv>!`;AOvH6`89e*nwpVVZ24IQrwz}~|r+=;oru}&tW!0g3w3hS5 zna>?=EMdO<*VbfgKI2Icdp@mdw1&Hk`~^^Ed|BsFYiA%k(o~PZb}F26u#9uhtLb`f z_)m|*VlyPN{+r+Ri2Lv8_uoLQEYQE6^dwUV3{+!RZwJ$F;P!uDvH#+KeS@+8d=UQU zEn@6uY9;FK;_B$~Z!}id*LD40j!GcrmMGrCWai_}I_q<>hSD4N=X6b+Ida3Gi3x+@ zBxpz}m9`(7j+j7(B;i}p^}B1GJh1=NOXA%U-unsEuZC+0oiW8W)*F(8jMU9NhoI17KTYi zYt3<9WZGnxTYmj?d#5GMxO;aRCelhyi}2`fr0KeC)zB20aSE`0|BR-uwMKl!w#y5|m$IM)LL|<6kh)IjA&q)Ut-j*VwK+rjk0y9SPhXq3LVtGSQc&kfd(M>Lu5qZ4UW3G?X)Wt zfM1$>QBPG&Rl=hcVaMEdF)RkK{v!L0D_NkjvXq z@SNb$q6pf8c>#2U#**Cd6KMwe=@>ysz^a;mcJ~NHi4YO5Zm=yY_OLN&Ewh?N0bxa$b7WrMIb_T-QFvD=G1b_AVB`LzE0TjXB zCs&t9Y(^FYmQ~M_ngm0|##R=&d-wjy5_H)sJE{}eh&Ngpdlbg2E>?MzcW?#jARztW zX!r~KxpjOP@cI9mov^^1gd8hL7OD1I=Ozb;RK-FiThF8FEqU%GkZcX?lK#16rn!ZQ z0RIk-ZP*e4ho)VR)^Lub#vm0S9RT^UR3JMXPpqN?hef4ep!Z(=;8)VcDEvG=3%sq) z{`d*R9P!K@8IHvFQ7&^fSoenzkbuszBps4_6CP&x2}*L}_&q3Zz5qwC`HKuNecovVNRAOcR+4;WaBX#XE{IOt-Qeh@Q(qWYXzh*|Uz z;<}D_@$s9z;MQ>vqLz4KP$W-ikS*c};c}UW`vczb2#iLgE)oJ9f|rT9l9F$*E0#jg zNSp`6xK4dIw-9aM7S}WY7^(|_$B$&{2?@dM~B1#`~eW=I|j>GOYpw(IpB+;rVa4e%JR=l;cmjm-)dT7`mT>y1)ZL#<=EVaO* z<|^DU@|2Fqbg?8z<<=dYLYN}+{)FBLBh>KnpF^BD5*t`nsOE^f>gFEA-NVQO~sfw<65 z;{_ivoF@!13+p!0{GP3n(SmdJl-fR2Km>f?%qF9;Lj5OhKR760?|exRgLfO8PHzda z8**nSX$mjn>|%hKYVzzv%qR?6ol7wMffb52Mv&04TgM1MZ3`Reg>0=kVdzBsbc7H{>8Ctg)nX6rOC;-V)hL+ctLc&7Ept3 zeiH9+$b2AxP+B`9BH_*~ZVN;5pa4t4AnlTt>vBhvWP*GxaM~9lSJb-UW**h&Mxvbr zKSO9d46Hu0wk)}fKPJ%CKk3uf^2>OEKUQ{u3U^L^r)z$X({oghkfjW=aju&>ARtR3 z4CAxNC_L+})e89o@>2y2*gzH;-kMtqHrqB4OXnH_;7#HP?3ou-5ol_lv13{0@`Zn^ z4MuZSqv1r4u!CAT9`vj2*v)0~@1W`U-VT2t(QmLTQ*3Iq-%dO*cQIf~MK^>}D7?vq zgb)V8)Q?P}>-RtQOW=Ir)d^p3w;gzu=jPg$gX&!4aQFqtf=9)~m|v5a{-B15STh?b z&Pf_$0|KpZUY+1VT5Gq&ZmfY2z~0#8@SzEA!NR3B2zTJ4;h12xq@lUR@SW9{0`U;! zWbWAAyPIeuh1M2uPo#ivuq3P@7KQjVXXovLmSeG<2&{k9l%BQK- z=BD(gu#6E8SKj$W;-PU<{#fnIlxt*dZ$*b<)HG5a&~(VwG)c>%PD2FEQ{eWls#t-b z9)(p57nc0dZZ*B?j3(+S_d7J)>!8lb-llYihrDzRel@}8egS!pRE3uM(ODj6tqAzOI zskT`@EVxx84Rx`0bZLiqgW*{=gfSqZ8F+_6jD8Wh$jz(!8F9j(xlV#uU}NxaV1V6~ zZd%Fc`zb5)Ob(=Mw`@`|*5yT7*rK@n+UHYR@QX)UKkQo0!yrdJe5E_g5gLPunIxUY z)no22(H{s+FMGa-roZh$rA7$D?5!$shgBA7pT_naEcPsFq&0rP?%vg;Vr-llOVgNN^xr7BZ2WEhJ@7A59JS_gwsW!!XI2dn!fKE;A2#Dpq93*PE`{Z?9oOkrQ&Hl z1^b+;aC8vW*q{<#@c4wkUt~>==rN^lj6V({{R2eTMP_M4BW4^M)M~rhmesg{Ui&JE7d6ABrwB zm8ZVx+obUUq?|ytGO1Sgh&<`krz{b~2k0VXh_XB;cw={i=nk}#7}&I|JQzxX>TfJp z9~ocOGSUhzX=pW2QGX>pN$R3|w2Au5XK-!$Pjem2sY2i-@Ovz>pMddHM;M4`zCXwY z)H1U3XU5o|hOP(RgsBt{8djK^hJUrGQbd5ZCs+BI+YYE1q;OW}&fj9lB=7yDRt-2ybMdq&w z`bBfghLYh^P0k0!?G}@{S2*9a4YfA2{-Y4sDA%lV?JRDrHk7 z8fA+q$u@jBXVg{=3cxSbVqgO23K^JiN7nv^{NQIC@2rp&5rFRHi8FJ=fFAAA3iL5+ zCW+xFV#kiXBJ<h2!WxdL|zoV3Q@jegE)D@s~Dvmvr>pKGvt*53!HaPRB^^lckSemcMT+ zbN{uVPoCDJlgsJS7V3IJ_Kb4)OnsXE@kOsTqgR=$rsxKawq$~C;i#BQo8sKV`lY4$ z5q&$k`t@&PadW{L#_Kx^PmljUPdo)VA^$n?{HLb-pPu6XLuiTbQCed_47%bO$W`W) zkitn*!ZL#ZsXv)!5gvE;Jf(Ovgf-?&+z)8~Mzl~S?5|?V<4Bf$bbYw-a&^A)N&cCv z+L6A!Ks$U&ZkmHe9DRxI3AiiUFXiPh>EI&~GpGJrUayd$2bhA2>1|oyJW8JkvVkaP z;*`I1-;r_|RZ-C}P8}P5Hg}ex9Jgmi=L9MEL)`C!%oPoNil~@9+}b@=JOdSsNz-&q zu}D;=tTcbEVjdFoJ+{w>k=b?C^FZWVy!15>nEO3qMhXt<%8LyL$De8kD! zKCcN9*b|(>Ft~O^n!q{~X)c3iz)jLn5=;HWCEab~2Ka7DcTO&x*NRII=GpErUssZj zQLP0*JP@k%uBOlg-uUj)#y*9*@!brPcOsv}UvV_JXu#B&^q9(1$z1A?$u?r|eGtCk zMK@p5h;G4}Id&)~arGTdOAvm9uo$6SP-S`AP54X9sNLLd9ff$SSHK5?pXtH0K(!|K z77XOGnKd$TuRmt4Z-ABriH4zkpJ%>_1+%`2R9<|G)3r z|LR|3e2-l>K6?EDFM~CPSCDj_E!0AJA!?js6+Yb`Tn+j+<${*B_E;$acaQGtBU4z3 zUQ2_?SuY4X$0c7l^C_O^H)|`_YnM(|eDr6LwByI!_N}1=&6*2<7pwJh82==YT@KJB z?kzY+lf)=*vDU{@~bvRhJD|yHJ1=UqUgx`%GoYD8Uac^6#rnK zJT0!zX!c|0W9H_qNym}zX2hWBNe;lQ&L9aLW>#0_(SBP_C{HR~aAB7;PUQP}OEYp= z5ceDahV&CNesk&*^35wja*)a3!-qZtT>gkBgNtP?pCJ6TUXg_x^(GA3alhRGeq`lg zpr@p4CIX65hhYjv@Gq7!>fGhyd7qJSeE$h963tDyj4g7KXoO_AM9f?Wx-lSCl&Hrv z^MIrBQ_aR@zSi(m0|ktDh6eFQX|W``8Ot(O2Fyhh=JY*N<3srl7*%^OjuL@g9_c)9 z?-7be$$A*DfX#Ok;f#!@0EY$1YQM{3{G?Vl>E>VxibO_`!b9o!xB+~_WB3GbdHhUM z0+h~)2>Jq|7m*8?pDH1nOeREA}Z!c)@g^|>#6K_AQ4)9ywD zIEWQN2T*|>1ReRwfa{sba1_zmLU6GlI4*QFb(1T!EK z2nyA~olhhiwSq9C11HWdB)~v!i+UnO?$45$x}twiqXv8i5)_GLM*whrKwngN)INzY zk`a+B^!JsEo2lc!@jqle$TqzPl7!d<+JmVy;26m=&YHiNl5<9TD#}tSE@<>gyW!y^c_ zV9@k|>rfP?^rNJXl>yIGqSk375O*M5Swdmzwe^IOaFgQCZa%WhpnDv9YqELH zHBX0_&vScpGA47d1KP+el!u4_?}DEqLu@vxzhbnKygv|%v%f$hr}P?G2|Q;s4mIXq ztb4eh9g(G7kuuuv%`tXiLsnKG}Y*{#(=F4rOP9;T})J z1}8gOkgs9bZP^p{Y;I@{VLCS=lJB$XuAqtwc-1hkSyN|7 zjA$qIfo$y);viykbr{R^al?xwss%d&&-(<;U|SO*P0T6?3RO<|9}W}cRjw?pu%dqo zIcHXMQQ%vA(#R$(;j&B7A^6bh(&-XHC~TN!(ku9A!pk!GoYLN@*46 zIv;S^?b9rC3~@G&>N)ZkON5d5*DEgq;{hf0jVs`Au7c9qt93248z$h8#gh-OVJeq) zjsg!ZMWLusm$5CCplLMpXU{=-!A28vT_0xN63LIvlw*eaG}u-5-~4_#YhdME@`}af ztpq*Yz(b*!KNtkCewwUgF+A#yeaFxTg`qInNU^#`l_J=bnOGSxk+7D5SyQ9qWz zAQf=fsMZ8tTs>5bk+ITyy*robk=(w+GRu*(22i5*Fqkh(aO+|_*b&}IixFg;GX(~t_kuz6 zNzlr7lvx+*$RNLt{e{yv)`_@u5|f{mtn@@rY%3(%Adipj%Z@KKgCb5zG8=wa-t26t zIa*B=v>s#pGcR6b3RtnAQ>G);tGC#6Jua|oyJledJmf}@eK=U%`=84Q`~Q2~`+8Z; zOVj>LWycr$1k4`{8O<54eTX}J%&_I8AuZ67x!=nGt^oh+_T8&N&UxR>bT0h=-0k^= z|5I81uQvKxBieTxz2_7p74%oaw^dDb2osrHhdE!)HuqvT_uoV-y87eTdR)6Pz!v9x zIH`1r*VU_u`gfugyoc_~bvuDL{bc3q4xnmkqEs0-#&C^QSq@AzI`_ zZL03Qhbz2|B#ptQ`Qih$^R7!Yy}UXOU))lvhzhgJT_RP36zN3T6wZUbTMAcJHUA*# zH_JkFgSx#e{4sT_yj&&yW0c=78B?X+!uF$qZQT(lmNh%K_YdJ;)S`~^EXll6%Yejv z)83Yc5b!o;Ct@QWrWx<~JBlB(Sr4kGNq=WE-NKDgEs1DN8)?8NWJ~ZExv0h*f4zp^ zL`Byk#2^}rv;4ZTOz$@08O8;PUZB2h^Xe0ikdQ77Aq=7L6c9ze3ocVU!#40n>}B;S zGkeGY)QNlY?z%lnoj;GK1f?i;_XE7c=u`6mHwo>wIr|P~AJ{aJWVDqowgY=|h#cM( zdvV3PtZ3nT_=2A{Sl9*|!@dYzLM6gDR$=zyfQE;JcXhd>Hnp?(gK!c$$RxoXQ{PpuhIQo(mXDMR+3H^FYWVP12_; z8`c+QZAy;GJwgP7a(_X#ZTVQ}aPMxyVUy<=q32I!U?wDT5GlI;3lYPCk&s$;Lj2ni z^GZ=9njmwL6Wn|w@*~AL36ZfOA4)`qdQ-DN+|{j&NUyuKDb@9QBmnR$!57%%PCx z0#8^$mKUy)ymysv$OyP}n#8crr+|$;w2z%69jZ!7CUmNjh7+CcUBt3>pryqHqAC`6 z{t<}O1mT+!wFa3${#HeqkR|}OEel{NRF2ipIp>1K8%2v~nV3(XQyCrvMyuMzL z_(gXnhV`L!^@zeMB&xA4moL-sG5oaTQ27{K{%AI>h}!YUT_Cym?Upfvj~9WIw}t@KCL{3IC)|$v@zM%P zo#x&%p=FPUL0z3rLHo!5esKS>v)Y*$SfeG@<<|nUEL(*Eo(a*2P<7T*A$oPOIE^ND zTW@2z7#QH_>FamAdNpt{#Gw_$n)Zjo_F)fp6Jm9$eFBh& ze|(F|Z|FI8IXsKeWt_^eq}3O(?RpUdDi)JKTzjX{p@2n0OyPW?_fgMUqY9*9YDP{84Pn3Jn$O7fcqX>X9HkV)VL)-w6e>P4YWATjJ?>>CR|IdZ?-)8TB>SSdLTQh4D zB@-tXYiD5tYiq-Aitc}BLSB5Ey-~h4yZrWiCV>q{YT})x4f*YLTTO@8;)}f)P(=l# zo%2=Ec*7cv%3rqJ#FgxlGV-nX&w&lW8o%Ky(fb=$m%}*k_TC=*9}X@;n;u7I`==i} zDy{loD=nkW~>I>(_5OR$;F)C!}aGj@pKV&Q_)(xkP0mB^{&!`x;O1Fz3 zOJuvY8bnGrke|~%W&Zf9HjX{$YUfe$uGmn^!TmHXXUduS(J^)1uJ4KD+DrqWOqy}> z){`JR@ry}!b#pBn8yf^fgt{EWT{QvDZjwjI9h;YcO}XHVb@%+W6;C6G6#D_F(xpSd zWUfaRUZ}{8NJGa#g7R*96Q9bvu0`ZiC_YoF;{xES!{#f3t3+bJ+a86~jj`+Sgho}I zCQ5w#OGXnVc0H8MatYp;M4$UV1|zM$)EYG8a)bR&AN(EKwg^@cml_1KVR|6)z) zhbppi>wgF}gL$1&bMEom#Qe#sZ({r2Kmn;t&{l^&nB!#6F|zk%>_L}Dj`+Gix3V+v z8=DhWx)G|h(JRa+NqlMHL}TLkUc$w2Tbtght4_iqSsdKVikj-4d`sas^7}Z*j)Hvu zte+FL!0ykHsLkT1V$iQd&4R?3LnDRiOCy-#$ZX0qX$k2A zskYtrXa!Vi+eG;N0)jbCmzf~v?szw%+<#@sWaw~3XtDrD-l{DmCG;LsPl@hgtlgdxH{ukDd3-s_wg_8D3s+Ga6#^STjjG8)H=CXFaH;lS2X6uxR@HyqFO}9su)uQb=*GP|nVV z;)e0a-*H^#^;}ftDYT6iHRit%18;ESK+jKGXZ9=SoZM$O9K0DFh|x`*SUR1^6#Yhe zI~TV*%X@IuT%YglPiop=mqUbN5&lNM?Qb$7eSkb-)&hrMpT-ul|+n*T7EkDD&k{8OMrWJ|cro!f0cqj)@7gy8>?TTXV{wv}8iM&*q zKo-Q*fdVL1xhTwhS|IiAb9GZAT13q`%KUAOVu-We3O;`ZXaJ+w?aP^Qg4~l0SWl%t zm6DzhuIg*T_47;oETQ1pN7n0m8dJY@l#E}&<4MINDT{W#712mtfi@I#R$9GFJdq+0 zFnJVfYEcteVspcZ?4Eb{=7mUv0|E9D!2?Z&Y2Wo=P-bFZAAu^2ty!HLKApV(BGy4e zs<_b^{|DbR6W~`_n5*-TJpnGx$Q5KlGcbdLy2-g2&U$jbXhtOHsTY}7-AZFegi`AO zhrBr7jg(&&Q#2+k>cGk%!XLG(&uqIlt!&-+63|O5Xd@*hOgQN!Grp7%c#Jt|heHaM zVh*x5S4CRckm_ZtQmXA~HcL#q5jmQ;-~Dv~dyi131`vXjdpMr_d|y+4sT#)&q@ka(uS4H!7ONo=-p zn_rXbT>xU#52&oo0#gF=u;MVJctqRi#;^V-)~Moql)chU1dL%kHLj}Es9GAhpv3+L zN?2mhhG;hZvY)hMb17%_QW4N~BPtZ4M5dHT$~*zR-t1fHg`(2Ls30D4IaO0-<5;AsRWe&a&95X$$pLcX345<-}n83sErl*V>;tX-tes)L~>P-qh8;N{T4#LAWQ<9`=uVaxl~pYX<44B_Cd_LZvF7h zSVa4!o~`?iCar^bGII7Rg~WSrkZrzZMZLoI-2@H|}Rh124773^L-7Q=FFjyw}SvzQxC zU>W48UKUa#c$TiA(_*-tYx-cHB^*(mhy_9v4rv_A7aAd5)FYnKunLJ_Oa>Qt5IhyP zH2)&H&Cc0>tT48)nM0C2D}UreEjrGL^`RDpP_iIx1ReH%4D6?8>5sNLSwe8LK~O*~ zR14?8$eswAyt`(GpJg9I(4i%}R^X?2pU+71tlbY#Q34LWo1h}IeXk&28ftGEn3VZ> z2;T^P_KjY9dhx90szr52T0l9p<`HQ0-+@DBX81N&(Y}i~>YnfsV??ls5#z`&yrb8r zw&m9R3oD-U5s}9e9Mx5w3i8_YY+=BDurbI_vi*n=nkZbMpc_A0<&U6X5u7VwFBcrs=i`l`^=gB8FvD2}IiLnLQnWuwOGJsc0tH=L)Nh~hN#vXlVUT&&?=+W8h z(%GM;x^+O<6*JU=$P z>zRVaGOSM_P^^`V)_hhH!0J;YHdlVVO(#3G-d5)ZiGe`c2Jp)Q{P3if65!=U|LLM< zliP98Jnrx4BR8i&v|~Dfm&xl=cUu+K1H(4U_Q7Gb{EyvXJr(~sJ8gS!iHu5I#?i8@ zH2l%4Sn^AUti`Am2K&=b9|x?z?!IT>xJsvig5)&BPA2TPmlh(f6TD8rI9nNZcp9~N zhD6m~^_I;HIpfvC<}I~4n*fh+&=*~MaiUYTAA`YsCOT3rf*kgx7|s~X670Dbr3Pt9 z@ANj7VU~>M3+DQa$R=|84<1P{wbar-dWp!Tr4!NsOnI*Pe}KTHZKSB3gXf?Y?a$bt zyxmzyzCy^~-EEX^g@?py7#$$UXb3-CH|Re0YnTvokV2Fb#X(=^$N(j(k{({nbGZD! zx&2s~1z{j~y%kXYdg(><1)T4Ry#lr;PLj+~2ln`E)zL<$J8+Sfdu)%Hlt{lYbO$(= zE3Gj%8(%jSx7tp<KbtkRZ;WvL`y z*sC|277BKPrI{F$K*ftMwN-tX#-dgCm>c71EMpuSx8|Ly z?IBpOMBAnBzk*umZpD=CZOKL1?P->53;1w!PGAfhE_c;l2?D^3OkmI7l5kTM@ca>C z|I%=8#cy~>s+H*S>&K=N#vK1l0DbYQA~sIVp7d)q4|m9L56k08wV^k}Q570m?~eBH zheyZTg9cR_AwXtQ%0yv>7u>$$eN`~^*PV(AA_GZRY*QVGqdiW&+HCsE4Rk0}gsqWw z7H@FTA9Xta)C91jEZ4;iCs#N`DhRVi!5g}cmFX+^2;njZ9_1_dIrT_OkUOJCEVO>> zJoSj`Dsnkh>e7RVQ2fo;J0*i|wS7c7WE%+j2N=Q{2qoah2*@I8{&Wz(@e+sj0ujbK)!D1HF)-%XjdIegG3u!{QOLTuAb2D!lZ)-u0)-92=2E+lt-E=zm@ql+`1$1 z<6k&1@SP@{#|o7}X5@W^8!dj35|}UAFOCwOsesvAy&gXQB_LP-tZ7$_8RRvhEuWR4 zSn%QV&Wl#Fr)g|PRNPTnrovp~3|&2{t7{O|h~3Eo*k;ky#;IacW(w3JvHkUL^oT2$ zx~3{qFA(%$vDGl2Z4yiYIIl#6on~%%$@}PPlc018`(K?{0e6&{H++AzGyEvf8!$o# zGeF=syT3fixtZo9AW%>saGSMzm>cHQsO_L=GDbQRb!?e} zoK3)Tvn0|K_}JcCZc1&{Y|(S+JI;mo9ANQ)za= z>X5w8sfi`XgYZgMi&Cip#)Pr`Kr)@^n6ano{Ou93rU?A;K+gTKm{f?=>>Ig-sze?W*h(VnM1anO3RVr3Z7Z?h3yqrJeI8#enJX8O+Ao>I-W?-#6u=59 zFO9mZD|6~>+cGiLNe#st_||-caR|%jI^%|aQ?&>GqP};2 z`U~HpzecRl11oi&J_`GXqvtvg*@8n3wAeHYlbAwF=(71di#?y5a6m6?E6c5jgl0dw%QdLygf=zQAr1lhj+Uy++0_+_@oKJ+@ zZB4-REw4BX`b?X=Yxrx><+aj_0(P;F@7VC&nRDp~wr)ARHEqDvaPPvTMW-`|vLiUU;xQiJzo$2~DX- zlK*x(1O=uCOr}hnFv#cd5yDqs61Sj;P@H+6AfY#JCP32>51m+9E`MKyQ0$xca4jH* zfUL#?QL0lH7q1@qcXCDGAZZ*nlT%B(tJ9Ljj(;J2sVV>FY8jtbIRKaAfXEgSa zn&(9&w9%p6G)S@T?0^UIcPslcXs6yz^`ZWg_y}V8qLLGyT6c7GWu?%#x`t;AZ0QY< zi&dn|xBZobv2?M>yZ*{NgH?pIFh?|YB^PFuGHq5Okbni4=`kY#j2=-MGYh7s6a6G2 zM&i~2+!hT)<7iauNlacAl#%DTeRu1Qu!Y$jqWt3>W?h6PZ(wA{ z%ZhunHEO(*JiyS1sPs>Ff+C(8y)eTuUSf8bhD~5$%OCVd33f^XV?OOSPH48|z!UVSIP$U1m?FK(Qrpl3KaQHa2pg}O ztdHa>+oHP9Rpk|$oafEz|M>Y_tB6xT!S3JnUAgyGkP z;Q6z2Mm?lEhy!$19w`V3!*Zq!xzn47B+TEi9l!5pCI_b8aaPT@8tZVQ6iUy;jq8|J z%^64=`v!o#&4xuKCIr28M7{E)xd|EehveO_L?FLBy$ly6MKY%clh%Z(YOcqiW4(4a z;=rciB*3Sof*0cWk^Ltw|8gRf--@UN>7ir-jIMY{V`f{GEtqvITae->Z$hw5{Gt^= zZbCPjxsi35UIs9H(Ob0Q2CHR65SWwNj>)|>ND4qY12G_HRw?ywHRbkeK<6DdEHpO! z6=o_jLm(j>MTJB_S}!L)K=o%b{3h<@wdbY}Xu;j|QzTeuSARujrVFBRYINY^ufMdU z!GLumulxOHrq#c6cI2@U{XgjJC1> zSL6ej<seWisOVEl{zg#Ja=)>i*wMrRQimms&S6}i?j?CBrgVp6Jaa8tTsb?EMbtT0pRACbZcKGN*a3hs+gU;Sp#f-z2oGU$?7i}Q}}Pzp{OANu%q zvKz+kNw>hJcR73Ai>ZFohf~AYP9z}-1N0ZwqiB$kOL2*Lrv-j-nJ{nAI#+RUkh08( zrwc4>7|V2b`G@l)vx&?aVQgsuq?8CMb~wD%w;K;qlt~0tFO$$wbxH#vb*{tAYP*no zGOaMhf8DfI99YV;WZ9`?nTaO<`FQkDbHp;NG$vF-p_bJYOI7?;R-`nZ2OA8;w@4Wp z*}=xz3f5LNQpwi?uAa%w-8+@G;@ROldpRjm$1reS#o^W=*7!R!;|sPC@LVSZEGwMa z`#A-JBrm^9k02+8vZblelkX^Z5&ofj1sBo9e61w#{cqh2Iso(wg z?w)Gq^;rg*6j(l&;slhJr{vV~v)vp`LHF8n!BN3u{G$A%y8PlfY>XZ$#d5)xj9uy5P&4~{yttes-0Ma z7gB4AM!~?WIP;dLF7ZUV`_P`r@y7mr?IG7_{?n29W-#;XXU6>lfRlV_;_$)bGm@M5 zYRV!oBbfJMjn`zskpB654}Xu6mwb3&&8n(;ky-2X_&s6ve)eBW@81(gXI6ZAdUu># zR(#6AM<$&o$~RxHwNp#UzvF0mfl0}-iRMYLw~I( zIYEIwY6!BCH+`a9qc5y~`f_7gmj~wYoFI&(X??k%q9RXifvRP{&Wde6Uo#K_M;HVR zK0P6rqjztd6?E$^1{TdJ`Tl61I-Tj8d~34wI#Bw1WowH}QNnXG;C)a?X^Xr;4}gI6 zPg?VcMU(hx!$y;*A5t`?;7#fKR4BjAY&=DT2Zoy09b-}djGZjjU7Nb3w**c!^vK@f z&}Q2yJ%#f55U^dt0gtl}*FJn@2excLpQH(DU|(_Au8Pi%d<(%3tEtlX$A^{2*b2!= z3_|Q1G8Y5MmQclcOPeOmt)UVS0Dn8FAEYeRo=11VkcW&UTrCz7E+yp+7(Pph$;zu9 z+q}|-cG)8qU+Fs zjQ4`f>pcVs(r*B6y4em4%{KsdV7{v0UCtso=7c@>?Qn_)w8-w_(SKT z48H3UVWBwXVIk&&-44qRo^PgE%*~t|YB-RrD9i11Sv&Z!PGOJ+Orx%o_uPs=Qg6_Y z(_zt!OkdC&89dfU()?Bi;F26-YN2*3qg(^BY4rPCDpM9+2Bd9n><2|-cXbA3fa2@% z>)fJUb%%}(d?!gIeeAI4R)#;81b%;vwz@bQJOm%7Q zpY={j&jxZ(&|NSYDTWqv?~y`%i%|JM>s7N}zekc$L|NlHqJs7ZfU?qsD8E5`qESpM zLOtkP3I8uL>1oy;YN>RGOykfoCJj(MAErEwRQq^>*dI`nzcGtIvG{FO=-~-&_;&FTLPil1)M9iU|Be4qEb0_1gpLJ44&kwJ$@Xi z+uJTbZaW0xoG@wg0npZa6!d=RL&BMm+kEqez~iW3L4-Ymt`Lwscrerm6EM;cuG5HX z$OUH{)%nx{M5yOpUfLd`NyfR2`V%%js`w>*~(*A44GLD>1?AM2+ zySD(Etlwi&poTfOHb%6AI|Mh{1P#lthCJmCSy7KYwWeAktSt563>B5TK|7PI)_-z>qFVIlPA^!Bk4z-adcMXHP2-Yiym5WL79oMZ=)Sx<zczeX-43oXERc*$Ef`+7rSa$b*>g&|l&@Y@N`J;Gei?z<&Ld_LDQrJcck5r)~UC+@Gs0tqcs; zIIa{$baUb0Cjv3|QaCer|H>vcsF}Dfm4j$cEXGi!bVr36Z4~Yq$7P_}MW_qdU|NnT2)ia4 z0R#>t8zDf2ZL)+516YWk?_HLY_k`m`?9I<|^gEOWv4IK;Kwh);81;cFGYR%dpL;b4 zT|Ae)qg8^GKt9bLTTV*pslXCq2EaKkU-Q?mNM2u& zrS{(!lzX$^(%F%{qMPz9wEPOD4l{it;^4c-e`Yrdx8g2}>ELNVqd* zQ(QeSRYx>xC)gNC31=xB14R@CBxYX*jqC;?aOlGZXNjO}@A9!}(9B}D*)J4kXJmHY zA-w~uNL%roKz0f`@B)+L$yKx&Hp zfo6p=5CQ4)iHFU|b&>&^kadCt4z-1SBl?)Zh{g#rHEQLPaEvkC650C!C{ta2Mc$%& zj)eXd&D!PH#y&D&an+|1?98vLU2pd}{DATG8}5$fkp^P!;10OTpcjJ?7+<@_H#p9H zI<6Y;MllPP*(dG~3Bey0iy!ScmXC}C`uNf6*sr*abBb5fcBZzoyCkpe=E3@$Q3c7I zZy+Stt=C!C+!Ce+o*X+2fP-DJbf}-Znpg&Ca`E@ss+STpiuOIC>R&9*7Sy2+gJ6!J z3p6fi#1z-^AEcl^AZNo(6JH+*gW7gS(i`u{!)M&vF}x@ScL}%R`>W$OAoIGPQM@$l z;Wu|?P>NSV5k&<-jR%GwAotLjTr)Hmwsiz?q1aTH{r#i(H57z!$N!xe(CBpm~OF`%=e;1|)O zgr$rOwLHEtp-(b@hV7L>NFnOJ%U=D8KSaiPp=m;7NTR8t%17#-uo#c{MMlIjupj9eJ9c2~ zKxPu?iDnz73eq4{UPx8N>7@Aw#`B#|ECy1yLf*buDMc4>`ER|2VXtj*~1+26x4s%X>O zCEhM^0|3aX7$?>pP_=?}H3z=r^_n#U<;l}KXqT7O?$rK`*ox;-@g|kGPaSqp#Zqg> z5>@5dQ5L?NOdzdiai7N#C05YX=)81CXN!rq^>UeX`0Duk?BG?E?eY8e`uOi+aqOWY z`Amy`sp+#~sfp?M;i|pIWFOGd|KJ#E#omIUE_7xhDz9{x@RPAHtY$)ww}coOZzg76^!j{XZ?w|3pjvFYT^mVqpBgnrYv%{oDBb)s^LU@Q-bavS#kvwx!1r zUAZ!GHhB3x;{>Dmov>27A6u(qH0IWI6f>{onjwC5>4VWn6w4DF%u}_Mv+Tb#lq~MQ zRVgM3GA*9fq|UjaPcY^%GSt81+p6R1;sEPn@9EI*Eblg@|ljbz$P z9XVNTHWE1)AynGX<3Vz}B8tXo*`Ci{miaGDkhN^zQM>j@)5_54rXbrz%Q?$Z)?LQff?yekIT}K&}=h48|rwx+yqQ=JI>#Ment`14v2zH^{f`H&rcO?502RvnD{}eGUaVaUD9&ubtjmA%UY|9c`R*T@r8q8EF z@#lDsDe!@XiUf(BeUB2=GdIaL$bV%!ao@1c`cQSar)UCCc!KeOF<36ifywr|6<@BeU~>yUS>0(^lTK*&hd zwOCs8nHg&P{|d2TGZ_eaA!~(@)oR2lZN7dRtg-=D)gz;f61-qQg<)ekTvm{>%op#?gt?oP(7-^4a94WS zIy6{{@O_lSb)j`yq;EC~h^$<_Fj_$*`Z6fhjxMX=SH->Hi zJLod7ut!GYrg)X1L_D}}4$r{TTL=%HOd6sn+ytciMC|fhwmGLYhU^~mu)MN50R;(u z++}FsK#e)jZ+L%Rxi|$09x~qD;8I1|XI&p8O6Cz1bpMi1QXW2naCkwlF(R7!i{wEg zsLZ}7Q770RKmBPY3iJ0T(uu~Frsc-~f*61xNdqQC0(tGsx6123MSHY8KG+7s9c7pE z^1LFLleA*aBqDqlU`$*Yn{wpT>23H>hzQG3IUANHazU*nm zIkWs|qdqZnJc#v1*cXG7bEh)Iyo=JzJK9_`;XdVwh)SOUBL zU~g3D&6xCkYA7$Y6`zd9)H6WlxDS>Q#qPk5+Wb7hX!@xi&)ojFd&Mo*pzI?d;BiY7 z{=!ZMgB+$&Meb(tCN@8?0*9-+JAy7Y#Pa4fZ~a+bOlir|Px)Wo*>FqmRg=|{z=eKg z_exz(<5^xCQ?r13p*ouA{T@Du3O$zeyfpwF2m$u=Z3gF|>FZdyXOD{rYKIpn+K#MT?*9!Z7Q|j%H8U~ zQ%c$Zgr``ziy|VgH$}Tv$I78O54{Suemx5)OS{?RP(?c1CL?X)pECo%mo8H?Fxfkxgtv0Tm4_!6k`4 zES$fvgiBLtoItS3i~(;i1B{1M5p0C_-$YLrL8R3Nr^1D$Ya4kx6H_R3oZXBvtuHFK z&L@xRa)ftW{nNNfIEFK>VW#6)R~O&f-T!BCgypgs97ZHWjCzICo+OI#56pAI z3^;e9_-|XvApI!BdhaDD8TWcGrSN4jN8#!^vPFZh3btu$jvE_P6!c}|D8TgNZ}6~Y zU_A1KC*=VU_;k^dU*BY2AO0vj;fWJEFL!T2%&=Th#PC}#gXE!&}WSJ z2rUet6qsTl$cn+Xf|J{V48EG9L&UF*e}XTZ=eh6GQ@QIoLis$_N!+Xb4F)oDZK+)R zd!N+=L=8O04;T_zBiN9f2DL0Yss2iz3T~|LSmpw@{qkydB#&opL9imA_aRC(G+D$I zwzFDwgZQ5E(I>DgB7e(d4lrw9Fh!%~eb_U)Dn#5m+~oatoj`%+rO}D7xkpI$Pn{4Y z4BB1xeYS%tmHdo(&>hvmw1HU`V*x6dy9Y;s@qeoX@r~s()%{bv?Gpun8`=wE{XDU~ zw19;+)?`9zWSU3G|8l*(%tp2YmM^P7)Gn4)s}cN!xWHJC*)ExQY7VH zaQ2NhHK}1O07leUSFV=rCqpTTgKeJDGbEL@p;rTp&D%VIY*}BhOTz({riZ#ozp!7a z0^xad7lT#tFobbIkVb*-)%KU~9QtI=Gv5RZ^oOJp8}TrrGpjYCd)~nHU!O`f^`Y@{ z|2)jKN_D8_Az>0MPP@TM$aTf4>ae`y)@zkfYneW&qt$B(BQ?rolbBox)ARIYuPM;by)hWs{; za^7o?VEUIJ#cxag4_ogPUw7Ajd&gE|+qN64v2EMdiqRO2oiw)7ps{V+wv)cA_x`SV8ImL$n zp{GDDgX)a7^%s~KcwV|VKhT!3o(tBf&*J6g#T+Wx+B%jaI^V2kti>)&OEqq~W5~EoN#p2+ z)*1Qg!LT+ee@Jg~BIBH_BQ~@7LfE8qG8d_XR~9h6mI_3ID^1v~1HS{RsC^-phm0NL^cle^^~0S8g`E2l z%b8=1wsU~VT`p5dl=qJ~*FNglLZ=IHv5kku z_K2_{HUr6dT?2dau63#LLEs^~rT@>xw=Ln>ne663Vps4{!Z@t+Gd&eG=AG#Y)!>ps zy&@1!x2D27v7n^-JBwMg-RGCw*YMa4jX#8teZ({)eUbF143q(3I@Xn;s2KN|FRzLJvZrHTT@U#R$?RChcF` z)m~RDCk4{3X=v~pGGT)Y+TyKKa0+>3Xmf;x=TD=DZ=-_c2B7(m<>lI=@Rg8ED0!ljrRZY_W?U3SoDXCCsV^3oJRKh@vFZck``LmSG6hr`ul0`qayWn z;<$nU2dPle2fM!HuM5?QE{znd(_9gHb% zkev7_$>Vf#y@^f*^JVLZpgT4a8m8MoZaz``$DiJ(ANuH&@g#QCR3&dttFNha4`oOLykd>8{^(+0 zl=&lU3wop(#Q?n#Hn{;f&$x#=IxkK=X4rE{Ca%0?us-Ke6Axp1SuB$?*QPOT0Br?eL{S-xz8G-Qn0*a z&%$PGlS%Y-^hq4okko7$>abi$s4D^6%c)MZ-B!Gjv5@KGWdI4oA+%hDGiQE$R+a{4 z^O?tVt3_i_vjpG%ESrcn7qO#XO+ra%c5#t@gb-&~`0frwnW>JkkVj#5$b?wK35ifJVaVMFS;>kmfKIOsxN2xQT_FZwRzkKEMSNN19J&)Cj$ z*qAVIBa#JtB8E=%xI(FYhH**cV5o85;-2%ZRnh!W48=xeZ~F(Z%K@-)al-}T)0_3( zaCUqydn~u|MneTz!^15DfsD=38x_*8)^M@4k&@QaIx6Y;E z4`ytSw~W>OC2@S{-SEt#H|{IbNNe8WWdEJGV+CX4G^_kBhu%{z(nTS z)RJd!^utqc5Nxdv^N+AJlKkeFl)C+W$lSY)>#VLq<*&7WG?+@@Y;uwew4tE5f!6-! z9?;s)&?Vy{KDV<1cV4xq_5pB%T1V$cU}%g40YP)zd@S8p*#BDlx@3Q?{rvya+F$tB z+J|dysc33j`-bQaHwHO)1y31nrAwO zIVM9iP$TsJ)d>35r7l+68V5jY|KT5N{|by9XzdT&uMS?RnF6}W!{Du}d0)>bV%Jx} zc7EW!g70lrVK!1IwG6K+i>E+3dZ5?hg!Ky)b=s&&=G~P`ISKx&5yql?%YJx!0yV;f zi^SrBqP-4KBOsRG8|PH${GRaezxJvvMaG9CJ`0*e;6I}sW|c~8cB`xJ50OqJ5@I-q zrubhPL9vksxYY?U8O29Lu~HvN0lC~Jwa9w}dCEHbV^6+C28p*5$%=v2y>|I9C}r0d zxewP)L##ne%z-S@PtvNpIvS20(Kq9WpwGk3p^)`0%>-e*Y8+Wcq+NHdsmzkKP;oM8 zMa-OxS$L0tN8rtFv~hIyrwiZQaS0g`b8iY;M9Q?Tf2j5raNQl!Ggwf58O z(Q*pys20@AvG+41d0?!A;2?`TYc%Du?*&#IaEDq64R9~rvgyhM{J%EnlZ&UpsI8rQf{5C^#{UHzW$Zxu7pvm`Spk8(2 zc=4T{DA9T2cQ<3gD!=>Oc~1#mC&n4Hv&4wLSAXGm>D@Msb*L%*r#sjf3@&-F% z{_zVa1;B=4*j*+G(ocmi*4rEkwneawKKiDAUO@C=qYWdfHrP(%3kL#DwE#HSn<@J2 zRd$t^hPX_GOg3?zjo1_6QFW2V8}EAjnLdHqpfhWos;n;%pr39Tz6dduVe@+AsQ3M$T+ zVo`$R=7+Eee7eY${?LhCoks<0m#b%2Av{?b$!hx_JLx9d7#+8uhpOd6+X!GW#rVSL zBN${WD|6TYN;9?(h(jZ%;#kgu7=-joe%u0PF{ z>|iSTxB_1%Du0uvQG7Vv;I8rZcUA(!q2HEu&hDMxBNf$r))l#aO_LVD=&`{5+^${X z;ia64+)gTNGy~DkJp$l-P~2;c8a#sXXKR@xgwj27s_cWr{nG#AAf&OH&}bQ9in)*j z=@}Ys49+4JVGY-de+>aD;Xh)O)Hh4zBUzkcO~n3~rCNMP`9`fP0fQ;-ZLX=sE1$Td zIrytwo$;XBNR2>reAo089P#f9dTH#;rUQ+{H`POO{RXYrCMJC;)}|49-{)=UkrnP-AshlA5~$J;YO{HV<3zFyad9_Q^F`G*;B!#8%+^!a9} zcfvtTpJK!Fx~&(d{-asRu8iEvnEa!W#Z~1JA0LfBJgwi#iKG)gBArA1Np*>yIU9e@ zi$Lb#tM^aSiw9{P&PU+!`sn==cv(C9(Y!=wSEI4|$yD8F#(fUBQ_oEJ^I*JoHqh*B zrWkaohM}koqNc`PTvRt92%+-FxVrQ9pD0Z;kpVq2@TD!t{ogNbyBDbca^wGPQ;Ysj zp635@=XL+5>Y^6-x9VbI5l2}^lx5ORY(M};c=)pf#5l1y`}l#xP76ej{;-Pn{UG2j0B)g z9ieD%Fa9bqYG&Cj&|m0ZW6wc3gjxw7RWBd=qpTy@^1hK8Ui1zWFS4v1ZM+TccdkAE?0`-;OF zynL#&0khJg=Vbl@?pavVlz!#>d8qEo$fhdq6r9)sEn>K>=N6=<%E z3*pa1O;%zS-flAZZDO6RqR7jy+0T*&K$`*FJ*BzfXy`^m7=Pw$)}red+~8dekm0^N z4TGT~MDrUI2@dIQK3v4?CH9;A<<`f}@W6CpJ-X&R`)j7xoSfG75~&YpQEN2eiaGMh z$uwsegwAl!8w3RX+!Q#_H~3FFBY(O}H<(x^ z$tW*d=;5nuWO+c{9>FE!d0)mH=>|XT&4wI39xT)Vi}y!_{+mR@fg~5hN)GzJt2;OU zn1*1O3|V>;wke{=O!2ANR*T%F1DHfk*XZ4@2sYP(eQM=18<^b`6ofjjxv#;HlCWo* z^6hW78M`p_@K|&RZRU_RzgIsnz|G?CJ++E9L;m`SFo3)(Gep4U4;k5#T-O@JUEM8= zWWW23dAA7M7G`il6rK+}d)^Tu*!x~m`{Gb8Q@4}qqQb^`<^7`63vEM92S5mevQ`LO z#s$?U!wbb1?VhDD1Z*={#%)KG3S&;hqPN)dt6tO*)s4u0iQvL&1b?YpOM;Sf-0RJu zu^sd(ppd^ab=PAQi5L6gLdLX<2$j`N8jaH$O{LVDaE*U;0D|CmUf*7ijR=*jAREG4 z==3uaLx-7_&sXX~C*X8F4`8#9fs5pipB=+(}JP~;Ik;X)mr#Uj^?n9BAXk-Ae$ zV!`6`}GjqR}QgGLVwZOk_tQYXnR)T zZ`cO63A5X*nF&`YO87{C?2C4y0EXZ0YrT^Eb58J=Z*1R?CwHq}0a2E|La1)Qv`qkW zBf6}@fPXuS|A%kV!;9S{?+f1EDp>nsDx|yyU%wfdSO4X7=_$BI^xq}9{foE zlO)ikys;F#dbXiu0LkE{ebr<0?c>qX;L*i^=)own^(!K$%}#`}$G(h(q_nu~kOvL# zFq6Iz!8sLHus-!;;kL9PS++OA?;i+u>1)tpX_k$%bo=9&SKsO_Rk!PJ_{30`7wXrA zYn0j24gBm@d%B$&G$))|ERb}G$fCeUdRo|_zha)A49pbC0en*PB0>@reoR5{XO^x1 zp*Y47fxgDu`Emx8^`jr@1!{a#0haiu-zj&A33d$jcalTSbf-eoEM2{0&l`O5K}DBH z5D%$T?;s3nAko}>kh#d+U{;<|W>s2Zo2&=n0j&OM?WeAdJyHK8m(|Rss$bE^S}ECv zPJ%%?WJswH4nTm1prUY>Mg~e3+wfzur`av}XFRL30wYYk2aOn0fR0e#JiDwMxNjx4 z2nx}QEi>Ev3(vERBWG5O!3zNk|8zA(J13^_qpUnv{{e+ zXuT|{HzSxIDx^$l`YZ3suyC>kWqAToGsl+Bhsoy5Of5gx7T!Ab!<%738;a!8^U_g1 zk-qW@N1O-Xb^M5gwl|N&A49wc&mGuP6-bny+a<_V3R!)mnX@UIwl|1mWr>!7!agot z{C&r@)eacXbYqH4C8-HDbT>`8x8uDhjk8tQxCL}PBCJkNyx{`c+e_O;&@?E*W^@%)?SHPiJd%tMKKJm2@0j|Ms zFox!6Mq-{F7g7kPZn;Kcnsy?MUId#gOkLc&O$iXL{#*Na+f@y6gUijYDWqRj_xDsc zhM|16B%$6I7zBzrh!fU1Z-`+e?zlIdgQn~8C?>p(#-iF09dq$EuR(VNL3CES&}8-v zyHvjzsRUUUJ4PqH^3+k65b~k%%umER?sTU#5%g>wN_wef>1J)C2C~S|i1~e6W>sc5 zo<9IBa*#UY?@5qg77LDhfdc%3gk~M0DVc9!Za8AuoKh|!XPR!8@1C8x1Xf+t`&BQ4uQniroN8e zp=(*UJdG}!0vE)F1zSlFWoH=fDWf+R?!5x=#Vepmhp2+5xHb{)2B|mVux6k;zr^ob zss&-%H4}x$&1{yYFGS~~d&VR1+Jv{A`cHU9?p2Jbza8#5y`6?N3h3*y0~0@9k!le` zgw@Q{X^idD#eSGXbu-dnHDRU(t5`>Y=Ke2E(( zt&ZkBq9xFUEq_Rg8UBEQFcQ46*u;SF6u-8a%=20@*eyrLt3=Tz?>@!ysX7Qyr zbs$8ODoSzuIFun7v&PIr=QQtu)f4p=Lp8XSeVbGjC;r2gTVwjNn4E>_lAcHiqUP`0 z+c3PPO}55U#Sr;nHRytl+MFc6RtxV$g#HrjIkfZX@lYn~Z25)vCZ~ZsXuli4i`KjZ z3{SoFEsUUd2p}2VS*eh;mb;qvwPs|KBbU8y+tRTAa0{+QErDrsp+amc>ubP3;aX6d zROV0yXT3LJlcR-sDbtQQHt*3u;v+hvwKq6!qCzS}LIdp-HmqK$bV)!i5b${X)YFa3m8>t*w@dPoH4 zCADWoY{{yG71_hz2!(izE%(dNC|6`Q7%{>03WhyWuDY*3dR+%bs~y{_r0~^^_uJjGjo+phcT#AEmJu z3YQ+W_IAmx z@s}W{PK1{=ZQpL)EVe#F4fA=762sugsnW=TD^>||+%RZJ8T`OFOFOm?9oupP zFx#{dP-^ICvjOr7*9wGXn9qL}+R{|2)74kU&&v9E9{3|X*LQRuT`%_=H~9Gso_2Ka zw?}&$cpl4*K|DowOmaZzWvob*-B`>;e>;nCG< zu@CAFITenG7+YB$`gJGJro+7ZXPSSIP!GuzPM9sZnHIo%48s*4)m1GqgMaa$$V!fe zT!!&sJHDXbb%jY`Nd6n09I={YkSk7lfP%}T2@0FSN}@|MzGC%WvK^!J>0XRT0Da{! zL#WCfOL<V~~3HSF+wJbtY&4r7E<^`!ejWoLqW?dj#l(y##HO-&;N%bjk8i>HmXK}JU+r*Wq_ zcvZcHLYlvci>;8dKK1uD?JCO^B<}`I&!RN+<`a;}oy;B7$Yd4e5(g*1%uL>s)HDSD z6sqN{4sJmr-0!VgD~S*spvsxT=Hg@+6vu4)!eU=+|0~vW2}4H6@*Tfln^{#*x{jE1 z;UfnCn=^pwji1Nxu{m_@LW0%v$qvu;%TU_qy%&F80Zur$nn)2;y6hVB- zoJn)HNlvDph>vlP*8JTv1~OB=*yva(JzRtLZ43qL-5twp;#4j1q*@9sCKmqE#9NG8 zk3(?@z$E*<|Mj?hqwCl3C#}yZ*J3s?La;DkC#rnDYN)e9dQS81tQ>tIl}o*|qmK6E z?RK#Id2I}@LVr{90r>sz@23VYgXQFmJ~>QPv+utSu0= zVVlqrDCtP#oGVwP-}ZX*O43^7h93QQ(maY)WilCk>1Gq#yGx6(qRV<0$nTKGjgex` zVSVX4zHICbe=d)2YyT`Qu)NF*3X*B$B2UUA!*bA{O)cgF%m^OhREL^Z*2(>Pf`+3y znGL(l2n-ZOHn?-nwHJK_xQ-au(8($Qc5OGyTg~sx(XA)_NEekCzu6F+dyX`0`y-8n zfP*FhcnP~vaQq$T!{fl;HvzyRNjL)LK3*mZRpU34x%UCv&GYlhBxYhi4{3i3(3Mq^ z2?GxuzV_O+?o&6#w_*8Z834z02(7>E*%QG&Xv7SMh(6&M!nGIFIBw?>#0I+LrgJ+5=CTD~h0f$l*p@Yv+)rGBITcGPt=kiB zXPuGqnu^F_){@mI=d&CwOQz%bPa;jNDp{;|@-DIJuqDF%@d4hkw(%QOeuHO(5j0|p z#5Ni*ktQjyGlZ8IMzo5MJ=l+tmM7xx!DIV=E)K=K1C~`r5JmIHE4y*6e_3}bVb7u$ z0&qMIL6jDIBg}Lksh;mcGxyeXP9ss+diIfFmj4GBNHY}VawVOm{G(X&&BKGU zv<3F}<&&w$I8?pEQD69C_y!ZZ{Vd|@gP(Kt@$pg&gY9O};T-XIEyFwAEzZZLcvF;t zpcSXZ5-LM~U+mZXe_AAJsW3->OC$i5I^RtTaA1qX4cH>FJ~@Iy*D=(b{1i?T;N7ge z<2!CD@$HU^*b|r9-!|6`Q4xkBmgo;{bJ+PiY8sN;kQXRgy3&6dIeJ zE7GvjGZeDT760t4LEBWkJ?oYh;l{6Kw?dwW55mKo8lMX zDmd{R@9*u87w1d;r4c&c6G%z53W^rK{=`+oV|j&=squH#lwn6i znEH3tw1d`T7kv?i48WaEmb5w(y=V2t9)IFEpy?76+jj;S3%yUX=WcUI8q0kY9MuYQ z$4r4_6xRwdO9^0qMS%p?NI<>uq1v;^h2vZ4og=Y^C3tosL8ub#fi;par3YY*Ly{7)RM>)O8tjG;#g&$zO) z#`?5{krMlnA_qcM^t8r4FJ*FW%*!4?)eKS493UUxu21Qh68FnDs#{ zxGBRi!tIGNQ7)Jb;G!av1LU`i`5@6;`j> zhn~j1x&y7+jJ};=d>>Fs1Rv#~_6`U#!n2dYVDa1-#%`2!VuK8Wr{U}}#SgG^1RT(9 z3E%GU{OuUa;Pt@TCk)8_$|?LKPpElpfGCTaE|m-~?)~wt?vbBG9!qS>7<#L4*m#_0 z3=20qmU*;^d3&M2e-{JPEZW(}8g)la|pAcw_*8P$)`y){?johqciVKnwU z*~F|s4n?gbin~%m{ug|94963*rTCYVMrp_ih_Zb#?5=KS> z_79wHO2gRghNm9ljB_iop8V`^QjhHJ@K5wgI(>}}_+?bO0Tt>SPc@mm#NH2!vcf%6eK6o zn8tX7qhxKi&f8N-HB9En!yrsRMI0A&luAjRm}lEfNB-u_1!p6LQ}gg@@{b>|u$TQ7 z@CZTRAis39gtpy()a^Kh2xDI-%P(NOywYyWL5h~fWV=-7NN>9Tpk-5N-L6H(UwG|Y z_u6#=Xc3*eNGYefnxE9u0%WuKW@Bj;)LRwBZ^@_wzWyeCJ{vh4hE4enP#>KedjU{L zD!_by7`+)#@@q<*r+eAaa&z%qym%N^YT2T=Fgrk0U)G(LHoY?8F3irLPKh|Sr(n54 z--5jMLPxE z7o#zDh;>_Hi6#6fxs%cav>u8g(S#yWb3!u8f5BEBlEOOHZ>q!+z|*;3tZ;8Kz5Y2Sd)ghE|Qp9&z3F;T)M) zjytyP_S62_JeSuMRw5sWmOyl((VEdKpo~3tatg79VT2-2CZ%`*;0{q{#^2q^pPZCJ zmxpY{R}FwrKElDeKCZ|9UKxPEo!(bq6gk}~+{zPFl)QbC)aTnx=9?rUQcM8n`NbDZ zI+R4QOg@Ba3U-z|kDw&)Xjt?puwS1JH&HV4s+dM)SCpYai`h)hkP+f*468y6NvP%q z<Cqy|G@>HMBDZ#wen8)!FTZ@$ws@r0V@HI6gSG_V${kO8oh8JMRwPrSB&UtQP{kFEL35Mq z+3Kg;G$ibLzX3>|Y5<(mcdH_8Fx3;D@cW8_Tzf#Ve}?~D-K>Jau7QG@4#&l7&zq>B zI6C(B(J9TRti9 z3$@T$VsGWlZ>`A+^#WGP{0t`HE-kpSk9PAQqIAO1^&QwrT{_4?=@9(OIi@jf z{BjxT0UgUeS3EJ8EO*cAmXg7@l%KlVeH4JpY?8^sb=972S`E1XI=68m*yGVj>7qe6 zHZ1z!aAQ%H!AiX~s??~yeYBb&(Gil9s9=BdSZ~W2Bi@??XL5gaULlypNbA2NE=JNl zEA+x}t0Kq!bnxeN5T>U9s9)HD)oTlqNS<%Po=8`6trv(`BR#>scl%%K%mW0TW|nPoto(#L;_>x<2AkZk^{T@rO5~SfS`kE$t!>9-;Mhz+<-M-^=DDT;~Rc zcRSrZQzu=rnf{;2GZF32uPu0@4qRd7O+pk}H5Fcoi6zxxGvd)d|5QqRUMN{y{PT>T zr%wHC0~}*Ta{Sjb{@<;;#{c2B{lEBZx_&op$E?=T|Dh6F$rfY=KJnH~iTu1xX#tk|_7jM`37B zB;dZ86{}QBx4!4j6^>}Y-e+A$T?JS3H$mpFhmJ!}vP;bJjO+z5+_~p?gSMP=7IGWN z_R*hBEW0KiOOAfIN*jmGi<{iOYBfplyzQ(G)MZQgpl>Kk_x9Sj54A%P8O^89@DG-T z&elmiS?^Yx8O;s}tIeP44!-^$-bv4dCvnC58gpcPHQ)A*J`T?S9~)fzMN3qCF&A9U zK`aN9!jGr-HDxYqv%k8A%7)H9UP7$<6Mt*tmKd~cKL==%u^A?}2;6TiY>_Ig?=aeV zY|!knb35~|-PlXnodaJb1TW=lfi5!Ov-2Jg1hZ|t8~p6#F&SHILybRIYE$~7hfO-` z^tQZWTv}tFLLue>c2?0-dZQA_&M}UL$~WdL#R*D6;S6$1h%Zc+7kp#qVS5BD9MLWwM-tg9W; zOIdiUfqzzHz!ct;i?1FoYzdMvzuS}i+4xPHL3wLaHhvFaVGLDk!Asrk8jWS0uO?PN zAV#)n*Z&7xXR%Zwm^ka!zK>ba#eO0n;98<%A%8=Go$39fZc`R9TI!4cXVcsINHh^m7RSez}b`a@*<(&X8kb33=SYz6&)r?9A=(NK9536kRE#l&Ajgi zN%$trhX6QRhvA^KtTv*8(Bn`3u+=`J62xW=qj%D(X(a5 zNe4hDmm9q~wgtpl;&5g|%!{nowAX@vzvZ^>jMER0*>Kep_xk?(iVRoDLmApriT!HF zBB(#@m(>Id^k;Hz;95p6m@x6T%3sjrbAC#o-srq>)UYgx(XyPRu~fJNAy;6Er1_NJ zcG*Wq6}Sg|@C(Ehw~UWNn}cNm{f9W`X@Y<`C8aNZO`g&*@6RUQ!y1kTV+Cyf^TcH% z0fFRB?w9TJSA4Jo5OvFv>|JA5^GpN?0+mcKk0}mEEk%|*xGzUU%JqW<3&g1Y#g_(u zLMetFu=n;#&fy|D$`p!iRo_Z`IEL$w9KEe=bi~#+>^ZmCH{Ux-{8l@1RVxw53bz2= zn(#E%ePtG~h-DZo1RESH>kR_!T~;Q7b=dbJ2~Q9jU}3Ji%I|7($>#QiD8+@da5eEt zIvrGD;y=M8V}6tPcUOn)L_6ThWqb4a{5pt3912))4d;4YzG2ScM#1-$b9NMM%g7;^ zcsrbcgdsKGH`$v5eJPhI0f0J(1%LwHp#%#=1@kzX#k;^7JlYVYq_!F_l63MU5C)i? zljvKO=3<$q)MSBGdI=@x8z}pP{1aAfVg$H}G8`VRsswDl9D4f-tFCbHVhJYfNBf2p ztBGadecwII1Gxi@+23-|y`2~@Kg5M1z|f77zcNFyR_U}i-Dh_qq10^kO)v6Oi&g5KbqJc{-Z?af!gXQYh65rh~} z)4_&)1$3sjV3qmF-%f~Aw#;@4A%g$V=t|R8BVrjt8FDgQG{D$GxYt3xH9~xZGGQg- zSG5>13-Ih_aW`sY=2qwMm} zMAZLE)u)taDU;QaZlrH%H5tw%0ET%_&)1Ce!X1f}84U%{b}ZP!bzO;2i`cS(-IHB@ zs&UuEjlGUipT(1hVW*NUk}C1YFU6Pa)6N3Gh^7#tNLqx|;azlWm^8xE^Pck@vsJU(W@=`L&TKnQR6xu*>5?45}yg@vtK4z*| zOO|V?kyiY7SR~(GVNHfCC4d%Pk#t8sZoW#gL*%dq~Yxgim!kR4(dg4vOox$%RNjj z|G^;$Vy#ze7i1cU0?dn7mG!n$my(l;@sBhPizRsF=Fo2iBGF*{^L>AatLznu!I$ca zUgLMUhw&95W}+{@b6bKVjy2$TdF#Y5xc0%iWq-|&CBSX%q%lbm7Htd zN7yDyLgUPq)eQ%*vi9Y8hE%F4TB_)h56>DneMV3BCPY&W#=n?m8T30j!jdP zk~9=IfzyI<<>G=V3Uc@F2->kU=9U_~cI3ci;GKc*q5LW8oF9KcLvhMui14O_LSU?* z;!vd8*u7Nzo(9KIzH2m^>(0dF{c(o8@p-^;0$lZcrTYhva8sfN6=xjSdrbpa<+3g> z6}u;=%>iFp=`R4!$qq}3KJgR+Ul0aAf!JQr(FWILaod0;Z$e5@%(&&Ut)%ep^W*3& z^)ack@iO+57QYfMu&oh)kLh|(+CZg(%4Gl3$IC#ewGpO{81d%AQ zoeD5ba^CM+?u`(_*6&g{dnQ4CoVOND*%RQE;6-OPuu8`@GG55Wh3LXt zMu7mDnEWFFZijGbkb%(_kxBH8^mMW$IA`S3U3YHS6($jbkXI4Y#{znTD*Vl_0mP=pcX#F&^$wQyc$>`27JVc4;S zNVTv{)2+5RG78234a(c>?~nEVl5g~4nGpfT`Q|Sj23dabG7`ATu9U5LLFY6myQvDe zHwk?O(}CmodGTPmsc?-i#(iUO+C}Z~(XH2;^~P658TWzy!TXnhanc%0&Ns)SLsbiw~$4F~GY6%Q7LYWk-Mw_i27~E@f`qE1=ZXi0GG|rtMP?6;Mp&e`o+E&_8Ufe^uuEaDZeyfUz-mIqv>>_gi`mYqm0- zW1J=a2W@32yNx+w?!sx1yoM1&krtax&Q$hJ2b@XbZf5O*)5d8Q=uAfXo_`#)=c{I5 zOT76+<%Ddwh7tT506qmo*dgaHW({03Dk!seh(Z0}D(V!t`of|Kn^-%Q*B!u^wtX_% z9Qyg27YlwWhfpn1AN%$Q!)V8?dYm#h&?t_s;pds{5Y@-z$x8W{?M@%>llsbju()*M zjuajJTJqO|ROA(eV{A_0Na^ZTq*5e0oBZB-8@I%Ev>8Y*+cSha&! zxEdPz)Pu1lRE$bT01&elP7heU>-@##ws8$hAu<izis?Wq0APT@&3O?C z{>ST?UB>lYFpWthH2kZ2%XWlRG&SUb=ZfbE%iY&^mM*D0)Y2ToEoaOp22KY%=tPCa zn1hs#Vmn>Q@_=LrCZQ`1yLid}YPVi|!7#@xF(2_;iBqezXO=A}*`I8!OMKzC{l zBjd!)-TAu5;1N2U`Iq&rz28f^p?-w&zod6w+g&!swE1IH;-b4##e)i*uTQUu4HW&w zLVm|)_`)&N6Lg`CQ={&HCzw>l?eWvCm%h`_{l*q`uGfd+#}oj_*5lr5Uh|K-gvN=u z=i>P9lkKyzFd`^j1;+p2hrcIRRI&q%=BB?cnd3k@>p?LT)Q?$D3#-|~&44^ou*%F_ zrKj(F{45*F+W30-<%G(4T8-9i>*0$OWL#xPDyo)emN%I+4VcJRekBZrXW~}IPrk0_ zX#rZb>Qa47HGX)2-Iv@U1mqd<-&ehuXzll{Cig#yj(sIkG_)r^1wOP@G&>t_*TYwrCQ3MEkps)`_sXzA9{bufyNZW7GME=iomaaCkG-%tXC) zd3(j^KcD@3_3?_?9J9IC*Drkf+9|<=)Y3J@bwcwgXrN#Gbj#YQ_FL9LiBdV4A#_Ap z>9KH@NVIcQzvKLO=MCWREUY~ojOPS63wt&EFA<&e{|7Vt@BHU~@zmD1|Dl|ZLHJidtfa>7{pmX{3Y>$uN_Et96@LPhgUH<ax=H3eB>YdJHz2Tc zO`t6=#M_B~v*BXJ)_g)+o!tKXv*}`>&~ON;K+1V6MsIb6`?*Y?3d`4hz@GcBiXMs& z2<5UH6~*6iI?MjAhEhk9CYxh z+5mKBd;HbV6N7)r3=x0H3~rxG{khF2PJhV^Kn@3ONoG@qP;iQSy+29c7Z%xqa+i$xtJ9-#I}EJK6GLK zP>kj*=EB1e!{C#6rOmVO8W(RMd~=yIh=NcJ`mD)mmftzg4TD z|D$TPMSg*w_P1&kgFx!>iPDF3Y8Tv1h3WFQY859){t=aDHo-J6+4b}D%*YV~h=0nSa23ptU6Og8cI3K^!;-KU3Brw-1+;VJ$67M1> z|J#>({Cn|nHJq~c1teG-``wEtfGf^Ir2@z>4IdEfy?7>2g~7Me||)sNq*uw1n(9LqEf68~cPdeI9*cT)GQNA@K#A=v}CWE>afs1uS#R!oH-GsjU zr*TCNY+T`qB|RhT&O!WbT#3$tYii<0K~3*5FYl2DitMtSd=XTQvF?2Wi!e5v{3DyjBgel=`ZciMEkT`+vqzc80+;}i=40vgnn=fjc|Avu&Q zP=RAGXF^_s;0Qn)w>$$>p&~9hK~GPDJXov)hc&&6ORf}rjJkLzWW#{K0A>u_E=!ka z#y^#-4R&ozuBoOL6VeI^{^M*R5#{f2% zL=+>4+%8yX=MINmXrv4NkU6zoJyA++noMME3{fbW1+@Kk5M)i7TqL-&tIF>((%k?x z`&*IG4Ej)5#}v+w@>!fvP3IBHs(~HS*(h2k?PmPlc9g3iAr6-pH49b)Id`?TSzFhy z(P7*Puodwyhs}+~-gdn<7--CqJAk0qa;Vh8mogn4(vDkJfaQA2Mp!e1YE&hInygm* zL@YR`WIvveYP*^^_-ip(&;v{#^*&8@HN`E3+G#hWxFyqMy1IgewU0L)n`rCy_Rnhj zkFMpH&7+=r0cQMRDc~Het&Y))K8boZwpv_0P4U|;<9vs|BI^5rsmlU{3_x5*Y7{H! zLsVZK9zrp}M{X2MFoS;wV4`Ud2Z{xEUIO zBMoY8+G1#PUU!qZQoJP4^$(!4m)BLhNEHc4MTU7Qn(e158lp&$Gb3>G4AK0Ogivm> zsvcFC*Iq_Fi5v9HaWr`>ItnKDv5J>V-l)e7)vIwl3@XGn^#)WPV7#}>O)9(+F|`*x zoxHzazfS4KIV}${EA*Iu`8qc6dx^DG9HBQDtNA+Xi-HpBBAEcLqY;!MYXk&{L?&l< zOFl7?sQ1}knU&1{w4&_(wxXcyzEn2VRkK3t#21G#{+&w|Xr$%vbIW?Q%upUeIgt(g z2rUGVel1PnyOKuNy+-2XhSgjB*1eG?WS^Ju^P39<WJXv?gt{Jp1k ziz;h%?bMmtKBU_Eh^rIz)`k-zWwhXbaBgQR3-wE~MMNi2tTQF%X(2wlO<*-M8Ilmh z*-7h;WP&GF+RC*pm6X=X3T7L&Q94J!vSiH;C5TY+%9SBT{(^eQ zFRd}NjW@1UMyCTAe)JP=_Er=*(Qy1?dVxXQNbS6V*mF;mMb1T;BP(3&iJ&>@ae_YZN-HqYJsED*B&$Tpl&1S za|Z}F7@_AZYtW#m`?bvVDs!9)dRA@_TGin0U;)c18qPT5Z!0uctwupgI#XYMMnh6q zzYg}E88JPty>u#`Qc<-lI|}zezdr8@p?sn#r>2*9(5O4^sV~v_Qgm|T?bic{W?e8} ze9yyOlG(_q=*&t(KBk6`wV{!OK39X2Ha^eDcrlC0luPvbxW0q^p^5ofI1{UPigQDR_9LXNC=f&Upy znMXZ+3Awu61f=nOI_6~EmvR~CZPDW0$k>|+oT%6~H5-OwvgTMQyq@C^{RJ4PbZ(`N z#f_>{5mm^y(aBehm8`FjJk6N>26*Z7V=-krBNqS(XFpQifrPWm3v5CrUpGk?zs}A( zZyzeWH{jvt^Uvkz;c@cpB713#?@!1YpH_z0!&FDN$v&X7@6J2CB)e8o+L67*ke{F1CF)BK?Y_u9X%!Rdck|>%~)}*`k>y-r+4Fj3#1w;ZZ zM_t_3UDgs+N_%^W;M-(YySux)yG)bsoO|bDypwKj5_5!k;YIHw^tu`4-<6c`F>FYz@Qkh^E zz(P2+t~gp-nSp(TBAE13`S(XkZ-s(+I^9Sx8V=(hP>!u)au#N}#$ zReFuLQtURlPuG3in>CR(J4$>w(AZuj1yB#r7^zKzUk`=9u`WiMmVIi56ROzw&GhW3L|O@HPqrTH_Og9Ko}>iIaa!v1h6+pLS+@<$a{_WrSgytqt3W zzBWJ5JC+Sz_Vt=mncUS_pKC=`OhvMaM=RKbzi-#|c8}vao7D1Vom+WrHaaTfK@hE> z`j0x3D3><}8a1gd8w(2u_OqH!(G`!W?LN?o1r1XOe{1^_3PdQ z@91o8t?%IeFBj`SP`|$o>=-C9RSf%T+5(ol^Jpx2b8VwOWw>vWnM@R|1*vua!qw_I z7x1fNBDvhuuhpo@5V0#>x3QRgBFE>&w?Uor@oDg@hWoS7jJF0)rzQ!!`TO^Uh3i+q z>souN+h%1|TvkqLq{@hL+QVCCtw@Gs=}G;$e6g}^%ceckji;$kf%qW2z@`>6!?)aN zjU}JGmYozi`NLS0`5;g&5!5uqWkeZ!u^uxsthX*D@)83gAgV)xJC_Ja(sJ~9P?K+c zMT?x5tj$c;r;tixowQuw&)S05t3x6H&&kus+xavRh0!1!_1m~HAZlA`d2zecpwz*$ zE|QCsQQlgjR;G|`jaW!D$fyh`GLCviJ1Q_ptohm@u@+h^f`8ZMlM!ssO-jeNk>_AT zxdn@6)a|)hnUFc%y=%RW{GCjR+rXM4@RLeUUf$VJT5Efle>`U!p+A|mM41Ml%cv*C zArwrm(%oji|vvHw#B+N5a*lLQ`S`VlE<94@{qX7pWI?=n~)kZG>hFgm)aOle}~dOMZzC zMO5qa9=^c6wD#fFlIqi%3xGC(F`9bOO6p#e8g(t-*)v^~#*%a_KZZDY@|f~DTm|2J z{W^F#cHYWk`dHz|#7HP4TnG_yeUkFEV}h$diThA_v(wF|CzR;QJX1*r&;wZtI*G)& zqk@fo;AgKV5Eimz2oVRHV}>Wr^@xe(d<9h-3r9Oyu);a$4DO$=UMB3fEgZ^)T{s4* z&ei0MT31TbpO1pUf)rCd%~jhiPM0Hk6`rC^eWxB@k;zokL-mQC5F6u|+q0?4i?+bT zB)1&GP*nk`eJ+so0Q;vbpavu$CB5U0cGri=1FemplwJ;1#yxbL14WE>P>Yj1X^)Oq zRr1ANDFpKLx|Z7?n>YBAe|@>>S#Y28M+O{O-$wpBX1#S&Pp`-$FPMEGm_i&kYz2={3pkN?y_ zUJG2fz3clx_sDuIs*6|NBYHvWx)}B%ikJp*GR(2F>r}QsJr-W;Kbk1DvB+Nk>6Wr8 zF#FVJo`W)Fq12KBD0E1I+J`MBs+vxZtBE6qhw$$d;+Dkbug8lR*`*`qgP^0;_N5y$ zZ-Akek*{W1C zu4jsKD?djFOv8ibDPI~RL9{{Kj845Kaz!d!(KJ`83Oq|LUa?@dvrkslNt%xNj{7+S z6}zEwiFI=OKlia_ByJRhDFjTzU*~Vpv`Ao(@};4?t%}*QoTp+B?{P zS~mn)bM}(M2DHEGIFV0yy(=f!P-mGyhUS4yEV_(2+vkV`{x-2~)VCWMwZX*JZp1+i ziPeo4MPhNc8S;13EMq;Z(>g8k^7XG^a*gkiTxXetM>#lK* zy272k?7&ZU`P_F!sA_t8c(f8Q#VB)tKq5=VNp!3ql5o1Xq#6Ye8l&MlE`>@CSbb&01zBTa%>WzV|-wf1w^Lss{VrZep9wBylh`Z#d7AsFnq zL2;l*&9#!*@E6j{8ju8niRnV&p|!1RjN_;`bK{J*@*c}v5Y9cmP?75FqSv}a>Ob>N zx4b}&Xwrf&l51o-jK8BFfX=p_Sq1q1s_Q`Z4F_y{G$^FsAx%vjst+$=_>94_Q(a`2 z{Q7DPT|n%WXu6+WA#%4&;GTC zeBIfHE}KPW4kS@!$J=llJh1ni0Xb`zeremV zM&aR6ynK3{3L(j$CWAp?8!DJ$^EF0K>XDMN1f+jBY2F*cC)M-QJ7hWl zXH`UZeqaIW(nVV~YC8E??}Pzy-R3?%lFYXeWiIXflebLN%hy2;d}EN2Q21P_Rh(pI;B^{mANUt`ICV7f02p>I159ce@(KD2OTB*T zlaW-KWo{Pm6e#OT>MU0{7=q#eMO;-d6*4si||Oqx?J77a4X0=tX3Tda%oL z#>=EfVxS)*uKVs=BCxRXZkyHCnW+R9W<8yxQN~TS~6p-4zQf zG}^~osa4<4k6MPDoeid=5?{Kcm8~rzlm)7vCRs8I-$6gZmt>@II4#g#dc^o2;Y$YO zpP%F=DkzNqI%N6x7Y`=~5n+ACq-B+L3 zvtF(*`C!ADG{;%uo#M4K%T4KD%Wxa?uCBWFY9Cv}2lFqzD#paBd(w^k;?im-eW^zehF&d_X8fY-scd&`bQ$2nBi(M4()4&6n3Pr ztKO&I9k>1{=Fi_?t_Hz*npt#W(=zn(YKw;3aJG%cJuFY-w}-Evax*EF#37x!z6Zl2 zVvY!QkBUzNR#y9iycwE^G9KwfMB%f;m<;2Dh-z6ta^SFqZhTct#;b3K-9Av@^M%rcG)HcUaE6Ov{J{gkkD?nZu*>n{ zCZcpL5<(nFd(+`hXWY1|f661Dk`rj}t46cM^j!57@SVU=!kNU>xla7pWi>^=+Tk+9UXCy40jVfqhRXp0 zJAaTmK+qI?hz?s`IhItIolYkFGXt8O;4J~(PdGSc)=tinYe#CLc%YDl&_og zJQ>+BUQ3y|Pu$_+uSUaV0ays{QKrgYs3X@J{)t53hS@#<8*)NO2l=cc+s*cV-Dc}GS7AU0Hq$LF^BT^?>p_oM|vts2pZ{7wp|zR;9i_13H6tC=MR3oEO34fB!0~#h!1+zW8FWcunkb zhHD#o+0fj059FAIxc1FIc_<#@F#G8e;Q;DU>-F(CQHj_xCl@uTG5s7*LuPv2r*J@{ zjiNd?5l|0DOdr0npfevsi>kwXPiXpYVT7XcbXCs3X~Mu$hJb|R4@_##-SfX%6J zMbXUKnM{VHnAu21!633z+xG4N5vD}OTh*P?e(T=WCIWk&6>ho zmn9J5l4bMTeXEA5JWPyF2Jhm<#oz!+O{%(>Mio_$(xd(<3)sO)T1ny|P!GE8@9coo zcLTZgR<#zic0?!xkD9z)evZ(6;r$D5u8|(+sq1PCq)CsIarOYaQ25eJp1W70TbHZv z^A-3qV)`hByI_y?>~iv$`!=We+hjUzxzd5E@O@KP-&C!osBJ*c)1RFD>J0%Pubbjm zGNR40rTwr_`W?*8Krf4ERg%;)T&*~w3)$3k)5wHH98Cn29{HY!(AeZTTB?z20u)aF9%}tJ@gOuqw4*@pb7}9 zLX)a3i~6CGI@~#hBS;H07iEA>i_;WibP`m@p|-hG7YUgF>(cFR&eErgY!?Q zP&iICo*^@1agA1+L$zJDkG~2jYq3v7q^S{a3TZoVeSUk;{VT)c{+5a6M>QR2r>T|51Qm zDjZ3zIda+RyL65Y+Ykrj1B-sEhq?ew9tViyE$3I4JZQPQ($0#>m!HU$52Bl%W4L21 zqmX+!I9{=QR$F(mor{2JP?-Ljl4sXdA403)vTQ##Bl87#!?PL+C-L$>8;WAy?g5dy z`;qNRD(IvA#IZQkpApmm zgjgoL3ec^|V{eCVJzII{M@(Y%d}3W!^Knel9pgT{dtM#i)y=AW*|S0xSLB>rn~>JA zc9D`fbldX$9yWKXQu!ahMn;}0$GYAsG!&!^*9}QO-^H{ST4ErM&a4X68k~BRndB)o zU*m#bmXq=`-@!jp1C3jx{T4I`$RW#rq=sZ6F6jS$Wb=Peo<1B5z^ebl!2qTW9ZJ^! zb$XTbuG8Hqz3n%>i)$@qxPQ`tWE8Et6jxR4sOuk`c#q-e>4L^a!N`sz$uYYD_t#*h zJ6(KjJjC}VUh?x`)8d`0*UrO1qFlMC$!Wr=Q*RY0wEeZzo4jlxqcK@e@t>9(VE z30D8K_Hx$v{@iavv8^S1okbm9*oM=8sngo9o*B~R9LDyOPtp=h&~WV#VAb7L3we7` z@J*|59^jFh^_W}-&4l>tH21_2&8;*9G%DqJcs?8q6X|if8j?#q1-I8WrlzjXpSbW5 z08*{>x8m}Qn@l8>ItlMw*S4)UjBtkdeWRNOLsa%R+R1${GQg&vKMix%Ky?LE=LA6<*ovyk8z zE7xn&V&5J+Yjz;BNp82J_wvHLP<-5f_xz0i^!#ZbJ^ysoP8zW0_Zkpi03>St?fFep z{^|L_fj$4!t*z&ut~=fvWT_li;s? zArorJ5Aa$Es62F>*9=OiXc_rB=p&ihlW2NASr8QK!5k@g$3yPbziW_g9d^B;sN&VXRTeYnbD09;5LCo_f;** ze{N7TIXSQ=GY2Ydq*fg$ADK|X=x$tY8oGa=Ri{&La0w{20_dTAM&z|x zqz>*>i?54r_x9&+w){D@*;SJR9A4Jb?Bd>{{gdvDVSJ# zg%I%f;&p38uw8k9DLQSK9k`p-Aasvn{^#O#&n^6)i&w?ae=c6FS*0t<{)??TxZk)a zS=iX}`zI~1=*LiXkhqf!p!nQCu`~1wDz@(n+DO94PWM_E6Zi%g5j>EtYJ=k-S?vIa z%qumor(bfWED1=AHHG-&jS;=$G;V}~x75n;eI7QU6F^tg2>(5NhcB+m@35})>7pD{q4#G+7DT8G*`4s~~x^mvrZx7ycKuYi2IlB5HU9Vyua zr2dw}TI7?vm}^!?9ovilQX@xZ6d2IKAU8vT$-V`8ih)_UF$B*m4X@q2chw$4vB?bw zh!ZiL(jm}m0Lm98#0`1D*~*BNHsxTQY2z%)H>M1keuNX@*n>Go%JdPZA!D|*NC-Dm z^~0<13{$zj)Q)TOA(L}37g8vMxuQ2HJsl7!B&M`MsBn34hk-P53l!`eI;cb#RW$)LOh%MLaMIkGOu zDk!{|x4IB=jL=~RjJ22iSGoiA;0lvt_8-1@BP}16cph-DxB^dJy%n0JF7ROT6ST8QtCvLglysd|e1FrxDj$1yde;`U`>P8x+HI&yCJ9I3gMzp5Mj~GGy4DAvLMp1S~IS^F(yRnJ>Q^7 zwwgl|Ua#LqLl{sG9_H(AY-TzfK6861&ae3jQjgk@SZKj+ZY!lW#*O<~{Hi6zr*}IQ zhD?9fH~KOoH8cxpnLqfc9;|V#G_So;$-6j)2S3+V>&ck?vaM8me#|5Qd%IxbknlzV&&LCIDzIOF%)?~y7Vv{p=6 zH_^Qi$82@u&D01*nNNu)=^1wd+_T2iCGsWYTx3V|``NZ&LV-6bzZCk{KCB3XvVBho z(z_BsD}veZL?sE<2h)|K+!|AN2`Ep49@@bgj8i@W$rqdT&vu}>hEb}WUGo0|pzbV| zkbg4kFuEznyVcYNt_sFaR7p}*NrY z-ZmvKBg9bn{E>6?_US!+#AviSxu&r>Tm`<2S2ywf*}8iPUk1K;4^>-X&bS@-8Xg^Z zf5}_Ej<8YL(e>MN#`vnVF+;0DTVw=;wE{}tqmJ7i{+6s$SYDEPz=Do$H$c`$^`0{(m1l1ylrgDw`abP0-dCj z9=Rnw!N|%)$t>vcXN8lszjXq7d=4FKt;Cuw$p z(7Us1A=wB0XGa5)JXLPikL@qZSzn9iewmAH4V~#OWZ^+-0<~#Ojar9OcjayKx7=L2 z(~d5^Qf-LfO&{7c3q|}bIG{F-_9ZGri*Zn!IVFzaB)B7Fi)1tC`6>4p6e5!?Wz# zYN7Sh4|m1qx#7`eA1(1y%U2#D!LO_!ufN;Fy3-lG(EH+p5XVQYH?`1&plZ=a;ubTA zI=~jA{3St9(s-5m$nwm&6M3h9RQld8f)vM_vH&1O1@T{3{I_6ehY$H8rzGb8n7<=} zotm#cGugjl`)S>DYOtaJ?^t`Z)IHhhp?JCMZgy3#NZNe%^W?|Y65bZMxK3Yc*PA6x z>ifaKwjgMuJKOUvsaiqnr12#ZH=|RW_SYo#%#iBtfh2;Uff(dJ-fek9@Z_tifg5e*2(?3EH!Ewe*ErB8g4*u-9 z?Lo7io{=s|v1L;e^*YE{u?r^0Dx#?|(9GjWFxlvOZ}Jvi7oYcz8-&vC1Ot&gxIit zfEjTN5s92$05Gg0w@^G`%;$mLaMA+9x15YD-l`9&iTDFole8|#LSTr+~%_d6-!MAzPp_*nIUME%Z%`fe)D|ban zmK*gsRyPybu0&|jT`-^<-4UyrSa-HxHL|rc{fU{y`Pul-<27YWuazfQzJbMZ?C=wa z`_FGVJHU^uB|^kb^E<9~fA;Oe4#(KS)nHW22SA%r6s_<;h1t(&k#{&V8wrij{OHtg z5>%AlbAxjgr~Uk~$_<1(!7w|YvjBFwKC$HMRy{__uWI~%R8F}uV0)claj#KouAP0U0Oc-J63@+wWU0*-Q1 zG26b0MTKi#f=Thgbek7&sC4}@a?NOMGY$G6)2#kDvZFcFP}B#Ow9NT+uabwZAaVc;d3ag) z-#93xBI0$k*jQJ$zg9~ia=!vK2uEf$sXz^azdHdqP=nA@6DVfO66PUcK9i0F!y4s; zySkM)F=wkvj_JthXP)q=AEuIQX~{k+Z2~uB%q&xa=b{1;i%lkJ%e+S%wSI|MllNWj z{+Xf*k8-Jl`;n>C4BrQ1Nd=(zp6e80p~ikrJqztf{b-9VC*r`0d%O^y*aYiBV_E!J zmhfAcbabLI?M?$sb9ki3g+zzv1PTCc6Ye7Z7q1_*{sXjA#p$IH@&n=^tAe&w4JeY? z;myR4&(#+fG)~*l%NsEbPsP7}@8A65`>diGYRo;{$TI=W$?PA^gS!P-v>I?O$B;k+ zjf2ItMx`kSdJv=zj769?AaLoDKQ^avgvtw42Pktz6nbH%7?H$xldU;4%&MT``xlwN zZe%kmfF1-FwYV*~!|t79m2G>X}G(aE3ZDT(Y~o`EnI0#w4Q+j{PMbiaf5E8I(=P z1PdFCPUbvR?!a7*Nll&33a!wQ{iLMIbKdizL8v-4IAXvDa9I*On6Rgn*VP7DjR3hV zXrEn(fgS{e_Nn2r#0|cz<_`}-IxM#D7Nf&!?s(7?na}=WT_Fb&(1W12B#3-KNaKi5 zQAq_)hA2?{ykmrKx{9iM%EvqMJ-5hR_BY)=HhP0eN75N@h%^{%z~5-jy(?k&p3vdX zS21r6&=lB3$Z0T1DGwjQvS9NderkAIfMJ@4a6uTFx;8}p)GpXG#?MotZK1t5q(p$# zXfTY#7oF}v7kQiHUqfAByL)vEgdt;u3YAVvl&M)it26T2KzRM}b->g;v?FhG(N)RbvHRg{mOIWTCva7ZJYyf>yYqi*SO zqh=lGJdoGmqM*_7PNvkD6HY++d%jg$8X>fx~r_mn@4h?WF^ zdFvAN6KcFF*dP!x*ZhxzG5!SpGZ}~6S7w4!v{dFYzHxQ?Dd@4!M;sVpfqL+HRNZ4! z&P+IR2Bn_ryOL+zcQvTQ7!=9`dV1j~DJ?o{qg#~_o2|b&_M!zc$oMKfu4n5j9W0+q z^72|zzG2tr3356T-7($ZD+}TTm65*z`iHHXVSOkzy<;M8G7P-TSgwtTy_SxwQV)Dz z!(gWKrM$w1ySns#KHyonCu!g57jB72J$6gqX&b*+tP22@2jNuS>NuiG;`u|%1|CQD zSbYf56zwcUwe4D;J)7B+D!qX(?QMVG+&NgE>@F<~*Vh8Z>uW0(o?O?2@K|2{XyJP{ z^QzLn%iOxFq$fCWsaQuGYFb^#l+FlnTK;(w_;~Jp*pYR630&v;{6GD}O2#I}4#qZy z#v-=PHcrMy|4bGCD@FJJP0@xQDH=aRV%f@lRehBaT}(*kSD|>4mUIJJ#pC%sUcAS5 zmlIAwCc@4nNz(CveQ(jbi{gZG!{h8@<*UvXPKtSgn6dF_*vj<1^-9BO-rBE#nVzc2 z1)?N9p`BhGY{qp~c?POn8@!l%IY;(%oVp~G@LcoN6dT?vS2+O$5*yB15uR#9K-v5t zS+;f^5ydSx!UpbEo!&wbZwCgwX|&Em7BtX3%u@i6Z~sZ zK(T{_8M}vX{?f3%w7l*u^VJi8Y0mDlMh!*+Bt4$YJ~oDNSWj<%kRInNpMfD-)z%vK zx>X&hHn2(#3++FRnQMKj9#B5%$*jV)iILTzAAh_aA5A{hIY^-+h718dx{hhg#BiU@T()(UFpD|^(IXSM`A;N!xrrnI>(KNMB% zLMRDNB1#MV9j^tWx~Xa1?sHh0xV=*`;)~VH^ncpcAyP2(Y=B1KgE`;mDU%B z{Ie%=xGn;u`5!?WqS&_M1*P#+sT z-O_>=dQzlK`C{sr26DZe1e8%b+6xTw>gYLZHCZ*_PJfHd&NYOz3GHC730AfAT*kZXHG5VVsd{X^eQIlauwU6Pv^!P<@dW=jO{YLK{Q6g#J_CP_ zAYg``2MmttVM-?y&~b83m5yIliq{+4e2Ej>|kx&$J z==vhL*Lm z74wD`{6KKh0yMgrF0MG$ST%rno02D}C@bcSnsXCZi-4mAd`hy<{-<9ejmwNlfs4cz zA`NO#GmVDXtA+?CB3Z48)({@$2%pM9fsMX0=dAWldc{m3e7J&7CQD^j+3H;)CGgyB z2YCmN?Wv9Tacui7kIRmvL=j8YWcH_pKY}**RP@o;q?8G~eToT4&o=fW8EmrY=;)<;<2(t4cDc+_M9XKZy5<~5ztt{1aUKjN zTK!3Da+Gu0sEL0h#1nKnu%7^R%!3Exm?^@kSR=JZcE+PE_JguQEwU!CiQUnWAWY)0 zSEk5gU{mQg(_UzRQ*fT2w@&zjC@yIjBlP6!v@#VbL(CA!Kf|#ns2c_?xXK`w0*V&) zj!mYeNi7{~8TqOP1QFk)esPpiP{&n__V(db$ncp4ea6|Cwz5^OTkhFnXKbKYS}Y=O z2y?a;Zj?nM&LHWo(#1g>7dKRy*ORD#k4nrpV4{9RE5Yaipi%F^UDSJDriS15+g0u| z$YTyn8(+#AxRJwBvhvXv$)k!uK4gfsg2fpg>gHAi0`2q-CFp?BKU<&yJV(sy1eY z)2uAvhR4VR(C5z6#lZ!crE6t;C#d==dA{8%cE6Xs5?Mt%FO;R)yUPrCYpq|Nf@Ghp zg!vIc$4lG|?)#CvpR^7jf82 zDCYd>x0w@sIKPmDn6V03Snme8vCQ56#7kd5f2nXc5xL5|!j%rL4COCKp|PKUjy$2Ci>OA)JUwFR#HsE`wqi=_Nj1dcywF@fB4=b z(&af_aJ6JNaJL758A2$}Fr{HwT9anEv;>u|RX#vhtbpDZ zql)4qu7KNBJc|)n&U9pmuh^(CH=Rh8Z@{I@FuHWKt@O)$ZtUuAuymG>hhjXnJ^@K@ zIKJTtuGrB9EE|b^_-mQkVs&eJgxW>k5nqi$B27Hk%thXnb;5&+M!%o8oM^0S!UHN` zG}+!g9Fm)a@=7W@A(vMctphhFxGWx!?z`*PMo0gS3TxW%hHxdfLY87te5=N3~1u{X7nPIslXFd(+H|pTtJau|5Qw z5XHx3uw^Z9J#zmT``Cs(UVLuF|5YIFRi_!ZJn#uj*CLlWTAYcKZy*qi)&rTVc|O_q~{ zM)|L$>i^$3_RkgtI9x4n+# zXdGMnX+`0ZPK%0OFKZv%jdR6;G_>@-`EXTo|2zxpzRm-ruM+?e$G^seDmGTUH$>AO zH@Q~WoTNlqPi@a&*&IOe-_joMbP@J3BJ{T=IlH==uGNqDuB*3MT4G24{xS>?)+tNj z6gk%ShIGr_tmmqB6CCI91-Az2vIH>Ao)W_s9Le3X%`jq`5j;ZlO7$49rbJOAWxecW z$ zWH01)&1nR|pxoA)#7I|!>Jq;;1h`yn5V%>JUC)!v{p?XO?fm*V2DEwHD&vJs(&OL> zku_n7^1{}i8&1Qu$#a;~Je9{J0Z%K_=1eo(53{eBWR4wxm!fXrhTgQcP{pCU?VEKB zv{JiUiv%jigb^9$3JJ%m!&|`X#}b(aH0XbD*qzvRt+~vW4-8nCG1y)E_0!Zx=nd*`z)XePTRyxO@`J}L?+6z2hk5rCl&m>5! zur>Sq_TwCTCm(*z_Uw_fWFHO+bzqsI)?{7e6;A6lTHW))uv_BtV zBAsn%PS&GD?AGF+ZdV?BU(d@K)qKHs9cU12oWZ>ec$l)c<@w{^*J_dZAsiDVhHgA# zO|hGTW`fw>YY)owlMlxu%K7pdXLG*MB0;|%x3-JX%=vJ7vBBL^&d$w9*dP%E@U6#= zWH_Ls?KG=MOADd<~T|2^acZ4a8Bbw{SSnp{>-_XiKNt zXPAYHrH=Rwi@~H(qS| zz#ie72`c0FS6&~GbtXC_eo=q?!uVa?4l^@f14Y0s(Ikf*b}) z3VaT)VC1eBa>97ReLxc8hmmA&Y*V|{5AgQwn$R6)DKyhu)mJgzHIfK+K<91J2E(t@ z-6s;kb-zBKa14uDxF!z4JT}{B=;sUQ*=P6AK7mnE7HpVU^0652>_?w!!W2R%=+Lfv zF}YU<-_6ihNTD^vj6CU~BE#4}@8lScwCSISH%<3m9|=DN-bBaEsa!Z9i_YsSmMI+A+k-0jwHvfj^i zSPIb3gM&F(;o6iTc(nQ1XM3M8M|&_zTcb~cL$@8*u(&o4}c^7qXqRi0MsS8 z1oTDRZ2$_?l&w~*-M{7@60)E|{>%OjW(kT2Q_Tt~i_J{r_ORm@vMj$o?C z@-?W2jAmnz*ugXS(rbfyQktVMUPdXKI$d`@bxD?^rvVF(rpp1DfmyZD&% zwKob%O@Q$%DRZ;WqoEE9Le|@Lk@lpKVL05HNsD4RMS$;m+?Me@&K(3ESym=nb>U9@ z#|Pz3Z&K$i1PFG7r!GXyU#VJ*-0FL&YY)u>ryFHLO(AjkQFdaDg7bcfc**+$icmk!vUX%7Orcllx%dyh z#NJf|!d`pyMfq1B5PikXM0JZ4#bYO7OdL-6<_m~GF)ZEUPS#t;WtVA7sY=U~AL@2r+J$Qgx3?y|gok*Gx3A1p0 zi2`8Q2!93Oj%uIyj~an?XmA1_0_TX4gpG`tn?`u0gOJNtH&&9&(@>iY)G7qO3neY# z$UkLS(m2Oob@<=m5K0#68~>>FlbLXZczi48))@Y5^9#AB3ran4@SbkQ&cvI>b(xDW zc8*gNP54UI7z2*kdEHMmMS-}Wr52(5_6tBQFHa?lDJgb3@PxEBY1C!=g5moOU0tdM zJXt$oK;6CnZd8DnAa29fX9dNwv==KNUdO0`Hqx( z4Ftqi{}Ip9XOfVF{fMQC2U`ywF{{{`wS$Lo{Idx2-j=?gj5l=e(iP9jJdma5;{za7 z`LjZ-j;~bc+XTN8j6U*7+(?(G>}oqaRgMgV8oszUX8Uo3zwi}porznKHb)Mh$xmZT z2Pq^h=8B%kiKGj$PbtP;FBd{0H5v_jt+9)UTG@WnUWJN!!=OB2dv&otTtZd0aE(-1 zgIqZ+6ZJ)XGB;~2e*qCTqpxqIat45}Or>FQSI12bKDRGO(&fu4Rq4^E0lHrt0B4OF zPD;I#dRHmDlr=U%BPP9PiGf}x*q#;}5Po$N)ThMN5 zACBc)lWMBg_6FJ)hy%a=PNoe*;6fgQn6q~9neqgySR%lVM%urQ(Y;YMx3bc`<#RVd z8}tbY#n9B9X)O=?@wyp0Oz}`>ZL?Hyt}_EVn#V5nir%fGa#cF`EE02I1}t?uUg3+) z&|RHYLc9zQMF(hG)NR#>Qz9VGON7IvTNtN$zB3c37h6|^TgzSE}E$QNc%xEOBAuZ&a}gcokX%t9!Xsm^|xiyE+sO|dDK_?j+r zR&d+TCObS>5T`+gMyY(#T67nfw$~k8SyQEAcam_`wg=S9C%1xNP>!_F+MTgGM zY2vd89|HcYq1P}DO*EjC00kRfS&ci@5RubNM=9k|*xYy}^0V?a;ebd~8F6Xgq;grp zA&fw)lN#-OOasakP|3;-PDN{uGQgJ3)vPniMC z$qJ2MJV(L9p+T>If+T%&IOJ7mk+(qedgHzxQoWSDcrR|6yjfW{V-seneUqm}yx@z0 zk$HK)Qu>C@94?;juFV;y6vGtSpDAh_lNT-T0bOib&L0+@)tKUmT$uG~@_P&?Ur={s z8FbtBVtJ%N(HtOzXV#S1PQd%A;!XszSDBaFy2(Prdm@CsPN-|Svt{2VTFeS2wLnR-ovqa2UOfW#61u}K%aH8;dqkpnLZ+-Y} zw#H(UKa^J>1%-!qG3I9keiwK}@tc)Rk}}2J*)ffvVzY$Z%=^Yt=Oi$&w~^3R#N#31 z2UZVGa{7q-;<^s~M7VTC{G@G4l4c)%?w2t!QAimsYw8FyvLnN=yf@@(FBr0yu>IXn z{Ajffl0dKR+K;1QUd7O&dS)y4QWcC*kDW?hC{|O^NZ=i zeme?yP^##Gh9Q25f6apR?Zx%L^QU{6=ydhZ;7STf_aaA_v?b& zD&_$>M*sO(ztgY^YRSiE2G4tZH%Qq?c}!r#8>@R4W}$=6Xk1TK-5$?q83&sdo1g4W z0_IpIOcxoEP+DIpQ6iS&8(Hmr=3st6^lx6(`Fq>K3&bG?X#QV$HPyfa;(zud{>!M! zrcSP=PQw3r2L78B5ds@m;`d&@Lm`l!EC%uSw34!TRRZ^bsU5R8FRK`4TRv z^@Y}7JN9O7Z;MK3w$v$J>=6;`BbS$*=H^3}J^bCg=byeV!u-zDGowo*0}Tt`j27uH zTB-owCb+K&CSq(G>V&u_ky?QZl?ERvE>4Chg~Vb5x)bdk9jrIalW|)b+13@rh@Z9- z$RcvG98S@J>K`>1E>1!>)tC5E=Pnk#%!4g~nZJd=3Fb?!fRA5>wHNVF09IR? z@wtnd4ZB(Kfi`T-Z-#>0KpFNB(&#b%{42oH?PBWsS=(v;I&NxsSi7y)Pn=!o@%(Wn z-fe>|rk|uhNaZFfbdenVai0m9amMxyGjdr(x?0Lg!d z9e%z47}w~${-T`_#%*uH1x0!mNlm19o4Carz7{v$x@BKH`Tf4Bl)G{M3tHgj1;TIi zI%3V<)wS8xRRC9UK!Zc8TYmbx$-%=r1-rfQgJthG9tVrxH-yi&BE(@e0|1MpGiCTy zUuTSW(m=7O*R?oZx=!i#ee-WZ6D5Qlk-B#c=k?hzFe_sSqbgV0c+9zjpfjKqy%WReNy%#=DldY>}qkNS@qB=rsEB+31dR zDfNMZIC^LPiW_opH{1z;83v4Ft+wc9rq2@L6O&PDy82T5J^!v;?D^#&z%U|3mItpCN~;7`JjJ&mF2w^Bh(F7P zZZ79chHvK|_$vU6Qn#QfWs;v! zN|4RqvESXvHyqC56ruS9x1ixl(?=vPD&PA17j1XcS>^9ODkXi+kuMC47qgIWf3ObW zy?Kn)b?i}bgF~|iAcBe1Ls^FuPsWOYS}5aemXNb271=-V-+|3hVR_F8h6SaWP@c$E zeMTC33!=yd+^4MTTWkPmqke+>Kx4q)$Y7|j^@+C^3Hg39Bj5jc#1})42Ea+!F$$wN}VKoH~J^E~EfzH7P>d0J*&iEiv=Z2iwDNuFmIaMHAMZq=R3Jz`u}E{R~sNApF_X1`5iJ`gVwpAeJb z=ql84{Hemiu~X}J3@LDhIHojhUKIx{Zruc z(%>S>^88YdL}1p9YY+oMbOgX-VXs5xHi!cmh_9*514NL`aBT^zdzcjj=$(je)1GW# zYKi=IAx{TXAc`Z?a;N*HVIltN%H8X@0>jkWcqkNBqZy}_;OEV_6^@TAoZ!3l-Z;Tr6wke%H%g38tE~5^k_x; zgDG0FTr%|}26g7@CNuebjzC?@`Dq8(tVnIFc?yYs*mI=jplA`X{HQq}CHBaB7Ui^O z{lEgj*=gmHUE+aSiCBiIB--(P5-$3m{J`cp&e^m9oS{EvHiE%8=+TPIXqnXc$w-?m zfcH!-`C>WoS>z2p5>#2pe)xBcNp6Y}v5$h7Ji(bZTwxH%_TXccRVb@2Ou`htN72aO zpK{BlFUStY^N(1_q;NS1z{$aiAPEH+Gg87&<^GAx-LqBeQd_IC8Wp{? zYMM*MauMLl21w*AMB+l9!urqA75M``z=Q5?vc&Zk*OtAd1=Gfd*>5uDm9bA+{^2w1 z6Lsy5pQPe0BR0kR zBscN3gXtUM(TSp!C%FhP!Bv`6xJKN7QTAE~zAv6C{A*)g zk-n@v6q~84$&u|>U~{6!e#M!q*k<7d5d^ zE_P@&$Wd1Ni9X1&kw`foX);5)hTJRit%en4Y(|3FuNlp7w0l;-uNl*7Szs1^ zbMWBZiy=OVkEDdwGN)s`|NgP}NhXF}IX?KyL*LOE>qkOTn}V(?fPq_?ta>+}6?}*$ zQ`}4#$(JnZjC7shCe*EIs)?^M?TB^`_sJIqZ)0iBJ=6jtavNFL*lP8jNV@K=_lVb- z*&sy`ej7`1Ps(mPosU@-ZZt{(dTh_sT_5XSqBCg)Br%PXJU_WDA1wK1SKrQpJVE6# z=kC|?r93N}fU-nAK=hf}NMoKf+yg8T%3+zb?JkQSw9J@kK1QN&asv*|4u`eNE+*i? zmaodbQA|zsM-T0E>Y^s(aDD}qQORrRMMi4X3L9P>$m@^vcq2cv5lM?h=olxaPy!5T zIN^-cf)28Q#Ru7g4>PeT&F%?Z!aruhjY$n+Cgu-~;FHv~0MYxJ!(D$^+_==Ig6@$- ziGWQHCJ`qe-sB2x#&wf$_4Mt%1S^nVGRjjKE zk%P%K|1PJzfou5e{qiOoprhkMSskL7v`n0J3cya_tL z>a9K#9=NLv0Q7L`*a|_KrSNAF$EFG-*?9&ZR1!Apq>+!M)pMYZG80UHT*bIMCuF14 z$PJDBMC47t-Fx5N0LYS?-REGCFsj*{#GJs-=9vqzKWe>7!Wt|Ye8@yyf7QtJdCkX4 z4d4AsRfOns8cY^%mk&@!oiP{pxunJEVZPOHR0pJG0q%5Xt=@cHCJp8j;v@TA2XD!n z!0hg_z8AWhdnsZzI()te!qS~il@~xt@Pagv_s{96X(jcnY{63NA(vu-lYc0gA7()2 zT&Dys|5YC;c+@yowf9`v>PLP|x=E zAe|nBt#u5(i8GY#?>BXzSY62!rc!HuQ?r>8^!qy|Dq#nd)w6O{mNI&2s@43<7e;Aa zfKjcG<@w#3%Jh@@W-7y&gNr&zp#~m?2JVTxna7M+4Ym4F_z2j&!Z^=G(_cfvmK$(~ z$&g}Vs;Y)Lo08J1R@c54{R%$=2W(_}NY(ip!ksAr5yQUhI zTnq12YXP;0WkljdEr?hKwEOVzu}p{)ZOf=97h&7uYhYjTK9g8JZH9K=6!xTGNa^={ z2JKU}oCzocQDd1(6qdl<2;pVpUm^9q^9;~W-`kC_gaOINYiEC7@-|Fzo(aQR0Ixf_ z{Pegb*7pgctx;CT$_aNJ();DvPx=2+2g)bJISU0H0ts`*X;wlYF;@3G0jw;RQX|VvnJPL)!d#4q-w) zSMJo4w^Rw)PPB4-Ai!X@n_JzL@A|3@Za6?ck2b%%Q{?4{u>EXxh4E%Kx~J>EPvEJJJ^0qi0Udoa$>&r{v3#Y>npkyi?Y?;ca(%;(X*B1bi z-WT#e%}%L}tXKtPAa~XB|4!_+)KLGE*#AEq-hbus+tB`I_w=76dJ2(s_$zoqlgsZ( z*KFQh#XriGlnYN+54793{@O+)ZNKm7!QJ@qK^NZZI+qlszg*9`b2s};#~r!+>)`Cj z`Fe4m=8cn;oiGs#T|yZe#BTdB^PF!>j0lKv9%)`$CkG!3kQgLGNVDG%UF|M)f+&FPo-nH`iq#{>Y!>drzI8%~jkoW5-qY)|J~KpjCiG zyK2hKGk`f3SLiMSsPS&SnEhAd%>n%YTQWFjPl)&Mp&{A%lOT2scwHA8_%fBN_*-L; z|K<<1*d(&(Zp3Z~P~q)>&aPPgn|6pWwaC_1Tf4~3qrThT8jjVgceqnTS3}Z{KM4pm zu(7+^Md*gH3qSM?6~Eg&i3f~$$VeiP;f-Zc6$~bNFXsP`y@01Nc50N(sVHsmKYIar zf?Q6jRa3WUV~4$-U!ZLzGs4!JF+zt$!w;}rjp;Fgb65c*Q9R#MrbldebpwC6x38hn zyTq`J-XQ7QLOHsU&k~pUv$*49&lmy$bP6GJtTX^OU>Le#b_r4VMadW0dQBc>{0>iN z+@wGB$A)-Kn{k5QS?6rDMChl8SmgD!jY1u457D!V+hj<&{mIqF^Tw7uo827Z`h$(p7HJN8D^bxwN z0<_It9tu14u=8a^=!WKO2_FjwWyD+&f&oizdX3Ostv(dYmBVB{;2A>ZU!(y`J0^A6 z_74H0#AM?*J8TO8^t0Q(cpFt;6--B7^S|zb+V6ow!T#`COMJ)vq4ZL9GiZ+2n15t%9 zput-Zix6n=?xShEN*?}pJuPUwH!1v6%%pfNDXG&#+2jrUae?K2e}suz1`6yj95C@q z0Arh&Z5B;*9i{F$zr0M}D@~2F1?EWZR83W>1!yh+?no_bv;fTo)x!{-=&};S&(BQX!A@6@c zg949Toe$Dqj#*j=;`wX<7Vd-raqefX?jNOhlTUnTnx~C4G)bFS9~j!sG%)?INNu1< zO}5P4mQD0THeF3w4mR-kYQH$!>xRjCbqwVt9diFQ7rdVu@EdTP7=+2h$yd#I9d6Hq zei2+EjDZYBzxu@rkKxZjwLu#a)4+{t=C)nm5h{EOF$!pv!vZ+7oz4xVk3Gu?857W_ zQac1jr4irZ89P`oOafb-cNjM|^_5jZ10c9qtt+)Y8um$A(jO#<-I|f%zu(pQyJbUZ zI+uq2vHU@)NG9+!hH_iif7}k7_`rPA$&iscFhR@0uotDvYer}?EhTLiN0;bMv_M1( zS>_LxfHf4q2Xt`sF=bq)lLUx#h}H5#tJ6h|3EiJxC@Bg_e$}*pKW-Q_v6TtPbUkg7 zBF9h@h3_9NTs+Cw6AGRvFh$uDPP+41nk=-=7SPGe`t2GFBp9H?IFO-FlI%>L)tGr+ zanc@L{X;N-s@$1}en4-j6Lde?Ffw76EdjTMO~TX!XqVg7k%VTw+Qe|O25C4|I5}^k zT76WB10y$(U~ryOqc?A>%oMcE!KJ98JFHuhX8P`>HO#uo|7tb;2Nqf>Vp-kBj@B7C})I8NFWj5 zr6mC%$$NeAbDbl47B!Rx^u8xcYk|&y7T{kk`)QFCv?L4e!iu7B87Xuh_4)m-Ezw+x z4S@5k!0Mgi0tum{2#5${SkbeI2$+OiR2$>XYhF|35fFDK`8o@djvvLk3ZN=4`lXJ5 zqV7FNs>bullm&*}fB z7wn-Xst2mer+m!jf~|W?qcA8HbmAWZ(7u4;?)7_eBH}${s{8iDvsrAUu}Xzp!CF%2 zNop;jVq|M~9gNnwh>MRKPDX~JT1}VN^JkKL=Y15Z7Kfk{Z_pJkFATZw?kp-ccbfZxsu#5@vf`LpBG!x+%<<;_g zL+)lmW$}VHL86-$m{G^KTWo~VS&g<$aIO_XZ(so#aZf51G$4S`EJ9>{9fJ5jBMlAP zOZsg@frs*jIpX_66i7O+@~?bFKZHC{4w)eT4ripX z4Og+9Cdpkt=Gk4pGBZ0E0)YDW-FZ8-r)c;?Aikj4A||g_V9Q1Gy%pbMuM$w#)E$ai z>pouQHo*}&=i836K_&hs_>?(Vi+&ZTOyWMIht>M^;ywv&<|;f{k`H=cIE(qMuekoZ zZ$qv9h+g`2lImzmQnomlG>(vM8%@AdYsOJ5?|k?&4OK#+L<${tUV5;_10 zN2kv<$knXZ2ei4QxKl}Lt}(OBa$(>To9XITLY@`ab}eU0S#b@e6<&*Mt<{rMrCjE%O#*nW1^ zBq1tVB=*!7IT*W6Kn(D6qybOd)h|me&DdX&>0~;Rr_1)gk#b$?Gf1~ZM*tLj*Jnwy zgtrn(S*yr1;*G-{WB%W(*bnh8attC}{964|Q@IV*_$ZPululVPZ)vDm=_&<`MF&Y)Z>^F%)%mtP9h zS4w^}5w2TW2186HJ8PiyalK@FR@HvmXy(^)b@b@rEv4tFui^@*B3d(}Y=*`T>>JX& zi)(Q*;XydyBv{%0nAM%>csF$KyuCu6dU^sIy?~6fxdc8Qum1a3fhVcK7Sv<(qw5Aq z_|EY+SJ+K3>a%7=P_M>cW#LMSUq@YyTvbdr-QXNz5=?vs zZb-GT{P!OXe1!o4xrhQ!rT2j%L^E=+u?F%8z#%X|U|?YWJ^zmw_RqO6@bT{twwRNX zz0-e_u>Ygj1`@-T{D6S>vATuS?{%Srk}C+3S(Ix3D7I(OY=Q6r`GNya?e33XKb2}y zvN##7p$4gp!Vd{!M-FcEOk8e`413JK9DPOkHA*NCKM(rG9AhooE&ps^ryu9LQ1Jko zqmQxb$nXYEldAX=@iQ2bt{{ucq?JVf4AVt8ldU<*P5faZlLMa| zA?#>+w1$nOilgXlLGEK}`dR+a!XO@?_Uoc5%b=h0J5>&_q3NMcScMIh1*y}5rTiOJ zd)tL=y4#WTj-gH$Zz#%*U+d-xxW)0(I@1o#`uF~2^x%>zqCbp{!jK8cB}v+i>?T62 z$kqm*z8>J)S!XVV_X8kESy{+co3a^2Rk*!5uWj#uv;)r|Irtfa^$&q1w5$r$t8|K^>697?Xj3;)J5Bi)FnZ(P+;V&@lF z_H2y99hr&a>bRnZ@_K6_^ao4*^-jEKFO*#@lGy<=1e^0x8?g8~7wKZqPgYxm6l-=l zf;fMM;$!{oXG|`2w4gZ@POl9h04UeKunBL@bn5ht|AMTuY3VDVO22;(wk$Z(nG5SZ zZp%kcM0(SH$XK6N`=$KQyyzzF({lIWsgB~njZwG*B!~HSJxCtN+A43n_&CvUS>|$R zuWkk$ACMfg)oND%H~YdVBV^9GP)1kCeGw*JUMJOZsv4`N$|}(Xj5Vc19I-|s)zP-8 z=`J4UQPFbbt%40W9is%D6(8uj03cE;3Qm4CRnHvV22{3Sa}9>Kvu*(h;DFvFIcImOh_cB%&R{81DSdIdX( zB55*DX6k)bTy#$k0FJ)IV}v||fUQh@4`ah-h*-+3sByC_O3nRxnc>k$BczN{G`nL; zU@J2m`$5I8!5J+aDSh%R9I>yrhL?TiV9i9hFxdaL*yW>KGXgS6?4G)b5!6>&^rXH? zFcJOAPn_@gLmL~Rab@5bGs|Nz&B(gXG#V%gBVdnCi{=E>eB^y!QbUC6NY{goTyg10`X8blgB1L77QYnEmU^X?uhmw39K@d!q>mCBC|=NL=FK)4|4b9nuQXK~sKDd?s4V3T%+7|f`sNTU zsL|Tqu7Im2@xnzdZs@XyDXk=qWPOjn?D%jmYDeniC^&T9E5k~% z^0|UICu9Pv;IU@BgBQX(&>BcXK-2R_0SM&a=J@iY!tz-htN3<*U^(Tgyr9(7QJ_Oz zQ~g@)e*EYblz9Ht^+~27GgyMUYWDMktN@KR?<>10<7^XZ1#&mW(ZMdxmI3kR0Xjj=lf`$~O@vApkVoplG_~^I9hBAMI zNY^47R#r}9KjIjhuaeETZDU_ueJpF?V`%@~$zuaPn)d($DYkvREeXbk_$ZZQDB4OJ zOUKZ-D9=Ch>&w_Xs8QEsKEj&c0N&J54525|q|U+$GL$jXNEM0UBc}R+*>+!c+PS50!pEDcz}kKd%S?duKa` zRBE1t>g+Y`1xKG^DJm^MB)D3IA;s}O2+E`0^-H%G3zaO%v0$!~Fn$iz2c*;I|2=WK z*1Ly{3-ct=U@M5*4=@&_fMS_zKPx7E!vuXvnOEm7H}$S|lOLKIr+t5(Pionqy3yQj zw66Z8eZ~~7PIEC~hLx8_csOpx(a(+e$A7YnCmYdcCIwuw3I4YT6m%V3okJg^gE=@f z6|usWDQ00>@R9WCjh?|dHo&-2LeMIn2n7b>4hl!cujXoo#9;uIN~kH3tDa&H<03e( zQ?@^<4m5k(22RUwH&v%T*d#fJB;QL9LEgxoWvG5cgW4SAS6wz6gQMu)z*%!N#U|%I zCxfl6n8t4quPs9QJe3*%do2V1bLAgMTyI{!t)ADyAf*c?dDP~4Y5+Yp&1Q4ICvyT7 zBW&8@@H z|2nw_Y22CtH^e+R9%sKww-6mlkr;YrL?XExC!;T(1y&3sArWNEvMg`f`h5^=C0Z<& z8|&)R2Z}@7DpHAXETD`hDWFg$bj@R%wJmZyNvEK(Hg55@c8U7#`r2?_8$-FA13rHR zcC#VzU8GJHx@ehIh3FQ>xiWNa6=yhZgSacfnBr!Dp- zUTJIPMS?+d5X{jNfy=!rPqT?0FS8VpwI&*GRhkXja~yG+0+1}Epp(O-uvqC zQ9;7;gUwF@t(Gfp+{j7I`bf^o?l&jz_beJw8A2yd6Q5IJ2GWVI-eQ6}wf%@F2x45N zh{U8h(WN(gNOCgMgDEx>+T;n$^+T&a)_$^fd1=MPM=)@o${&*nE!nGxC(+Bp3@L(< zu~<$g4-7^&H2}t89*n|Ii~~8NO3~dH4Q)oFTgy}TZ?Tdf!=c`A9`MeT&fzk6qll%^ z=eJH?`k~uO48c1COpmyTi;ilP4NN*=4`CKFf3g$>mM0uJc3UsU4qjg5k?V^D@kG-| z42_7nETo@JXtxp{=T^q~?oeWSHhiOSvE`|qSN#vUdjQZCc{@&u`htS}@$N=>Mn;ah zmDm#4@9M%2qXm0=B8tnX^!Xkp za{+N)g+tr{k`VwgI*GRBRD>`h%~r0bS8k`hR{%hSoYUl>geIkwxr$yZS-P}KuYA5d zWAdxKafsz=FTM%jeLt(Zeh9lBEv9wmfjLZ>b*=rX{e<7F;)Lt7EKs(pS57Rf{HHD0 zIb%quf;RGR8{C0g72C2J!9~v4rjA3UcMeN2YIdnP^$D=}XnuDOj)@zvN_LEqDvJG9 z3GjaXwlVaO;(SRC3z-^PqALbR2`h>Yw#Qh8%|x$rUpy-CN*4@XZVB8WGGHbP-5x_?uv$CJ+eAg8QWFZohAm= zMmGuvW=OV{^i>RHMrF+$pPybLi+-`1D!@l+do*6Y5w5hk-HPXSWH$b!wl8T7Wu?sL ztYTSfRFjdkOPBD6`s;0gH=27W^-3jqDaa|5@Mo z2p}NGqW^2q0P$}U`ft+k|4KqiroUWlod1hLx))9x&1ipaN(9r=)pF`2HtMqnn-}95 zB{vVGW2zb##!OgHU?pv+lt_gpxT|))F2QzH7lTt4$)nlAzXz-i8P&bIVnd7_n45Ey zR0(WnC$>~oNZ((7jU5e9&y|PVd0j0sO#`&d?+0_byF|43UBELpa-<0dID3}EmJhrg zEN}+)6o{9dXKwJSvzpS%(Bj+HTI97t|IX^OnYW)YAg?0ykrAO({ z{@5*2%n?@VjHnpCS=$vOWRC3d8CL~Jib-hY@?Qcb0`>`>*(z@A%7?GG00m;_-+_=p zKA-vAT2?ZRg=t3z;`i8xEMAz$ABvf=_#ytyzvO+u3RfN~{T9dcGrFn>yVvJ03E!G% zd#u*?K)tWVYJA>YNP6@}Yf|qolF6Xip<{mr@Riv1eHZ|GngOpu2OH}t%gzK&-#3={ z?XC>&kT7-}74p)#8zRkJ0eh3d_zve8bS`$tGfQ!rJiGiqJkB?zd0U`Q3~18$52(4n zW4XMRow)Od{TA!_;W7Raa#wcRg5@@BNWVU;JZJ9$2jSOeQA}eZou@T^ti$-na_uEr z-;nL5Xlo6$?h+)NF6+-X#z#r~L721}VtftU*P>BW@$IpiC$f=xQ@Z>+ctX`ME=vGoQ?N?xdfB;^gr{4M~0GJQT?bPh41M)KGW4 z!A=GMd$*xYk}y!FFSy9M?9#{smNUYQQ2*x;vHoB=a(on>bE0pJtMdCA<1c26oIHq)+AB!}9-my8z8^Ih<;FvEN?kfDHe9Xzyg3#y|F{I4- zE0=kw8B&096xD6O2s}6aRJI(+LQpYhsJP)2(nz)JfC|WD%@JEPp3Z|yE4J9~H;fpB z$*w$_ZN|Qrb_gMLMu8$n^ka?V(8fmGjS)H``i6R&K!oTy2yhk4x43OW7AK!1m(2>c zdkc5(6vJ`}cuv{nN+LWu|F(-PWW25LQ$$Q+C4u6{{erw^%FJ$ON~rfI6-D~6pdXuK z_Z9F)zA(rw;PslcUm(W%Tozpf@1fz!wU0~tfQI@!M*Pp8OqnxdMSB!j0p^nlKtB9G z3FU(FU|Ix~osq%<$P_<)FkENu- zoo@{XUxooom|NU8`a^(=sHryR6yd#k^?M+#f4K8C6K}c2I15LtL|)+>TumISHZSFB zfujG*h%t;*ZMos<*R`vx`So?Tou|(LdmcwgcJ+1(Ko>zNCI|xA61F|6;y5r-G19fh zkOWPL-v+=-hTI-SUTv5~3J2QLC$BN`p!t2344LHeAPr2ZP@ewcljxtVHqI?_bUBsA zhD=&aOTB<$oEV*gUi$fbxn4M^Kq1H9V$)@7=$(nf3H1@jZKF&BU4B;wX5ZB_GNJ1p zWTlb-zzk*i7ppngi}s#2(GLY$A;?T^!$M@zY|wv$Yg#%yHeMNx7q!e!N?nCp$zK`~ z3gzl2170Ou=quXhw^yv(t-puOfqn7!1R71u@cESR&%S=cbqHhCedi@o6oh@B>lob< z63-JRZ>FLIWAZ*}1TI&JF!~U}kmxF`$br@X`DgQ}xuP7D4X~GE&Vn?^T$9~2+LH@`jh?0V|mj~4LoCzcD^s=IdCiiYLC}FwvB-O34-b;mYmbyTI zH5825*nH0erT)fbx-&z#D`{V_0vj8bj1A^rAx=s-$4ayLi7Z;uu!w1-Y4HRNj6ZDLSi-vt?3Mq^ErNqaR$9fO9pVJvt6lL<` z0H!PRZg!|IdQsu3c<5eiC+K!)P*fQz2su!gNq15?9A|?_H1O2IsLbcw$)wX4Y2SFV6J!$H zW+A2?5mHF#6F(VelY$@nx$TFkLz`#wC#sdPWz@FvL%6|1XyjFxhF@+`&xxJWPl z>W^Jwi3GgB+N)KH{5j8nORu_(LR+Zc0u(j3UihU_D`4|A{M={EeGFzQly_}&0XAc) zkMJ`G1pjwr}aiwgUjmX{E8DK8|fUNMeONqF#BfJG9=}(+eEey2`6Ye5t*`sT{_m*22<|a+E#`Z` z9cF}{tWagCWYRA%lG43<+Ugh4=ts?-DQ{JwZ?-egY30@%esq(LP$*#=t!X-mBY7Ii z1OpyRof@FiE#xcJ%`gmzqijsoU>=|@^sn-(;H?H6di2a?Y3fcv3;QFe06jCi+2=NE z%ji+ZQqtHoK}N@dJG}sxX~b6#w6tx(Q|4!3C5NOly7a9PsGEG2@7Mx*ieXqcwTt6- zb_B-FnV7(+6s|iVI$7p-=TTj&MehfmugIMU{kXue*e2%t@NZ`2{q*5Y8Czj%P^U`WI0z_!>PQ$!t|#! zs>$mJdosjfsL%|)nk#!O2s-P;CN-@`1WLzI@TwT;J?%Msgd#2DFi}Ljey6@dRM)*x zrzrD1u**n3tWxR~U9qBB+i_3VVayut>|Q4)q!V(T5EDN(#sW?RP$YDCBD)KW(2(5%SEe@(dwX6y4I7-`v^($il1gna%DB0P_j>& z=N0Su*r~bGE3RiN-gcg=Z>&fVQnBOgt!e~&@@97cc_;v-s(J~$S*fm>ztb;zbzYli zt4ZS@s@CTPEL8(+THcanrQy)23YC67WGvuAv4a~0SF;h+5yVU^S*Wt0foKPafAnF+ zfMj4?Aiqke)$?fV2d3{4Z(cDi_3H7vfVJ?=7%qNgWHbj(dfRR*ZwT4uZ&PN|@|E?S zC(FT>615B>Q%4~q!M%+3zFgbF?=z4Is}mHsw~xR8m|Q^gs#cVL$2y&wC6M53*o<|4 z%Mcyad{>IpH^uJiDLw;p-I%mwQEwbQjMI~yjK&xdUWjFsVsJ2Jo?S{owkSLZM1+Uq z>oGPt5B}K*7z!joUMrVrLlfUw7Ke8XS6Ls8IP|pR-ev3MK2DKG$#d7H-AKOA@_{Ww zS9v%9XbVe?84ek_+Pqr+tx0+(%fO6;iVs_5RQqS&Zm3|-2e!mu!BjNTLX9rt!m)#u z=383P>(4KI%D}fAQ&>X&F1{Z!SBRI$L#~t2-?Kh4+)P9!|R_Eh`U?W)s@zY@@iF02g_Eu+c=6XyBFUa zz|SX-Y8I+p2=dFs_x?}2$9wKY<__b`%yw3;See3ay=Ex{W}`sBUC7QTRRmUjssZMK z_1?l1S@(Q0W!3}*mJX->phC{_BgDlXU+0-l(;6ByLm3!n7uIQea@-IZ~#!M4yMWXsH35rI8T2 zJWbA`4nu#tkk_c2^t2~vk~rRVbWDM6-zZ&2L8T>MyZPwPWT6*Lp6Yqb?Hfwm#(ttY zun3nTT3?#}Z64Hc4SXn*vUwKgr=A3u3*dv#r594r9=v9TT>|>%E+I4ju9A}+uy}{t zB<>F1iJ^&NJGN6`4LZ`}1e-LzWSw84DlFfZhk@LW7v#%?GHws8fdpgfhB1jOY}qa* zXfeG7O`B%9psgogLu~0O+i~0+> z=8&J3FuSBy@(4ZQjw3{Xib0%X?p+DG6odK%qk#zSZI1RXAY)G&RRO;MgqaM`#Os#Y z6v(*Nkp>Gh$s|O|2p8Gg#2pBUfH6#fTi`C{z)U>k-7kv=O~9U(g|8Q&B|>88#v zvz0WpXGg;4k?3j!{J{GI&<ko$~j)H$$&fWd;Q(Z&=8Q-G2?7^u{Rp(fUf5ubL3 znQ&ft!RK+#1cx*KsCk1XBiPU7vm~=s1=Ia|$Fm!%@kgG|)W+Qk;I=d5glo4=zY&2y zII_H3?66%vH%0=#V!!yk4jx2oLULd6w!ZFWO)<%vZ7%i*@z`T`zEhCz%|qtFDebfM z_maUO-rY)=fWZF7T6SCmi2HO`AakcVyZ_YLx8uX?9Q6i|iuH%_E?4P?_ToEjzSKs1 ze!$3S%du1ay{xt|fZhxHf{eE0S0nQt^~A!>L)tUbb3kZCtUwf>2iC`!Y=z6OWFPO3 z)q&Lwq7%KITOXDCMWdP`CEk=zHJUM(FQf9O$g+g?nPtY`5i!7rR!^GMe}}-2cPM?C zWKq?fla8{a&x;l1Dt-B;%N1o=Db9$50xC)xDJL406ys8C=}0$w4)#C)HZ#Wy=~L%X zKtRI1|JQ}d|KELys>3f+r~h+bLhvEKA@Sh$C!&h>DIn-7PGKE90llU<%kMV6u|!!_ z72hkdmD9C-JI+b{&kJyg@+<0rW_BdJl`kx(20=Jtn#f#d9mmy}41umZN*!IYB z@<`!^>(Ba6A{+eY1ZCm$6@Ye0?kuQy%1)-dZd>A9{6QQT=JmR(F%u)%bG6YA*OPgo zu>2m=4?`U03C!v_oeeLejKeHh28&$Og&?39+#Bx^9}3=K$WKw7(R&JPxXggzY&%Z= zF{3?SgeG%Yy5il@%PTtw^bBG6P#!OCoxSW&xAM-mhu-&*E2J`24uF0sVu*}Fz+w93 z!)k{ePN*S?2Fc{~R2c4{q8p+}Eu*kfr*szR5h{9gOSby4G;oO7Z$1@R2YAAMf$-vq zz`-tJK?wAeO#beh_{^vYX88FbX%0B-F{RVTOEk1wE;l=(@4#2X znEMWd4MxutfExFc0KiHY2e}kY;y}&2LJT#V-%}Zy4jVTc4I3SC;>D3(#K|Hd$5acU z!dnxEzW=O}kDuFI;PC5P20IJ6o+1m9#n`~}kKN@s)b|J`uK7vhd#a#<3omcr;Xl#c z=$X9JISN4@6-e^~g1BL4S+Y=Qa_R|z(^otRe1>k;?+%6W5g??V5MGy=*QqQ07fg3L zub(sarBk=Tb}`#}99F^}r5)8W4uDu=b!h`E3)m|IRvz7S0rq<@SJe<0jkNjAxdJr; zJ0A97<#mRaAN*X(IMK-XKM1P(ZY5D*@i^&NU(imP4UiU>_GC%0m&zcA)|!IvN0Lq*dxg3+*H)A2&$Pj0c*gvwnV@{Ly5y zJr2%tH9}WL;P9s|sXzmwvAGCFoa{r~Tym-(O`>N6Ktv5n$Vi$A>9nS+dr?2Y6^=rQ zJL+TbXV&kra}Qp$-f))vVP6@1kSx!52^da!c11g~VlL(_6pXKRV{}$L#*-n z3dP#L1A0LbJ(8jr0#fycin?n^j zAXqPF9JtP!flwsokaINZNL|~617MRyv%#S_n z3V$(2E$?T%Hz+J7)?!_xjd!@#z&lRKWRJ1M0`O%^*fbLq#A;5<29jt(&YK{|6 zWgFiCvED|6gxfJ1(a6Sj`GT>W(HCInt)Y)VBOk&w$HTO&6eeX)z^NocV=7A7z}60% z1&H;P(AA+t4pgLq%|wyvjf?RKal;g`K7MBir&H0w#e}np{DnqOgDGm!89E4>y57uj zseXY4Z#6?tNwA)SSi*JrRF#iyKvqXf{hCmmHxsnY&)s@9`-cmL?E9h5(*VPpQJDn* z$tgqz6#N79A~;L60P!9&tSj3{P#kE&1jN>W;`vZf#9f#Siw<#GWuMvHVsH*CI8lRh zNW{LQ(xL)Yn42-e3g#q^C7H#>nBNdk43WHG*EgP|3>yugC2wVaILW8}%?ZdPvvcaF;?R7hh*`&`8wl#<66RDdx_2WrAVG5^35k|G+hP@qk^15gkC zgki|i6@YJ_vrrF3(plFzEGVJkG2$1g=a1ENW^~RDoS!L{9`Zj*rxuAXx{O`(R+Y4t z5jZlyM?5H;)GG>%Fk>>qg*eIQp1~;4q$JIOpPPC)Vv6K1?>s7;E|x-0uVxRd4aGkr zf%C8n$^5=S8?0NN<|oUBg`wI;3*c(ya-?MqOJzTLYOG_&W5Vi~<+YN=QpP&0{+7F) z2e=SM=txin*D7H9I06Y|GJwsZp{W0^YE;c7M3p&Zp{jjk$`g@XMwAse&#E5nOE1@b zpC(|#0fX_>T7Lm8T&EGKD)4zaW35*ekNid+vZm#SU z2@S{1BsdP)Unu_|3CVwr5pWnJ`!k22uFlw`r9C&Tuycoah+mkLNRa*#)Ufks{&>i) zp9Gz#5nH0P^xnkB=G!8+rj2YJb%p#9Wbj0i@$8dsd-fxL*-#P^GH0{dE%Kto)LiR@ zSB#d#cp>mQfA*D{#k5sh1PO}4?~g;iiI_j-griK`(ed}?U{s0(2mlgXDDH4FdPIQC zt+#_TWcqAa)RAO*W+RCXHFW$89GN|5zu8ZH*77U=TDJt}-sCH!7R{D&hXW~is)%Mf z+yy-+)w5%r0mF;Vtu}A3RZHE3=Z%JjuZbS`YD3J!aBbRXh=r?gAzdDgwuIAJ2)n$P zFGZW@!Ayj;+KE;@13;YJXrJVdD4JK`{rLaG)jLI361H8t={V`wM#nZgwr$(CS8Ut1 zZQHhOJ00!3@3;5<$M>JqsH(9J*1>a7bKdj5Cedg=_vQ2Q5;y&F+zWk8OA5{UzD&7& z6MrpTu0^jA6bcx#ojk-UI%F^ZJf(eUBPGcm^_#d)3KQZwH=I@hW(X|JJqA=J(v%d8 zg6v5P!Fa+blxTd6IE+Fdk+f);_05`r@1&BN+q_KZUsv{XG&{BzK<(mGLfLADNp;2H zU7FLKx&ADuB(valOFLrXEyV2!?$gL5^&P5NLOchmul#2G+OKHgv z{7Wj*DvwT@h|7#NL>qzW_@=-gkTX;#QxONVe(|qve^?W=acv6`aDotC`L@Q` z)iChALIus8As@Z&ne4eETS7xiXGWbrm_x~5Y;g=L3|;*qj@v9*LDee{srQnvmy&-A zaW*NkfEA(Zd(#O2c1B*BaA=<5lSPCY8}b9;BeFpU*_+*I^Q)V2F9t zLV7+_&g33vZeUIwgsG`A10%S^pCWu)6k?+AHmHZrK`2jDF8s|(h!3)#2qQ;Ni|ha? zOHb5qFbvlX2&sU8dRW!cm9GKNXWXTY66%Svj;t74WgCuZQc*5ze<*9(g?_s}sX|Z0 zJpcNm3VI1|`?2 z-NRHkQ*=df1RkWZwCF4WNNjsJpou;EnXC2jOFgU_fN|_64)RT#;a(AoHo!%1&QIRC zJw+Kv5qcwlhC)-J2+jvDwHfGPfZA^N`9c5{S^3=%AEX_r|g zAwO{r=xD4qVQD;Zt(JISA{sxFdnu>8P4^=eU4Xq{he}@S>LfKGbzbpyynNTg${8DO z^BBe}6Y)sjNtm@C&NNKNKUHySkJ4NvqA1uGZ86u>`RoLll~b0mds7VXqG9M*;%Tr= zak+*rcEI=UXmiQOCM_b3r}-&~^?yT)UA8O&l;@OsbXGHpzI3b7sFn|9hB3hZ!~@4O zkZ@&6Gs@uAc{*N3jaa!N4^sm6y%AfRQ@2pWPrti=I zr=HCTj__F7tO3XGw{F@;D+(nrEy>B^-Mr8EN_keI=h^Xljdd)%a-X1Ge8Tclw{*ob zm~%AVk6sIRyoEErC3f9;L#W=|Hy&s9=5+^f8#%L<)xRK|6nR4~f&~Hx=F$BZ7q_;d z=Gm{`nh1iP?xu1_*aGI8Vr;=lTw`pt!MVFJA74#o4>I^A6`y}@Ts@h{rOSP$QUaJi zV{Rb0yYZcNZXl-0*~TsMTZt(v?49BaFTTA5zrKm5n*OIwH&r2bEBa?9TqXQ}Nt^^; z!Jpl;|4f91jIE5Fj1`RSosAv;KYjB*wOl@6CBPLwwOoc|)+vK{IDfU74xJ5M2Y$lx zG;^$)>i6UvHrL7DJ~M=6B}b|TE!Z}Z%gN-~1A^Hvd8rBb>nl~)_-v+!+AsJ1o1MH} z?6!ynR_Z+~8p%u7%}W6w4fO!oc7Kmw@NGBpEA`XWFa|IKc3wv63ulX&%Tl^9mDg1) zFrwFfNB?|!{{t@_o*sigVr(;5z~`|A*Qm1_z?}Izyv=@X}+C#ldT3V1b;J!Sb+^EMZ!W5uU37TQc+_Enc}G% zs%NtW+3%SGCO9k*5D4HaAf18(4uAo>Sb<$=T%cf7OS;n z5zDt~u2sMEfrAl+>ko%2#}a@EW+E{XtT5JMdn3_>WcCkHH?C^abbn zsa@A&EP#xa@h+SGA zLP9FUygv|aoVU3t&+qFhxC14Y^44p6Y~0QM~xWRNS3FI zi?<9H!-Jtew91rTElG=Na&Vx7no%+9bqz-NWR>jk44#AA%Y>k=*(;S`>H%~fOtbR@ z24f(!66`_zVGj5pZ)Y{A*IF*(_CnFV5M6}R-)k>}Tl?AWjfb0wp~LlAc|}#}E+7ts z7~J~>%u!nW@+B0D7mG-*pRKlvd0W^kzjZMe;?zF1LEGjd*}lSdSpK$Q{=n){o`{8j zuu;Shq;MKjbBYV8TWEsUbs?`W;AvzR3S4i7#`xNACK(zj8Zq+-^kqQrjy)?4M8aHX zxF>Q{+Fa}MR5-Qoq<>7=Cs?FC+^I;DiJn4XmcpDtbq8QV?@42|6UdPqW5KM$jw2-6 z4GRwYw+WzNiLRp-7^@z)g*G6ixkyS|RWSSDlQEajam2Wm7V8*yvzV_kEF%eL{ef%` zjJ*m<3IQXYRaw%?sF@C$FNFVukSH#USP%;a>cyx4=e7!nFy0^@d>TvrDa@`@5XJe2 z3ZtfD_ILV8bb%`f^`V3mni5Nw2y>o*_bXNS4Ftf&c0Y{CizRMCPe1^hiT|?|_MI!m zz^{2(z~YmtU8b9k;jyaQ$_B)CK1nM+=LB>AvSZYT6Jhd$g+X@w!NN%Ke*#Ct<3BJF zoab?5gAU9?fK>aX;NsOgj;s<5_xV&kx8MIO5j;4!c97#>ij439F{TM5e$Ij{vMh}{tp%=ZQ{1t$ZTwro7C?I3)3YaV|AA%6d?fSgLOmb z)mxoBBpM(wWu)^o+xQtbM3X9A!Amc?IbgT1rf|z5-RB$R@w)riEeWC88yXl3pA<84 zSW)Kng?fv*4|a>aM{)7)pXASdj~eQo3Q+e&c_}-{-1^15E(i0+bu1Htq`=#|jHv&& z8bffVB${2!V;OcWu*v_=EZzJMvvlm1TPU?p$M;#kCDC%~jQ`Rr0qsh9Np`(Q+GD;8 z^)1Og7y*-ffV{-?iS!!%0;SsronYZ+WE8}hfT-q2?34l1D+Z)Ng7W}aFa*``-pmlF z4)4HTMeS()w?0pw{O{^qa95k^CWU6?NMSpoKUw*gQAa-n>JzcmylINa;uAl)1ieTd zqDo7EQ3`Cl;`1UJW%@Fe)!}@OD%vJ<)7XCZO!T{?+%tXaqZ>r{ev^d^nOq?;FRuwcHAN10=*6bV+P1RKL3BVuia z7Uxevwp62W(rX7O`Cq3w$jT>+`6jzerahoZs221pfEL5sqneRv=$UJ$K56jOo~BNq z{jQK*cD`Y1NTT@U&`lcUKpQRNKp_2xQty1r7&<6KEJD=HjM`oKrW5z?jh3#eovNcV z2wV>r*c9QYH5KiNV};_FQwmckYn~KDvLb`rMgKugPZ}D~LqKB{NyeSBQ8?qLU;dZk z`Jr*dh&GK-v;7U%sPzPBH@TI*<5bMuL^!d-oH?x5hz)2=^(}XYERj9_wAE#QbP1;6 zPO4YbuyP*eQRpvDsw)ZvV|3*LdsMo*AGT=uCQJi#zL<6V%8~pqoOYITyQ#Hx5a$gY zT}BJw5M~a*xth=~F%FVWq41EDq%ZBsnGX~DT&3q>k%93qZrT+w3#$e-0}F+k8?=v5 z3H~V2Wcba+fEpd4;jRf518uhfgvpjsgQpr)DWJmsL_H%Cw7I&5b8F+J>iX%56s(s1 zmg3No>MRYJS3MvK9J5Y725PI1fLqsBwi+ANu5c3IJQCaMut{B3<|${bxjo>>-MP6p z8dGS|?FlMrQSOE0>gSd20rx?6Nd;P~qh;J!);K*rTsRivSP&Uk)WtNzfF++;7$p-3 zY7%zLi9e8pmh~EnOog*=KuP_ldQe!{*2>wT6147|f6yH`=QkZ>Pa!0(q-p+HH#9qt!IUdbHJp@9i&$~>Qy zz}GaRO^?~3@i$ycs&jf*jf)km(Bg)WVk$(Yb2S+y3#=UMpQHP-x9e8+Tt!Kl3J)3i zA|4;)2mSttb(I z-Jf5(0oAoHQbd=ox$GM#=@iTaG?{a$W(13;T$p7@vZzlB0bQ$~GXvKKL<^*;EGbi$YgU zCl!pQ9DyXX8<51MjZH_6Z=G6=-hAO{hOSyH3ryhdX=EwnSE$HFe)84Jw@CAzm0f>dmu7j z5V%uAJm^y>lTfx|B>>3Xef$KG zQP)uh{YA9s0xZ5toh6G{kq(vQz6!81l;3h}vIkDQ;1jQA zvyDCU_(8{@k`DN{rLiY^4T02T;#2#eJ^)dvhzt0wT;3}+l$}qEd zRZsvEvpza$3k8_&ZYit4jPpJGjaG33i$+O|CxW)ApT*GN{>>9_=RR_T@041SDVt?( z@}Ow2NSKwf4d?!$7UL|7;5F#GmKwPr2b^T=g{5m$N zAD@jM{8f5u*6s1wxbTKG5)6MzRXJn&m@{)q=KXUS(RKZwC*GVn08c>=qw&vU&k*J( zarQq~yoHrV-ke1MPuX`2Zy7J0E5&$C{$n}0?mSdN(RXe3$3#F>*8k*=e?99H!v7#i zL*)N2jhR9i2>kzwOmQ0{W4HgMF>%cu*TtSaeS~8aSo)Mj>Ip{<={36<@2U+=4NaPx z70MF%V9ltBMUY%p(>`9jYv9YA35XFe$Xtqm8{2hxpE};%K95ThCJwFvyqWQ?TQ4Vv z1Gb_krXxa@Si^wzkzo6I?mhVIbAac2;YEgxUP$vvdbEC~j+qd4(B5H^{^s`fd5iVd zLx{*r0R!~NwBo>Br|-FnnR%9|t&auk7+BY*9vp=^YaY-A!iZA{1eSB%aAzb%_P3e+Y6sEFT1>!e7?@tei|sd&f}N2 zzkYA`r3RDoKc+vbtW>$BZznbJil znT5k$=WwL?_e8{($1jFuID_jUJy>r3_6++Zt_dh_8QlwM$YKMxCG>EeV&I;oc0(@W z9jt9@*|Fjt!Nb|;BIR+0YXlHvaxi1aV_6V`qJWuv63mW{mIQ!EufTrMRhKu6R4#yA zK}R5(&AwcTm;Rtg-OEIPdusX(ivHpIExQx>0D%h16`ZIy2m}2UYY+wf5&(#N8SLE7 z;Kc?XJV_s-aa*b~q}M3K47f)Xr3@NhzYQh3)3!oi6-0z}QD0RZHM5QYW6j|B!F zL^_RZg7pi??H19yZ(k+AVs1Cx-;d`}`dCXFsT`m)k!;jhkoy#q8}pjy7Z(;!U9aXr zQ%x@()SQ{Y6UVzZ0k5w=Jh~F>h_~9+&EEIln=lJNFfg zAO`C}tc>zVGu#z(9)Y5K|NX-Tp#s4v;;A}bKNtA8d z1_3I(N#zHMKbNMR#72-S3)gxmHvI`JOJ+&A5e-N+!&G0DQmFF8)QPDA328u#|N4mH zHj0;#D**U0j?oPJ98#J5^lUcc2htu{t{DZn(e^BFTJYY#e4}=vBSI@}4GsYG_^9I=gx3 zYfj)D96t`iVaqBf|JsF;H?wXFy}@=>bYwWVL`28p=nO9z{}<>?Q{%4z-e1IXm;|}3 zGB1Enn!9)G7FAH#fOUtU9ZTh9>|xh`L(3?ghT9vtq#puVyx*`j zy}ZAMOJ>g42tM+7(!dLb$zZ!dXlgEFv(?vW=d!O`Ht3#pI=za$x79ZjyD;0Mdje{Y zo6TT~ZF20zh~Upo%P=Q5ztBgRXevi^0N_<}hkCvgzxX+w$-gYj{Fz*J68J=mja3MT znqMRRgo}Z7!2tmgLCUZLcH*tFG|u)aiS0So0;2UaygVKnHhz=V1nu>fX9+`d2CQHjhGE^c10~Z9 zMriuo3y#4c4qW1Mtd2}~32i^}Q^PgVP1@_XQ=~Fc{?^oW`;caoJMIFhqp7us9tbzT z4SJ{24TMj6_prYzzJRSI(&y^yQ66R}@tiI#>Zdss;^Y5wR1sUSmbR1{0N_d>@gxX* z+yxphJeTrcR&Ol}nBlaa#5`}pTdlT4)5rs5w5MB{ebT~eIzUXpauP8}Cjd=R4$7%+ z<$Vr^H=YDV=X12Uo9|hG-&tQwd!cr5Ae4ZBcUp(%)Fh`v_Ak0tEeAxH~e*MJb z2LFsBIT62di==`@?^g| zbv_J?q{Z#7R+@ruJGN0s>Pcvzc;xT4`lyN-FDi8(*=r-NXCwx|4`h0nDY)+r~=u*N@TSw_>jalD-hXb(4KQ zc1eK|nIY%3yspyE*3JWe7M_`BE@;_-6oE{w{d)Hl00i^>l8p;}tD)`LN!H84I%Rhf zEJmS#5}`R2P#x4M-s4}fE0VzBoe&q%kQDB77(iOMewo#tyc`EEL!Sx?Y#WwNh%=PF z)&>d)1ogJv#YUxFb&Yax=VXPZZ6$ zx4^F;kw$>+LI*m*?*shQ?xmY|1>?*F7sfI1gZBpk5MWUIGiUjqi=7w8>jLbhP5aNz=&>|=hoe$tTHpdRMp%unX^?y5732(y5?(9u!7c4X{G^WPjj9#^$@H_W7$BM(TN*O1Q3Cw~_7)$gubPswieZ#r0))|uW{1a~sp zRT@s*;aIfgitO{s#fBVZ&RQkno;$GI6-NvJ7SS9A#JgbJdnNLc)3z1bCQZ4-J3d0) zW+WF7WI4FtQ|y5pAT=Ih-o%7lqfP#jZqLBy<<(t4$Qv?)b+Mji81%<>CG1M4a|in| zxR5V+_+YyoKKFXtg{@ZWJ;Pv8-||6# z6&bEjc8Yq9$41)VgIv`kHaKDZ7RVU|DRe2{rCuy`3bf4j-sVZ~fNL937eHVh*?F~i z`~?ObxDgOJuxB@usov`QiWgqcF{fwzuMKz$+A&{@n|glhazDgoHC< zIUGZE<`tS`)N%Q6xT&wmQC0_;hETB?d}1DPV#pWk96UI_Y!q|e5Rs1)=0;oqf=&zX z)7tfTHFt539~guIrS!!-@aj!DC(sY6fREonbqlDLIGG(sgbODaC;BK(2DWxNj^Mx* zQdpcKuXp@Zj^i0tRo~$ccWASKaKeso{Jnv?b2I9%`K+;p*kDl%MSri*nsO@?`P-Gh z;mbbiDkL`idJZK<(E*(Nmz(T>YLu}XdKC}#ijDec`d!*E98uxS;Su*ZdBiZ@dAsut z$wAV0N!cbFzZdTm;=kfU^qF>K4+F^xNa>-_ll2UJK1)!ldoVj^ui`D*Fj~~z} zcC#-j*<785t`D^0F6l1&zdN6ep0IFUs+_|BRU0JRy52f<*+mZ>hfM&$T$&Q>w}Is~ zDk_EUNP3GFKJ3%Hq9bqXQvx`gEY({x$&_w;tB0IF8IMpQL+@45?G(%!zw&~MA}ixA zh=$m1QOShQZS6tVoANA5w=(I06Jy?Mu(v5zF6-r9IKwq`TtXHcfnJDWMEw=eX>~om zgjZf*(h!P{NA;CxNi7Ya0QOa7Oa94*O=M4c8qr%;0*eq5>0l)((LRj8=nOOaX4Lvk z?_ZvEzb9ue#xBr1Gvt1)&-4OxAYw4$#sM1VF9M|Y)dNu8M$tAejk{;uYgB$?*K>9^ zoarY4m=x%<_Q%C3cwS*o7EJk^FB$J32qfbq;d*1R%C6i)SO_9O@qM`KL}ho$^;g7+ zGNc!KVToS4Rv8wu@luJByQP4-BgX+6RDP_~U-CRYO-b8~_dT$x-=}0lQWO-D3pNIb z-SJk|4yzyO^F4xFCikHrT;AC}+5i zSOR5JgKH1y4Y+8)KKB~E|M^Y5q1z;@Diw~Fd5Uwz`R4Ez{Mr&|LfYNl{>}v4(wZ+x z{i^bo+Dcm7>8f@vd(T{6mRnzfG%0Gd$&!0u2maKK7PimB+~E!tR85tT%XsuRMSxNz zcS`hV&&sE?j0X?1sia~1w9AdTl%eJ|DBsjVOV!c|N;eZg1Up0bf%PROA)#@Dd1P!2 z3W0ivA3Kx7W~qbh$WxDYW6GHJFCgUWnLb6^X5|ZiP z>Ki|_xOJC&+DS1E{Yl_xIC*e@nk?&SYXo*gARnTpn%+luSRR-gMKJ~Ax{Ztp1x-6; zvgZrrt#$&Kv~Sxre%iIt3ko zbb~%52QOPHBW>y2qZT=s=3Qt;TJUBvN!3Y}Rx%u!=g0*?XDTUWMwyw+GwcLj4@i((5>tn*d8H1D$(;a-1Uqamg3Y#+ZYWE}|MYoShZtH6 zV4bsn+h=GiYu7vwa8e6@-%GZ%X(5tyX%aeW=SFx{EzU#m%%(NXE}ZH7M&8(Kg~R~W zztwrO8}x0aGN+X6Yq{5n{nLr}f*WJ~!|cMh^gX?*rWv?2jKy7$chtXIN3A_XSdKjI z4Xy!vOj?@{8fCB)1dj+JCQ+7-v0942%0}ROsuam5ST9GWUj#ktsemzT8xWb{a>_VQ z=FX+Z{pMy6*Zsw|W-?W}mF}VjMpM}Xm1y_NTyw5|i_$_RAI)9GalR0ptnAqQJzyzb ziL5~>C({LfX8J-#f#wEXEwvzhCx`&1HBbpa`CvcysgLNfshO1{^<_T(6a>st$K~p= zNSPsC$wde8!RVgk*w7;@wSyBed4qrZ7pxh!{%ogBcBrqerZ9~go|A0o-{#_!{rxe@ z!%|#(TkM0-^rlv^qRd#bL6t#sINbWN!=gu;*y9$tUZHWcg2tLx?pd=8-e{d4t1WJ4=Mw zw=Qa&k;y`5*Z>Y1tnn#{KcdFdo$p8hB(-3dr9)}Bd+Lj#r7 z^eR2z9fj=ik1aha4{FTb-(jq_H`=f$PLi>~V$QWBOT5 zSo^PwvNXYJcsP`Xq3&CM?5m#i=AiwvN|qBs69)=XG19#4SmcPw^G8gafkce~(<uC}JX&=>3D=tSE3 z#zxaN-5O}(@wMm*b!KeFu*_W)qO(z{zx^hXZy>cxRVo_fSUxf1s5_W5CNwW#)e=A0 zo=Q{6gQmAC^TMwsDI)GQdGWdb*pg-qyrMu!p6x1fHIKsJ$Ugc)6m!S{7#Xa2XT{mh zgI9m`9A?>*-br)iFdllcyv$j3d$qmaA4!4_Un7pvV=XeEfI=0!s8odwrK6vR=cl)G}`-{tqD7? z;fcGJs1*jy%7w?#FFY^&Z6)Xqcfu87%%`*}9RO%Bilr%xGY>a@dq`W#7xZz>u~Q?> zRDm;obAo+P0=5D++&j>zUi(CV^H3wwk4bXem?7=!JXdM$cfcgzq+&`0O~<^!y)5*2 z3RW0A9cc{6KuJh0R6t29{997XQX_!g$VOxf7&)!q{CA3egK8r!bAvEjqfHo!N`o`z zw7m7U|GU{u-lt|k;Y{1FB0R;EE}^5Z)pq9VB)0LyDXdYjTbg@|!4l@xsgRb8tU&L4 z>Wu5-$CEJh(eWUFl}bsJ7NhMx?!QDYKXEGugrcXtI;c`snsNR9OJ01DpUJ}_$3ZO%*pEtu1Iww>s**S+rKHCs zQAA#A`1!uPaZ@B%vcyj7bf>!4N|_CjthDUBGKjrW*A{opnYNv%@x7=B;lKfzD3bj2 zN^q%r3X%jJFwo0ZjE1QIk6d~Sb99f%r$5csC#@P96W`cb4HaRLN^=;FS3j7pq*((R zV0FA$Q&s)P7E$((LDBvL?1SM@z?h2%t}6$vcFjHV%Jp)=`|4CzQ$_ca)_m_AP0PQw zY)>o|?NKeLilM&K%nde+-NZWs*0oSzP_E|Z=h&eMfFHKexJ7tO99vy-3sQN8e87j# zTlylwwvSWHV(wd0B9_*Iwis1;-%>4Q9{7W8Yq=mStx3XEDSz(wGXrT)o@E}^Cb6Q5 zQh=C_GHiA5xrxA@`FDD-D%XOU_Ah(T2Of$cj0=T!2AoGOt)E5iKL8N*@wH9x3hHmnJb}M*920P<$f()$%N%E2h!%L0m z!HYyhzX>Uj0p1P|W@H?dA^5ez7p2T^a;{vBkf_mPZ%xM<`BwXrh8t;_;sh)*Pm)2# zHQmH>VNziPzlG%ge37f=V?vpQjsU&lCBSzBqI?2G4@+B~x>_xGB?eJ}Bs6kdL9F_glIN525_A zTkFw+z#D!tnV5AUw6RIG8Gu3TrS`tRfZ6M4z*{nWav(x4W=uj)#+)158UjeUEGGj1 z)=0e#cPGBjQo7U-mFX?G#YGZPVl55yes!htG$cKOw2Q?Y z(AGmC$am6yk%KDaavh5y#j?i5awI4qXKTzjGy)_Mi=$)zI07e9F;Dc@ca3_0Z5)ta z|3CVZ{*(2^`%JiN3H}*=Q@?UF&o0$=S}arGO$v7UXJ4SIS<6!Kv>LEFE`CU>&HgQx z5MZj|arMk~j|&+s%%v2>7k|M=YVz!;%o`OcP1#rWB!q?Xl=>BdR>vFX9pDWB8$`?B z4l|!T!pgJkH!PR~t@`q2duJz0^(J>Y9?d+j+kMU%dp82L3{?a_Es26hTx`cb(SGK* zM8L`dRky*MmZ7Rd!eZoj0!kV#p6f^v&S4ViV(}2R)-#OUIVOVdW}YAAzaDpnuQ;;yEv63>Q`ZXQaH>ez z>#}!&!9znsrMZ0y*4x_&@o3I&TXVu$GQ$7w zP5;-L_DlanG?&|X@jBiAuRBewjo%8b8Y|aj8cclS%>0wND%{0=*ghV9978|I63bU_UzQN30d-IzI%X?*r33vc1t?zXEmH*T47;>TFM#Rhb8sE#7Ng(n?Hkyk^aE$`E zB3dw?^oQKMEUoSlFE2H4B9SqL#-A16%nf8aGy#pJ4(V5hQ6<2S2~8jS9}jv! zTUwtzkVvsI*D=$^=zsgqD;%rEbqa(5X8~$BX1aXlmbk?k{u~AMwNF7KJH#Ny+kbzs z85PIum8symtrPboF2xQz^fo}^q8vs7y486XZOj&?7@H#r z^%ano{y16&sMYQJI%`yj5h9g#zY=A`^5hbT6fa?SBMNQ5K#Qh|24t=KPh2xoBymo{;vrx_Wz`W0bmut89yoEhf_oG zOTxMZ7D1$w;q%};a%hcw>+1SLc_*zMmhaDOK?T`~=q%DL+E_hF;`kH(>=#7O$Ib=o z4uDoxyzBK4N1F%0!DpFNWy{`Y$MUbt$kl0>cSoHdK#PAMRT3|V*)DTIGD3}rf(#;> zDP!t#EgLs1??C4-5eM9J7D2dy$@_eZ#!Phf%Ee*)RP||WoChwr9W0a?yOjp@AS#iF zcf&0@8Y4f+gE&CutB`FmhD%|iZf7-0wnoP~j-2>sa_dt>xaKX4#fy8{#p$+2P{N&Z z$?Bp5ummI$G;GM#HDu^%3zKN#f7yD=wxpm6|3c6sJ9mVPN8X9YW%a_=)oQ- zW+;0bHfhN3@>D8puyeeG26D;rnWCsS=JN^zQs--6Tq?f?=_F4FcD$`uT;yW^U z!T|hc7W`mFDTcoaVl^@B?tjC6521fgaB6&TZa2K*4_* zGFXly(kY&X_TC7-HIyV%2-R_cU=J2(+MQYvoL2GAI;Ig<2{@LYz>Xbj#mK^4YIs}J z^tgrdRISNxf{0z@b8m1{P2l$V0;pl1zh-3G<>fyY9JiTVXuN+G*ZbA=?N?|X&G$^l3?HweNBx!uOu zsKaoQ7jsY3yMy^@QQ_g!OXFf1havdkXu0gxnmVkN%@TGEY~9WP=BSt+Z+p-GyCID*iUp!ey!1wDKv zaYJH4qPR1HI_RwFu>NlPZ8bs&dQJ*Tp~Im<=-%VNq%j{JB(zC}q!5Hg#=%F$gd9dx z8U7;~#k~I&c|c}`0HqSqGKQ}A?6L>sFkjLQ@Bo=T6=V?K{3A(f0Z=LN)MxB=WM>GD zpMbN=fH6a8fYztSpp{FE_aF-TOOzb7R7oxr2zH5TX4_&>G#8Is*vE#=FsJlAHqv6Q z8`M(XT0e=H52T!a_>%R-{CY|LV$Mi@_47SlNS~hrjIq(X3JLOyC7W+L3)F0u0_Bzi zR5X;@f9nI``Cu$B41nF*=$r!3(YyErZ8(BByg*|1A<^Z8tOUeU!ck27RI@K?>7?7q zf~5*C{3}F4Kg!rA8F65HH7Cm0&}k_vs{Aa8`R@xP=1e1cuUjO?C)eG<)K$ux9V5h2mFmFwN|EDi*1wv<`f-S z4%vNDPXaUZAKzX9fhmYBvTN5ERh25sLIcfFvhM0jF5;p%Uu{ID3~+qPAqOapuI{SGs@(e1ZBFMkBP04#szlD!B+QX z^<4;1f-D(N1E8C<*{k3Z=eX3^E2q|8Q1jpIa`u6BILzdssO9D#_oiaVl`avE6Ch#7sZ~ABEx(3edrDuYjC6LMRpZ{PaQaGP zXz?k<8|W;haGeBRFkK-?^JgHc=&&(ej_<|wMk9au=hw2NJ%e1w{etj2J1XRyUf@xD z((|)M1svz(^$Owx;fq5@ghXee%Ls*JEHfagoe$@}wPQts2Nui2Q*!1f>@`O0S0p42 zZIT`zKs{Rqn=Ej{`E!XSVCgzreJp2h`J(Hl?fCCf-ise(vn8qak!fc?Z!SdNiFLi8 zqmQfr5;NyXR~yhIX|dKhR3^BS=d!~*g#HpC15Ep1ued?aJi+&sy|6lE&RyijV4(bo zAE9w`(N4X1lT;u=o!^G1VKlFV`>8XdZ;C5`SnQ=;(@rSN^g2A(9BX!3ellr-lzPTU zN)#(D&Gm&o<=7brm<{$hPz}9*KE?RFY&2jY%c&tr<;ER8sOw91`Wm^P;2wfI|0T;8 z0}4BOHb65h+vDPC{l?RSc|K%U(Zxh1|RkII^2#u{>##lb=(-%Ijro8lwK*t0;P zE|IibaE$$UP6dXg4CvBJ9i?hW>LHwJ@JOFyz3%Zmvu>4f-?P4!7?xsE8Tx6(CwI0iE@Rq18N2MZmCg&T zqeUNmMwM$z;r&ck{js&1Lem@{0OQu}Wshq9gDfOi8a?pX>lz=%`33MI(<|4&RuvrC z4gzvA@!k=zxACZ2lCf#%*ITt<_ljJcKQFy5T_*vw{O{#s*n8;5hLz`{lRT67bx zAhayOq9%$@@Yk`(cKU(!S9-?8d&7v z#s%jUMdh1MSA=ob{d*HFfD-!{neud%d7|bP^IQUv&Slcs;izP@TvdT?5o^PUb$>fF z@+{L=k;Gf1pQ3%qIP1B{I-$~DL18AuETeK!TCql@+_;QOQ}SEoLMN}kVzF~%sR`$E z9ok#7q`Y#Gw(n3WP^7DRNixXhh=EQyITIn?;nEL>Ph+Wy!dJ8!;G{UV+e=x7B7@aK z1viMHKWTrmPQ&NX|9eTxL4Q|g$g7Q7=i`rof!3cB2Mo;~p6W%)&ReS184u)R{^Mk? zb46RN&w^0nuM16A4KpC}$bUHQsdVu-vKKx(Ig{p818qHE5>0h1TF%1Z_2=UvL#UBM zRM=}#Q3=%-E_C5304}s@tH+-$PWz)LSMDckwq4k0h;GoDI-acnKs!WEmG{r3oBO{H z-%jvfXLuhA+^>K+?pNxJf8U+Zwy%J8*l#E7uOFg?kNS~9@qTLJzOh^m;9t?jdSv`AZl)5djtO1@wf z-=C0Vo>^ZC|D7~h}jI~nNWw_il0N~)6*_Re@06neeouBd2~HfwntaTy8C z?aD%0wA$u!M5u{+?YNgoY#kD{aD>dJ%)s+c5v8mH|0wH>>xlc2@D!=^yLAf}U2e1r zNcYC{#WdQbLNUS+Q04e(RJX2RK&X5>zrB;Nnpm!2SBl$d$sE-9{!2yU`;QDd_)~Uh z(lXpWB#DP2JXm_m9c!Y?EbT|tDnunkW5UtGHhg7XV*so6YjYj^dhk4)hI{q(Rk&P5 zOAm~uMUDJRoPlC#-+s{MDYBumQ8iRzOckCyUHASh;4iB+Q~t&SfL5}Orec$Y>$|kW z=FJ$Z^Bv?r2Nzi=KFR|a2&e?&e;wSPW}5%QUH<g*BMC1rM3w z{&djXME7_yz3AX%;XZ%6`oP@0DR+9#wg#NRYTfTSA-9(odq3nt|=~oxJig+g%W$iYrd=eCo<* zxyVrq^nKU~p}T_O6-?MXsCEd71;Jt)EN;qnGWgFGhye*|HgPgH^Tf03+4PBTXR9tz ziTq!shO_{rVe)%@G#$W&Lgj}4(S_zql)w8PhWwn@+#1`G>M_*>(!f9gflRvq$(OWs z_)lK~D0V31Qm7I4%pyjKy|nGJ`lDIHePtpFbJtr$?Z+pESGz}qSF@w(wXcJ31We8X zkQl^vkPH;7Yv%nj+MmolD#JNoX*}GiELhgKvD3s|Zb}I@|4)Fhuw0NJFdnY>%S-ddjB3o~Gp znf+)AHYs!ubNmMiSKOgusc`Qm39MyCy##=sUrtuDrlU$NyE`dg`7o~xx6k+PilEa8 za`9pIX9+=5ZpkTr`xIS`z>5_V7Z)5C90DCp{MB3X<*Wr@U$7pAB%;4lMYDw@DkP5$ zlf&Hib%Fp)cNSSnV!6bkFxN`a(ckIV9=|mp($3lmaY5+lb^PfjsG7j2$Jy_rC1aD@ zY#6Z`oAL0iJ6#z6wD?7=;v$Gol7>=JT~b5al%qtpu&zY}xaUN9xFHo0=B(zp?hMYP zRfHTxY9J=~^KSQX9?;bSb5NdN!~;{8OnH5|h0g=f2+OcFLwLwF7iU%=l~*(K2RO5| zEqdTF>lCho`?fi?*A%4=qtLG$>K!Ug29TL5?QQiv+cz~ab*=-5>yt^yRZj&L_LJaM zE-j_7UBQL8e=7fI0i6fYnV0}|=d;Kx@p@&(4mEBbhSH0vRbAA@%vHSHUKhUJ7|;mW z4LJi8)cNhc8OgHIx~IEBjwl714YesP_=O|yA}rwl&HeFPH5qfG2pWu^Je5(UPh0z> zZF_W{I!Y?J;(`)?R%|f-&7jm(V17=P>msj_%EquIQ>l03c;XwT*zFv04YSxg{VZJ) zVC0TgQSYK+eW`Dq8fYa)Wa?|Nuep%B4>t<9!xzIGKxQ~jmYNF!v8t`nqV96=_aO3E z=dq+0#(`0^gmx=mZJg+^V!><GHi^V7%Okq8{6(DaY%~-q=*dK{SA1UoSibmIOEye9pPj{d1pWG&t{`)IncZT)lzjS(HkAv{~vY5giolpcptpfx3r2dZ!W zyjuF>9%4V7eG}4ompEoh`cP1!_2)AA`X-`Y(Dk``4BuVg-A<5RAX_)nHO!>_@+w4U zi4P}x01r@|DV6|729LJH3s-8lp}R%AsB(7v=Zro@+RXhp&|w#$dc7<=>{k_(@Bpsf zo0{3xbC7iczn1PSG)WWuH*F6JTV@pl)~-KMQ2^^17B;mo{l&O}Snt^XHBa19_DH^EHtiIZ@%Uo-Nahi7e z(GHy{!tF+DZT4IaXOM1JwoFB)SpZ>cMSz%MqER1@A(N|~F*WdW7;9pH?gXYB&3($R z@V=NviKUaBxzT&%hfKWiQIg|NIr^!yA)Cl}MwsKsMmmB98oQs1E(I0@xI2~pkj)~@ zGfjX*UFhQCNQ(&b+^m|1#JXXXI{P&TT#nC?5bokNnboGMS}egN3irYYN(l~|#?W|O z;!VPkldR?R;ihLBSLtlXOxY;w2;=O%@abq3V<>48GW^IiQOs?dV7=D84U zMER;<M9NoClC^164+gcVh(-JX&C_Ai79{9@6qWlPJOt@L=xaU z#xk>9@aZQj2TbTlW)Arbo|Ae&a$LMklr+I9U%pFDVK!bgs~<+~;27rs>IYlpB$k^a zi*gm8>3G;mM0@66U-aj&9xI6klA~z>i*$mCE|xYze7-%Xr-9rFt2x;u@|Q_9cyWn} zOB&Jy4a6X>)FAcYi1{mR{CFRf87yF$G3}c6x3{kuxh;E?Y>))$)Qxw>bYj?Wuyw+4 zN63) z0r_@Z9{uv+H~2)WU>{V7RMU%^I5A9S&={~O2;9VC=rlRA#BXmV!#}2N|A+(dyij6i zjeq7+cJM!WpM3BmP=b+2g)$xZ%qewe>Zd>0xHI~_Z`-C9O5sJkzfimcN2{*VmXdPF zczsZmB7K2J%I7SxeFyrXPAoJ$j`&a2Brj>#J8pSMR{omk>*I*x5a?{;UuurPo~VI% zhG#b_60zn*w=`4MZVU6Tex&7;C?S*q=(JzyvzaMQtU z*lC@!)EukC`d;JR5+gY4@Mo|h;9=l)xDd{@tb<#(?S--I0UwSe8`%9aW;EbV)6J?1 zcA5Wa^sg%c9LFfZ)@X?(>2r=aeA`ql{mmoSR#_b-#f zKQ7fU3qX{7a0JFMYH?@<){AFC4_BrAX5Gz3YAV}W*4&NUHl?FOK&cB=`*v0@Eov@3 z3MOmcC6j6m0>WQ@^E01RP}}mNLD>T*DD~p`Vbm4ncF>7RO3NE!PsunAn zqDHCFDSxGPerh;JX(*Z)eoPf|Rj}2MqDr$+lGic6=}<~4am78P<3=ONYS%y^*o1lQ z`lY>t|G}g5aR9(fs}E12!bZWy8H-8YvlVfhkCZhysgS zsCu%>)puIS<~s|340h6H8nijJKgrveR>tE6=fS$$7lHpQ+vb%uNFCuEEJ=GCbZTMU zEglfnaAkb`+tCvK?*4(9q&g*r1ya!`h{IKk-}g#G0>o3)LN9^Jg5g0vKV|A~3_Q!+ zDV6hp?%E`x2WL=nedY>{K7g+5m^a6%Vhk^`6xTiC3SS5K$;+_eD)DX-;RUEUSiomk-&*2yNL9-^~TF;z;Lu6X+vizk6aW7eKLe!MgOqH-fO9W-=C< zVJa(h5&dBlLa)>BNnDY`)ax?Z3ifQA2f8;aXCw}M9VP*YyzX)iDU|lzdc2&NazB}d zJ*+o8Q1AhKbyMTI6d+<>LpKUO`_sP(HG90FZV4%$ zA;#T}xxpcRX{GZzRj2K%TnpffCxob#ga)#nwZkoa~?qAl}A z9dLY>1nk&d=XnvXaYjW6{pr&+7rA`|Epf z3oum;gz^cfum#312dU_SlIVskE$2;`os<2%8hWo*F}o7@=QS_EZt0uzy`RBF{=Z)H z|93A=)y~-9e+7qWyW6e}qI_-T7>)r&!KoK|kvGzz*A=qTd+|wID1r&r5dT8K30HAf zzxn;Ku{C~qTTD4pynEj(h7&iov9g2Powh;b{wn;`#`3&ZEWU|I&oDd@QXg@Lpm>`8 z_~s)%*A`IKVwVeGcNys^YBGB*Hd2AAjj@ zvL!_uy^TMf1-xM?htf}`hfj6AX6~Wp%a@)pb-x%~SAAl*-^y+o{y}5`O>G5d9>0^c zK3z5{iMCpRU+OTTU-^YN&o|q}wZ*^CkHpm}TT)rJecT^7Y}i?=wZ-$7igxZ(NZXVR zeX6@TmBU~h@GBINSL&OWr99kkQc#>0o80lLrt|M=jc z;%V*SO!!xuv9S0G;{1W#f?d+vm4^xU%XA(*tt|HopdSu-E4DNp>VSgmwH*EhUUe@S z)oR1J*Oy$Jx3R96;(JLRy%R_NqQ!*s4eu}#XL3Eb%6{KS>4v<0QuxFl+2Xi;qWk2} zwEN4C=TI&l67m)@M1bC%cTQUc>4$)VH%m87XTa8kiidru zbM|XmLQg&V1iA0tF4phT^9qa}3j_z>aX}fL2Q;hSF3`{PS^PEN@xoWTnSnX9T~TGdeiX?QAZWh@7#oq>l>e~&6_7*Jg5(QqxE zT_8`w#F;K*meP~1Xsoj4Qk_N(ILTa}naURkVHTDXiKem|mnEm*J`rRJE8csc3USEZ~!f>`C2;BQ!84?O_S9 zjnU6A{rpVj2`QqjV&=zD=B=`g>9oS(?P5d8Bf_=3u?3iOyPM0qweWmV@G(mTFnmBv zYI5eY!&qf$N&E>tIi`NNwEn0+Pyl_q`R*D(16PG2+m_&q*wK)UOK$ZR;zf^277vPC z*=3W%h=SSW$QIW0(_x#)jK+DRu75&M-AJ=6hH#z3idrbMFiN-o%k`YTuRrd^)#>UY zkh@2tATmBYG+2UqtBT&*gMN$!xP=PE`NYEEqOWl0*{5NAi$(n@^fu4v;mY_;+D#a< zuG5ky{(LjwK!j8X<*Os}*x@P}R=Iw3%5;M91~Y{L5=3(S1

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 zv~t8aiqJ8Xsynqu`G6pP-Q6#U-F%+sgJait%(ux^f}!P)KEW}Nh%l$WCIs>z_vKSZ zF6L)a_-YyH3e$xq0K%eysi|2L!-SyIP&5Y@mrTD!Ji(=9T&S zCYzjjvJ~3Xuohmps?EW+s*nB4PP=_!Be{`b9u=f70Mh=N+No;jN2V~tX|&+1oo_Ad z3?>&AJg7gjK2{o%YrH99F64j|z z1@%A2xkXIu#+8mD>(MeU8`V)@M28pas^8JS*=bhU5-ngzflL?A=DAVmk?mDgKXD47 zeOqFJ08CTj;3B-b5>z%lO8!JpxmT5>iNtHAn#`=>t2lp#SaH#9xJ(wSYcqwmb*^=b zf6piMCytfGw&HyMJ5K#zl`vcjtSJfas5lg6^oD}qM}DkA`vpZ#IJqK>Eq13j$bGlc zpB`j6&_6|$axofw)e|ZiS6u~4zN1Emv=5w*4iM5kdzi-#`S&Tr`wnMvhjdW6#KYCI zI*Kj+IW)`{!}yp&0nuY@cV~WGUej_@;J+tSPY4&=HXzi%uAx=9_T`B%;fyk&AbB`1j>1Wfe4{@ zp`ogMTgpqbqZQ!z`NTKYUMkzS13yTsctGW>@!1Fj7c9fJ0)S*u7DHxc`i*+AmrEe*@I+)NsI?6(C55OYA zKQUdTk>cql&Xd#yJ`)YL*OmN?Mq{bq{Y|3^>QTRk zc}IuE{Ti!;MA6mW`%75@__5(0|2G;*2qUKP101^yBFKx5Z(Z8?$F;{byKYl>5KKVlD*u z{~i_-_qI|0r#;U1A6a?*&I7HYYjLs#-FOWz{u@Eh{HyNBbKRorv?()zWDprUS{X_b z-q!H<*EI+cG(Wjk(gEjvBQm(5Kln4eUqy>RmM%fdx0j3bc8fq}V#QAE^h`{+l0EB> zr`(QJex0)3cxH2*!ZxRU6TxPtNWQ?)(+CM*f&^B;5j}i$RprrP?djVy*KG$Ekk_!{ zz#Gf507G}MySDKkQ+c0Vjb+aN)W=IV>~SWCFhIqBE!}b)Gv`1|lKj-iBjro~BP!qU zHnZF6bgvWQO=*NQxwk)0$ig(ec*@wqw13u5Tu{%rw6X0;0)^8OgwEHn003gIq!u`z zH~rd#y7=&!0-cXqijiv>{CnMVoFNxa=q&$j`)UA!Il*0bYXeOzCP9yL7`LCUkmYk0 zL$Wts&ck%J?ysO9#;V&auHyzO8lqd^p-UVb&f?hMVUG)z)2_OQ^c}frY&3*`QR8dil6v_~XjjU4%uiA#qr_aLfB5b0Oq}?`K@WXomh-&@ne5ka&dt zIrTMu364TuBqthf8{(Ab9HNsqpLzBGqKyyTT!nT7^>fOALZa0+q^K zy=piO$cmiw~~%O^Nl zj^IL`7;20#3K4}>OIldon(CPPVFV6?iVK6wLnI*r!mc8OnRa;yQzdJ|5i(hU?-?!+ z_+016M(ykL{OZ3{y;$*DYK^z6!lNRJ`@%w5M;Us^IzFM#qZ`k91(u|Y83hF)R-ogUy@e;e2;k(k{t3lIQNwH#lI(Vr0vVs4!%`@BT6k5Y&X)A>zZ0qEmBW1z$ z!F(Z4ATro-o@;xWteM?T+SZ;z;5&dDxUKdZCbCq(mm(Rd*l|u7#I)whKZGHrK z)R;XG!BnW*>6cL`fj|8xtS^_7$rx$&TJRAc5hG;@Ze|Dpwd=&$t3^pBx%iNX8PM$* zUSE7K(qexQ!)Wi}S|o`~0vrsmaM@jRNi!@9`2!kTkbo$Okw+&2JG6O+)P(V9SWYn6 z3dvaS4VEWr+2}tLcY0#T*th;_b04{}SKwnNQ+w7&m!%hT&U35NIh!5Kxh`nYBhd%h zL70z8gi#bGEyMKv2iAn#;WOv{3}A`i&PjeAh{YC-yLSquHw^pNW}2U#m#anAK&*kJ z8N7McQIzR`V}7DdDO=+@=wR7pbP)l#^pNNULJJz^=O{TVhDb%dyW`V&>z~QL2tk6lX@umVSu=292T@& z0FrV)8-leI!*#Uocq%$Q7NZ}zOiwZG&e|k(d8D4nuGFp02$fp#AB?^i)L_Yqv|Hx! zNFg&Sm436du`Iz{d!DqmUoqX}-0g_Z#HPUa)HMS5a;CihkchCqGW9bLNBE5%3pip; ziVhwI)FU(Tnh~WMs5JY#AOOd>*gSLMUzT`>6@y3_q9y22>m;B;C&iH2Xi%6ms(E;t2Sufpv+=*Aaazfj zTQ5Js9}>qox@1ta;Fy^Gskn`}Yf({om=N+MRGw2*`;Jym7+TU=^a0$7Md97pOp zPy`a}gMWwSZ64Fb)eg?Yg;j&k?qo7J+x4=^%}Q&B2U@-dbvO?~>I-txA&~0FDq7N- zW80=^2J8yW3+z2R1Oaeae41E);jUiD9j0m;TMu)uvbF3+lAF>`iFm{m%+E#ED+x2< z8|XK#uk;YMFw{t0ydV-H)O=?s%SJjAP%r87ByCA!U(!6$YonN93Ef@p|83B8W*d!z z=b6-ihnv6iR*aW3flb18%0w20W4Ft_8NaEm)w{z#U%EA3;Q{a^Y?^M6wT2QOER{lo zF)lXk0{XlC-rNdov*^($>8L9U2tCrF^K!FPR+tfl3yLHOTtON{JrE%3>|E&kMu<8u zq6fLfF%(H+ILSq6uy&2d^*=2yNH@&}m1&n=`gGtX5-rD%qJ2)q@ZTC&-kq8|^{XWl zl_sKw-5rRZn*mdfhCCF^27Cqwxu%h9HGHO6$s1yq{m!UI8ELNxabod9;BA-@P*|iP zG@WQ!L#%8lC5{Bwh}$v>CYZy(&&0LP0bgw?#Y3M`cDzN1+V#TN?*2jot0~q)3rpUh zhdAW4GZA=^S9k~*17Cml+I9`zjcQA93J7k(D(U_41b+ms;y?*cMrzVB4+}u*} zVbA*MHF&Wn&P6pckwi)LW-Y*_nl51zBUOi0IT|TZk=-eGtBgG0iR%>^B*jRwVxIDb zl??qOPzhaG@KWFHA5GV7IYPF{lU%+PCddCHJrBr1UtD81e{X_5r#mq8yV6|l@uMe* z^}3_dY@7j^J#aCUdMj)&O^cT|MBgD++AywTXI8UF2tB@rzU6riad$Aq`lD&(;uR!ES)e)!Ew*MDau49v<$lLC;^=2y5bEYrJtu17*VcfrbM{QX3jv1juS` zs$8BEk6e7XZPy_U9OSPVB&1x~yr82&*OWJcQFj1XYo5LaJoj?1Z*{l#bE^4nmRkG= zV{-SV(T2yW4{vLn!0d<|7Q=HdZ>o2Q1Aq;NYikYy?~d2HTbK7+iF$kb{sy189nIdQ zFCSn9_f|xCJ4jbI!4PL@?xex657FP=s(S4{DDFf%c-glJu}F50*&!yBwGv9m4CHSWO|Y+Ex&Xnm zxivafy15rZ=1Pw)guNUfh0s2!$tCSE#Ico)$ZUiv?2kGYSEVHV-t&vqP8=c6(ZJ3o zqAK~g`N^dq#SCT>(QA46T}of-j{C-ECeB~@K0edMH8zU}H-=f3tk zAFG%CHEewJ=_UK8yv~?V1?WN*5rF&_!c!U`&N zccV56Jg-$SX^^Ip_RNIrl7Oo>doCHzoe!*|yy`xFjQog=`Ghzot4OHxFc%?Gw;|ki zW&9EDmL$>0>*2s$-UzV)Si^7Ua$6lstm?Vk9Vi(gT9T%yy26Zo}SOMh!-Lg}TFazdF*(;4yF z8F?$pkWPAs>Kk!^V{Cc&$O6!6xkRl=Q^_lzbC8O&!enhFLq5}oEc0xAMlA4*Pk1i1 zev-MroCcF?9zm}l`Sk#Fw`9VSySE5o)NosfruJKyk3*%|NuIsdme|L8=h7*h z>W=9>|JhLtF;2S{I|k@MH`o{9`WoCY2+Y5vuH3LNq+aDxnN4rr>>ry?U@PSyEcvgZ z^RxIJuQ_wg7hM#$DxxKL;(fU9$q^c_@q2SF1bpx-rgz^L%-@Lyf(OLz6FWfmJq(45 zV;O|ku1pJ>uP|Io3>v&sLz!dz!LwDsH*T(r4QB^_TSS&J8V2Orm%!1=Z!)HsCkt(A zcT_iBEX-D`p*-W7Mr&d%g^m%_v1`T-8xCE>o3r>NJx*PE(>)lejLZ?A`ZzsYp`RSn z$`YWIAW8*GsgWU4N5`vH2W{R`eG~YA1Iuo!ed?lqRIzDd%xQrU-O`gjg` zoCA?hc$oz#@&P!kbrZVCl;IN#pPv5k)}t)M_x+)V(AtNXO!&Mr9H%#p-7lzsaW6c5 zq)ky;^w0iGK-3cNESeero2Ton-rk#gGU%R{}TN(xI+6jaAXDrsywm zR$^YxBSatcA$(If%%F($P-lBht2R+RT2Eu`Mld(J?FJ|n2b$NQI7aa!o3+7jn(shQ zwyZ0!)#hV3?6%a5hs}h!rMdIdXe~$*@+huQ`Jzph@f2udiDJl~?ocb&tEvn^Kb+Pi zhf|!p&J?!dw|C99&X-Y)L4g+|DLy#xqRVVc2n7la$UA}4o4;XI#qK6+5g-5ExqTkh z%nj>QJO!xtsc=s=#Xhb=$bzhMr7*RKA1 zqx8E{1Z;~VJnRjgH!1lnK>(5+491mcI*`*uL^GFZ9{dI**7martc_263{tl#v4Bdu z7aq_69Q>Yl5-DE2s)9QPmz1$e%^rRWOnKqjE2_e)RcmD2^CzH(@tf|Euh9n==N&pg zGY>D)z$ewXj(4aZSQI`_nXr70HoQ3hmAX>^=?Zn;&JQ%k_%56BUE#2^jOKFXPk5!; zmPn{@&{azFJx&IZ(7Q9n;4PW&PPCY#a+FT1~Nuk*THEwQdbebxMU=ZryW9W z(`k)ZkLsgFHq3db8r^&l;_q28QBy^ha-Dw)yBX`0hzjG)13|qP-cFnlVEFU3W?RhW%2WJN9~(Y2XH_Z z)KuB2EB1+dQF*#Uktksh6$J@4a;MVW#GXkWGyS)leA>+SSM+$J;C3ulP zzmXhrd5~p_;HR``xt^Cg_%PE8_>pj8sorYMYFs*_(i!7LMx%(nY_fZjz^t+I7@$vQ9=Kd(1Z{CZWsyBZSp}Okxsr6rIAse?+7|96MAvejN-$$u1nT` zbj=;X=zs@1xkI%$4&y-)oWm4@1igP?Ps8Hon!>7-;e9~B_?&#tdix*vXAwZ%5X(Cc zMqwS7(qFEU>$!IV1>3?G$y)z=xglGsV3+#v0x*QRM}2>NrRD=Ap`DsbMYJM>cZbk! zzVyq|8m3@+Zgz7su

    v+I($f0^q7nUc$VdAtEj7hW+T8BlxJ5Cq%f*i@eWW?eSu@ zSLJ0x21Nb3Mp_e1T*Z{LRYLb#((^c-OmZAlI?*9663ulgQMX7`{FerAHb?Bm3yl7w zY^HE>%Z8P);V@($>FVZc)O%n+s157G#0O=}vU2xjwO!yZ4v6`$1qa|~!y$ndn@WFM zCA)Dni5P>mDxrRmaR^J~m7)a{{k~W)PYD#wozw>RT9%t{o~i50`P_Rbf?bIvGCl;` zD&>iEQIBWLNF^VI1=h%eXMfD zobhZOofzZr^z97h6#Z;^iOMkxb-S+tTPk{A$fz=B-uovNlwu-+Vd%1sKp(K*!uy%xSI8k z*6sIMQeuEwL`v(qtjS)*fMk-l1Bxioo`!Jf2h=$WjN&q zxRyL$sy8VSTLEToRwwZoA&h;Iu9INcSgE?s;VAj<0#Bzv8>c<8cGH!>`L7Lto!dsc z$xQiGT(zOlp%epLs{KZZM$&9v(gEm3_LTW@rCqSGp_~0x9^RW*GhqmFi|*O{ab!Wt z5>4BF11|e+p>{9?o`^RF98MA>r}1c-HN?MuQ2NwE`ZK<`p4FtbJP{h6Wd-#sI{+Xu z2>1+v@=yaKZp%m6%S&-bVATsCBhRB(ue0G%K#Aoz2Gw72-$S|GD5PUVAH~IthFHi9^FzB4(^b=OSD}~O zT5oV2yPJAjj<5PX`3a1B2jOD$D-9djq^VhDYioqdo8eUy>;;!K0g)dN8JB zR{xZrcc?bJ<2j&LA;9~elEUl5`%eN4K_t4)0sJp!>*v3AgSWZJ^4=iW*}@Ps)PDyU zzgZ<+ENDeydYDj&SYXirhRpqt4YMxIK?D?dga(BG5IPIZJ>fwW{_a}a#Y}2cFm`*a zcI4l2fKrVD$dB02a=rR&t4+XH`@i>H&}6oDxmceZT`Q1xM=#6_x4bvrFfv%Y?6Zx5 zZtjFf5^5mtbqfl^Zku3VDnk?;0hKNCeyw?Qfd#O?GaZ$odUp+gvj8bUf~`qEZ&_8G9;W z?btY@Bpvv=|JNb_m+FelGT0EP=ts5OIp`s)zJpquwpR(aIT%|9+!u^F2G*;_9PSE2 zeLTo0GJ8-qVzFe&jKg$in3s}2WxY^o^q=t8WTwKd8LTKrJDWtJziYo}E#J`s826^Rf!925q{Xsdn}VClle zpYWGk_B-Z-dng?a*we44(pgtctXO(C2ozWg3>q44wRCx@u?h{3zYKXf7+LiH;1V}Y zfrw;uGd}=KFaJvU=!7tF^AmkCQx+LUQdKx}It_vL=CUxQ)_!~fpJ{YjCTmu+sN0U; zH#>&V@AkWQdnS(HqHfv;QmmEUxwmj$YjHD@DLB~nY{jC*hR zQB6tt^EqHK^KsJHr-dnEi2hC|p_4<7R!msI3Aun%D1;E_b0_Z##ey`QP_lZ(-)gE< zrN5r3n@d%Z0C)KFAb3_A+m?zII=rhswp@Fo&o-KJ6#}*5`hLIr^MoC8#29zyWeKx* zo!53@*h#?e^PcbGHg&lF8uamt5CA!fWZ(Kyxs$I`yZ}8r$^)fsSyX#*gIhi3rQ+Mg zgX06x*Sot}%eKKKqYkEvKsG6SjwL!xSvXlw%##whM22{>=xi%y83jYQuE}i(TWErp z1MtcEIBc2bRKJs>?Gv+M?9Cj_;z?cv?F3#hw zxngPMedwW6ZY~!m#wTebUt&JHki=|yvuPA#?dx^2!;%^8R9gAMPNN%&m!ALdZfioP z)KKYy)JLZywZ3)D2~ZC!k`^jlJ)!|98q{lhzvUL%Ij@~1KU%$HaUvsdDvR54o&I%3 zUPrM{bZJKYX~pg6atgD~pUEwq^a4wF=bo~koi0t%NP##epSLq zq!IqzP=V(sN-6XYGpNBYGj@1AhUtza#098Sb?dB}0B^l>hC-1%#d8E5RE!#cSU_5x zfZk6C!wcIdkZbef59ix)^0THpy0;wg+$@%LWf^jF7NhpUS%##m2oG)*T^H`{eb zuSM$Q>*(n2DkqJ=MBsu^!KMdrI(ZyY>*DTc4`aqCQK&bMDcfN2gy-lgdG z#cl~t2M=?^RG3AOt+)Kd6SkmqGiz^dH~UHU9%r6m2p?r-ACpSt1E>3%bL#~~A@ql2 zm(k4DoP$YqLfiN#m=uq%G>t1Xf`hZ1YfYa{lDb^%D5ztvy8bmCFKox&tD{5s?u zW2TyG3&PydVQfbuG#{?Gj}Mj?RDpZ_GaZ&IosS|+qX(DlS0Nzegs*l=K1>UaRZta1 zuja-v?-^w#CDw+EZeFjJi@AzOGD&I>zN*RsLmE%t{N_MK=+foHfvssqlcQ&vXKJzT zmt$tQjxg|rl_urd1nZi5X3CqTom@GQ_1dm7lLX znRh!V@0&~kdQ=?Z!YWX)sw(`^8oeVo^9_iyuq^m%G!iRBiBVtZJZ1+bei;B!_ZS{&Oab= zc*=q@$qr!1B@)A|hb-UGikSAk3(9A$7Y<`pgd&kgk81rAcUiT$EW^OPTI~*t?E=vI zKGWE67J9d#lU4h%$A|WxPYfI-v=8>^1azbtuzdd>>VHipReFFs%u^~V#Am8()*0_u z1(#^rSEpVd#2y3;VlPd*Rf3l;GE|3GB#n?vd@v^&L^xo#ACfJB-PCIr7Lf>vVlfF* zvLOD!`HW%m17jtsGm#enE{795p>H1Fj940+9~Vw}n@ds0_-#AKe?^dE5Lct6H7J2R z0R!tpV0<2t>YG^TJw#@<*0OB+;C$bv_&dZ)sv0!5z405+9PYGl1U%@LVpg<6)ji;B z?c=Z`wEYAZ?mGZ>*&)=zi<%MICN;La)&n5s&_P`5$u8tWz2+ES#=ys`$*x46SL0B6 zEJfDuO!eqi@XUPdHC_Z~AXDM$|XK<&8^3&{bXQNNQi_z%EdljAB9j3WhVZ zj*({2KCfozu>S4teRT0R{o;7|=y=$S+tulS*<)j~b@P8cp9)*8vJX|?$3;Ixb*Gy@ zKTkJEs?6L3O;+nHb%n0%nQ;antn^=*`NPnEAIQtSZ2s}U0s*yh0|CJ+%7B8Q0YO1Q z0bN9arqohH{C~CSrA+^uLy7nGePvn+KZDt8G;YtoyCEhBX71I_XL>*DzvX#m~0(_X8krRCUm0Iol8siRq! z>He9H0gA+&yPrv0CsaVK;xJ)Le~y@Ri3V;LXI}}h%9@d3r6`xW84E1N=Wlh@k}pQ9*4RS|aY3bk& zwyvA$V4sdcLck7>A>>8Vf5gEnQD0l@F@0`NZh8QY#}@+M9ehbap%0Yvp@);`laCvC zB^K8x(iu`rn1VZ_l9&M(EdB>lA)gGhWBt8Nf=T~~bz;;st}fswQJ&iXBzC5KYZ1BN zK3isV16%;K7Qw|Fzx>dOXT&-P*75}1Xl!qNl=!RApR?PHW&7T{>UkIfT;Ra9pb^J8${Dp4(M8QsMZ1sVb*`S}_DnT^KY^R~O zl)d1d@xuL?Tuul@)CfWd6;b3dae)Fau-fn=Tqs}?E?_Xi5N~$pHg8ck00U-Ni970J zP$IKv4DXf^r8k^;pF&?27bx>Vk_=3jB7+Jtem)b+7AV4ZV9k~-JxZK4GySwPN?ihx zwjPKXk-zwv(xDqXmzFI(a4gPMc7Xk%bITfH)B4~RWRk>Gw&1Go2#-6#gwqC(8Mn)O z2^4@}IhttdjNSQ2sdnyxa}Rfu0^Bx(KeF$P28Lc?q6($%Hqziss zMu6kW(9{uDet`gP3i*X8m@^K|drX@@i&1ZPhoZlg)7CZ zLos5+n!cg}Ytjqn*`mX*!19lUa$1#{-L}<$DFEk@46x_UFDQE-A8wH{2x+NrWu8IK z2QqsLJp-sn1qEyW5&GI02FJB7o{A0*k8=EFg7%0##75!4e?vuu^ZlsRLH3x-h)Z#R=7MSIw-v2ec z(pkuR!{7w$u|~%-H^pz$rVkVk<)-*^kHJNFSP*Uc=bm`{Nfjeh<9<*o(JUH~(a`uZ z^us+{g*meii6!5l<q$Qb0u>P%BUQG+73)nL=9!L#jYnUB|}qR ztrn;_d-*`w=9n`1L(p{fS^4?yHh{@5VXfiN*6n8!B~e>EmQ~C*`3#M#g3@D;ZYdQQ zL?+sEJ{(UKaWPsFk(Hu0I;&U&#~qFdB`qnttNkjhI;39}ITSBD{5w0*|k@$Vmlx#aPj4|>=(I^W1^ z(U$n$N>Ua-FlbrmEI^Sn_@pN_B^~$ipTYj-_@%RN=n|!vrd4GsQ4p#ar#{&D)UZKI z@|5EKl$VCcG6sw4G$R%D#Bo}YDIDvj1M&?oLV z_P9}m;e=QzMU@~@Im)sL&c>j~Nmb4MLR(}vD91(WT|0bZsVqvBIu5yj6}bVIe{Xbc zRq9R%5b#}Qz}V8=9z$Q%g5UCd z)r_PT00pwQYf-v%zZJoEk|%=G5BD2inw^*rYzdAXBHAp=YLvLPNjuU$DZ~&9au_QQ zbxoNltfc7GEoZF}lRU<2LqNyrk~$Wn;RF!?`AxsInhD$bY>T>m{Nz?X2cn|7cS57O zp2pmRP0?~PHY1~g_21xKA0B+)NE}q_{p$xq0TJuCC%e;UaH-01vKvK1N1F&3!C!5F8i6i|50LTm$O@4ozav#;faC zpAUoX`P#nh%dr0+w%#c^&!}D7j_ovR>@>D*HE!J4jqN+OZ8dCc+qN6qcAEZA-*=5Q z#=pk5GsiQ>z4dI)>pG9~5Tjy!je!^SHCd$J(V!xG88N}|zu-YSB^>#~mLCNL$-{*C z)cU^j~4feVcPLONk&ubWo2>x2{? zNP^N>PR1>9FA%Jfttq65jx+l(G1P<@=3@Fv0hRzX-&r76nb$oG{nd`F!aaJ)bi^1+HVb zRG$t2T}Wl=4!8G6fK+p?X>7#i5tmY+GdZS+HDi+C!b^5{>^1ml&+7y;fd%L?^i zN{;C$!pRiILg0JcERQ?*Zcp7iE()-@~=c9h%wA>m@q%W`bt?JBbZcK4E zfxzXxXLjU!>{oMN-Zj)9ILV@`g|f2HPW2K8>*q<{;D?igwvyDdxkg2%WlA^DA<(J& zbnmz^Kkfp${9$HVE^1wheeumM7XEvJ)n1};&iN-|ql2}uLM?)>sBTVbSuo`T)n@sKDgb@0c0nBlm0(@g;eI)|K}@4)zsP9($?IGQPjoK`hPve-@QQH`WSz= zav@C3Ja3~U#!@aQTnqWS=UVoptiD`0v!)}7i(-F{P?MRdtA23n{to7?%A})k!DE>a z22m3UeZ4-&2u610%iYC)`tflSohAB5!Y-LELxcnAS$6GfuPIQJm z4c4{a`dMX~t&2N=3&*lnUvcAZ9g|s1tgEv@_k$$lvgzQ}cSK%_Thi-d1NDKo)nG67 zJ_E!LVALRi^m7}mX`z%bQM_&2iXiTJg(}^*{X_b(d6IU>NW& z59-^O`)v1=(eAZwH!4#i*Yr8F`Wv(u=v{MjdOjVt)euF#g*k!waJdnNH=y3F9b(Wd zD%+uW4vs8JrJdV$b!MkT)f+s%CT05x0oyqZ?RPuMWPeyY3Zk^lvDdOMA#?>Fc(;FH zajT7Od|+(J*%iG+1@z5vTq6?f=VYMlb8saW=b28sX8L%i9fg7IINV_NcptcN9|=U^ zqUf5TMVv^_D?>j!!vi&g)tI%G<@m7yD=YGaU#$2);#>t81I9HaRi5K7T=XN~A4qOZ zPXo^`C$30C{7}2-9w{ideWsTn;!SFf<>oJy@708*r)EC)7}!^YE(lwi%ad~knd zf@cM3?R};|E|7a}D5RI`;VI?A_Vmi;Pv_5Ww}+=6fBr}U-O(@7Ay030R3ct=85`Nz zhf|y8V(d}Kdp$0rtr)$}bwF+Ks7{>sX>foi=lFhSZ->nYWXC!Qr= z())QaTQADOo+OeZ5O>+Z!TyRN1U3?MA8`s#+rQ)(w-PT8q#PZt&w!oYZ&~H^5X>Y^ za{Xw2XR(aO$lDxC^0Axu76zi8)|Fvobrw0S??ad>MUmCaqZ7>1NoaHae~`OVdZ0FP`!FQRuC- zyxlh}GA7p7SZn|b2SjbBg>KH!-(sjH`m*+!$=ewK{C6LB_vNBx9A>mKl3aZK$I;5N z-$97D=JqTGn`ogGSFjb>wsAUWk6jDk>9ZvETKt%hz6T3xB9^M-L_ zbl3dx3l%rwz9GQ`?(0U2DtVE3lq45fa`ZpN8OC@)ufIKLlQ!nTj_zj`AFrzUm>xBk zQkOIXzdTG6NC&`^K2qib&8LkqRMcm=63tk1GAVwrYYJOi8L?4@yl@cs1H{wIU@Qbz zY-x0c1@J4Av3g7d7iX4Gkxl05XD2E~YH_J?9<$f}5PE)8@>oh=QSP2pFqUE66hb5g3j ze2MAi?igAI(gmwZ^$fkL{Ge%Pb?w2*E2nlg%2YE+I@E+VmpwPEM6|7K?kc|G)ueA9 z#^`#67T3VeZ*bwo=gr9?vJmGVdC}*q`pa@!%dzuup~-f#X`a#GfTS&^5uu1MH1=x1 z>DJ)HQ&wx@Z4YBWIWH-jOU5^TQ!CUti*gcEgdo`jVlmyxjfCy-#L0Lp`A?PGl{i2B z5=uauiJvKnk$b0Ulrh?MgY&pY$LD$Tq{FZqkaHQI_6@eDAbx@}NfujCu8rR#iwLaa zDF!6v1bXRl!@eoviZ`Fbi-Nn)GyeKTw1A}LU~1FDcCr~2=$l)y#!E*ub;@Q)8OO6!{wt~Z!Ktj zJ&bw3zn;c$QM+nmJ1yo1_a|+hNi$XIeoj?0r%farm2XhwUw;rgp)xKLz@^3me)4Vo z044W+WIIq8DGiDEjVnE)2Dz{W733Tt;zsPG{$hrA) zn{A`B9#ziRAcr>$p?YgBCr%kf03uS9%Uo7x|Gn^S=Qhn*Fgur6_fO8~Y?A}}Vfc3@ z1+@d{G!a!rbaBOEgQJWV&nP-AmNQcPM}ut+oVhzlkQQwo)%INU7Ipo5`?wo5p?gH1=ze$BZ6bn_)pbfP2;Fm`%Gd zRlzevWR0@c;I_*n$(JM57@PTp=Eo{4D-_QM{FrK}H50+}-rCZuAY<=-Dkl~;G5yfv zu2F{wOGJ4oDn@^V7qPJaqa4y)`m|5%4=?74rdT3c3cukUzK&^;czb#lRuA)Vk@(A~ zl#x%uamU=*=(|32nyc`?UezZ;c6y`P4I;3K&d5J{+N(hfGJ16W;3dOm` z)ix}%3-6(}%VXK`s~!poOsA`%0E$Dsn6E?*nee*_(ZN`|*b=`jfc;HE%3wY+KUSWZ zWL9vyZ{l}iRnk1|`bD$!i^U@9Bk3V^jDLm-bq4w&H<)5KT@2Cl~6oz92JQ}-$a zkOSB0mQQAJ37+%euwKb}zhh>j^yJ9vL7c{wxM15s3Bfsy^jVOjhI4D2E82O4LUYlB z4bvFx5QGppq?5+E=tlYkTdyKJ8EU7{his|Nw%6C?#Y$eq0h=F^tv(%$ zXLRJJAn;^MYZgMhKBL~uiXXTjyZ z_8n4+9e@d5#qJFW7l2_fgCd#wjucc9VCrUiN`#7CTB5fRz|AfHXT^ygNjjkVMc}@U z!XqTo=7)NnG+_SylMUm15Okv{1l+W7hF-P&{LfkJZNp{1K{})sS9VD6y0F&S>A_ZMS&f}ab+p+y>b|-!k@w}OsnexAI4CO>KWryhrIdY!%LYxsf~~lC3mml)qF^T=@5gO>q4_V$ z6!c~EZ1m`Ho_&4y$QHuQsP(C0-2s1_$h4oyN8Cq467qz@6RWS|YX^!Ot~d!?YH0D_Mkk_e+ygU-kmEJEif8gwWHv zq}e-OYZAAqJMDIpR=rh&6s=CdZtn!J!FBh#M7-)A@;qBjrkE=T6y~nuJ_F?60Vr0D^e4-s=dWT_*{dZbclVrn}6fYaK%PZ|1BI@D=8Jcd4#)xxkLL zq%V`pod2|xP0`SBlvC|w7>sl2^pNj>In3?utg(+RBac753j^0FYw!Y2vQ#b&BLW69 zI&@CTzU)US8f0pnlT<>zEYVM(Z}SjCsk&K8A8NCx;_uO0GuuO{=UWPayW2qc{#c%Y zLzL{duk;k`Jy-+z0A{Gmt%SjOB|v$aF{G_NE((KXBv7i(`?oClgtXmUZic-P{E6%n zvV>0veh^!&kPl!F52tRN25sN*E3ql0R5Vun=0hHLx*M|&>RMq<-UHpf3i|`EO&+ru zFe3wQHgYK~`YDu59*heN4(IV-VeNF8lnotqW|(AkSQCV*D_>ud4Xd(W0ZLlYD)eOS zxa8v#tZfl|Ryi=hLGegpTafAAY27CS{?*h@kU@kYf_a4R!$SnK*P@H3O~1RkioWef zw@LD-?Rz)(qD(MwtsJbCi{qJOSd1|3li(jW?;8`a5o6#9Z(ON>a^$EBAI9(D>?SNQ zJjkCFrAfmH_nmw`o?^KLxHriDy=GllwUE&nmw(@#z^}DeY{Pn3g~%$V3IUvp)VIx0 zg+5sBBRGm}gc%}cAX}i^*I{P-Ah{|1isD?nMUBjAve5tWGr&Gyb7-S4RP4~67Wba= z3Uhk;Ud~fH9ZV>8r^uB{o^6SL(c_3CK;ytqWOoEkezx?FxFl;i@T_J0Wmnu3%2*{n zuTnEjob_c?L**B0C6jS&q4VV*3EaMd71ilu#X4BO>nlgu-0kt_KQw-_0Z2bNio}-D zN=7w48aK_7WlsI(28}B#NzN61)>!!>yA%2!>r((qq67yl4CX8 znlB%L)IZh>K={^)34D+xmC`@gdj|UKE>g1T8R!S_u1I`wTHE$=VRGC^fEtJJh!+_N zCGU9H)xJBnpEff^`C8ATBS&@AEe+-3pZ? z?>64#r(deq@4_TL9ildB(aIEGqhjY41q8icUno4Jd>QY{A%UKGcHwTTZruT)R|SY~ z-AR?4(BC3EUiINqJYb8xkrxO2GaU5H*MfbpaITY?&gHJo_&UyAnWpbF-jf;6&t62I z`^O?jzb)-uQZ4hRcnh@dwzcJZyNG#cKZY(MAKX-fj&l4l4X&hWTN?chrH=wT8pS`= zsU9+|DS(S2|I2C4t)sY-<7zosF86g=go!ha@yTCu`42a%i^l&hVh?=6JT%b2z;tc@ z?*!vo3KR`8wzIW0HFmbNvt|09XypG+F#gk%NBF~T?>|<+a%gSXFiO7Bu7nl0DdYAp zw<|hcS4y7-1DcN0zH2#B(#Bl1{rzJmeQK$dVrpDv0q&Hj!zfD6yUQ&Vx` zY^CrdKiysHNn9C^%lDSD=K;=UV~BrI`I8vbdoWl`e2h%~z{|ePH;{k%b=-ili^XVR ziRoiP_fWOhdM-C!=$N6g6TFOLlFMxGu3Te%z)8mLQ-Xe}oU4BP(0U-ysR8?DH>%Yv z<%&PKY~{y-nMC5@@@PI{r!y3Ogm4()X~$^@gI8+DAXdXi`bCf;5d8rXG`R4*I<<=f z4KDiEs1dnW|n&NGApgw|x$p0oPJ`ab2 zS`Q#2$c#a)2bXK-m!6t$;jk{kecotADc53;^PHBA(w(i@0K{-N{Da}7e4L+s6sl(d z-OT`Zl(O%J><6MVvLwgh+bpQXj~>zVDCHHZh3od*uVLgb(k3&?<|S^2B>_ABb!)lM z)BRD`hj*Ef{>k+6>s|DRcezkz^f77QN|X{O zN~_ucUiTF{P}>SW`5nBRU;5$PXqxdptKC2E(y!=s(_l;R-d_R9n@YvU)8aG?bNa>` zcQY&pdGWw&zJ<<{(i3x2)8ZE^dQ;_2l z!%vuV%|9LIwGh<=YJw}4-W%__uxB=>p+IQv!bR{A7nya)zm zvOPlrM*2jhagS}nH)oW(`B-Kr>SZz;22p2$&HCJDtW?y@R5L118is|v2L6YkJ6=|F z2G@@Wn{$tQ_S2CiYv^xOs0wj(hkVRg7%&`uG!}4;8O7`K$UPzm^18Z&6zMHgH zHq6Q*V76;%GJ@W3B0%wY8&UI(UBorkwno-{-{+-S1Hr*9x8GOv*|xfA z`4nenyev+;r>YmG38QRa^m~&1Qk#xa3oUqIUe1_61qTJId6e%HSwerIRh4r6_L{fu z05+0e^I1W?rH`55(>>#iIOo4PUBha(ey@9Nxc_-9x_JX_ae3H~IzEucwBeNTLoS77 zr7OdZTT)@z+^$z|N~5nvNArLPAGQ_@r9!s<#Q!Os-r}IB5GwBxcxnd)!?A-A`oP{% zX5qU)^9=9#6}I&Dw>biL<47Im%tT-(n&*&Fk}fnMpq(9>Oa6E#a8E0CQx}{ZL)7=j zyRY=6JeGBsIhA+6 z!w<`Nq}2r6Z6uBtoX!9y@Ngnbbf#B&R{=(D%_`)GtPklCqCvm;N9$4+(Eu>TWjVX4 z=2Q4bXC?Kra-^D`HE2W_@8_zIyX$usEMCi}@0D(v6D%&eH%z#*qU%agpu z@^ir9IKD!3P_*FYZhRa+29D;tk~~{^rROu2Fh#IU?#1zO27Si=`H1kTAW8dx{1+2w z8Jf@qsAVPQAU=qAX%Cs>ZAk-|*z}qWv~X4Y9OXRXk%wX}$RE=VCTxg;OeH8+n_xXRz^B>8(@` zovFl|F+-e9iE>yaA${OWZa+0ygE6~p16)$mMoK2O1z*R{+-}D zlm}3wb7mQvT+ow$e#ZdJPb~@(WQ51rC) z4;ezM)cs*#i(w7XEs)ow%N`~?8TjaVcj^ZFPLo_V{z94+pIdgB#XEt;VK|XY5UWUo zY7I#+FynDAo@dpb>p~i{UU!2zkFe<&bOu+0CzFt8M)g=r+1Y_`+fSUa-t;g#0EwaY zu5j6zr|8g;zl$JIXdQOkL;5J4$8b6X=i1+>UQ;qY_%{^dI8s<_8d{lJyCR=M+?TOz z*D9S6@nx8qD@Ghk%O2Co8oBhpuDW{xB;QJG9n~FL`%|p3S82$%_u#SBZSPf_d88La z2=rF!8jPBsCSU;X+M(wdl3r^P=%%g>xsXovp&a_3nk>>-@Sj9{*%{}ayqUupeu6(n@=QSm_{LzJ3p@}m zxsr5?brW@)enKunFy(_fLrZg_9Se^kB1v$wc}}h2vp)uGb+ho4%Gx5P)4$Yk+fL9x zUgWkm&BpL2oB0I66i2MlONMK?Y#JiNhY`EuVu(PtFijtdO?k_FTAGTbXBq4NKEt1u z!PJ*Ur7jhyZDk--J3 z03i5*?@ky?+gch9%6?6hrob5d_<`fd~om<7yaF&z4Pmd!v&>B@cL-Q=b_(B1-7 z3T#|;tDjHD@rnrK4)x5H<=l@66qjmS*5k0Ssa!%VomZ7AJ!P5Fv>1OEUsrs}ATMBE z3lp0HX3#?qI!raGVpcvUm()jO;ZamhU~n$&!D+^Lk$2g>Qy$!ggcI0+pE`-$A+!;i zh|*E_Dg9dYqO*GBm7T*9tmtWzEvVr~QAK)}<>8;~jY8Co_b>#@s$Y$3k0UD@BO1UT z`;enJAK1|xVlY1Y*jl1>P6x){V{G2&;ZoWG7kaTmFrs8=_bX^J6|a|$x)vy;0VpiO z1LGhXY;2u~!u^AYG1T8)pAg+-u0F(CpEX8Amk$1#dLrLVeoL(n6+zRW<1KdcCWr~g zC!3VL@RqbWFM?<@FPt9v6w(WYgp-*NWJJb)9J0y`Q8!7Lj*Q}CNAI9WLQ8uvT>fSS z*bD~qhwCspVDkLrM>5kTrI;#kXIIA!4=*Gs{sArVdCxPc_VB^ykI5jOVVw(8NGbhA ze9aCyk=8?ccEMMtqC9hGs$_@5$z}%^U<;1QXi|#P;n`1Ah-~_XVZF7^_vJG(zcjz* zbK+o=N|9H4!5j|};~BZ83YL>|`p?ZX;D+T+R5=!sNNr!_cpS5D4AMqkhB9!`ZiYzPHg6?eS+~`1h{7G0V360~Ip4Ebx?cF2|T6G5I zYdav^+*Dq?p8#S*DH#*=tbrz;;2_V!8SVkwi-1aIm7Y621UVrKyZ*&5Q23 zRw!hj>H-OD!BGT37#HL6iVu=J;8PH?N@W)J>Mq=s@V$*Ed=M>K%rw7D;23Jw_?Oq2 z%|hc~ZB!KwWEiG$E$uutcw9#|ET89{sHgC^@ltsWsJouR(O>LwbqJQ|6Of6Ao&l)l zCO02dT4&8r#h z*SLujt!gJ<5l#n?@5sN!r&tV|vGo;j`iz+#c-bZlA`OJdzK@?vSB~b_78>y=Vq0%nhe!nT z3FGgqta+KUxFJ~R_EjJ|(C{{pQ%EfGaCDp3YndH1`{cy@Wyles1QvC=v>K_JaZr?k zAMQBbCTsZhYr8|O1b^GgOe|SzP`V1XA%{2qu?Z<9WF@@mrQyxk4bc>iGh%<5r^Wu$ zRWXix!tKu`)bp!JV^Ma#z7pqVVM4}6t(!r+N*fw#-NA|hFlbAdtEeGu_n4HuI>ENW zO~FSf67cu_rPCwF0W{vCFq0njBSE!i`iUS5gI`NVJxeSs=Hs++=KUrkKV3s{E%;;V zzv4ga=#h#Sr}t3b4xU+BuA3rtBin}9tD1nXL&S31S%x@&+M7i}{xhF^guz8Lgl*+V zkF!DYMbGawGO0w)lVb(A7JQS5((>362b+lk)15t*dLAsKB_IJc{H$n+QZNsu-!*Lf znzcx$82v|94*yA$#I-FQCPRHY_$pL#I__8{O3iQ}(P)Z#X{v-ZLt-@%@cAib~+tb4# z`KZXgL0)n)`v9_f-8GJtHsV~t7fM-~$FdZkyl2y&wYm$xB6|a5R2#5k_P(Z9QnlEB zB-0v5guZf-)82I>y6+~(hrW48RnWa~lz(EJ`s-`tuO;a~q&Oho)mpY~YkMzItGk#x zdc}aXKG+?<=C>~?R8RX!{SO<sYI%Uq2}R2hI&9m%zW4M`?fRO-IvX^KZ_Z2o;3U}@J;`$1BJ9-g(%wzdt{meZ zCDMGwk5GEGo`Dgk;nBMnKmCE;t0nwd*S6;%VigW00h@%3auOyMB@gd-?fu`MvLALGYyZ;} zDg9(9u?QNRELi{F!HEM4`2TBgqUK?5`aco&{~ek@2!M=m9goQag4|8bnR-S?Ms|@# zwVE>+gk^McRno&ZjW1UqBOH^C<2l9VSAX1#s)6AN`%SS3uUoP5_4B{Jt5n3VI7j=p zdnYeiiMZd!UoY}3wJLq(02cyK=Aw{z*3YXC5%N?=z1{dR;5u=WIXJD%pAEJ^>^as1yYW;RKPZe!w8w2aT8hg#DO+z*g=hU`+!} zOpskfGu0j^nh!5im#dp)aO1l8{v#IXrfR>6LD3^7>>|Ga^m5OyE<2UsB;}O?_P?#> zVqO)SvG)tt2&=u-v#^C#Zd(0|dZ>8ITc=89g|7{Nyq)S4%DDHLKNJh?1W0hls!1B! z6RO9T{=)R&q9=nr%x_ivoNB&Kosy9k59>T&6#|JknkNQP-tM*dXF06rDWICd$aiwv z=#cG_l?n+U152cuIQ&gwI}pP0FW;fhyO6YjVL5qh$OduXx*sipjgU~Tjoe4hhxl(+ zV*k^(Kp!liD3}E&2#ob(hjp@P*uQ~x?g%;p8|Cegc#8+|)8;YinVwH{#y@2g4JcjIA;XTesbyQpbC zuayqiNdfT4W;Ox4+9NbiVXTWV_>@P>>jj*DMgd_%P>AC+qR$dUmEyxI3!cq`y8?sL zZJ-oK+T1kKNOMn3)bBuM59f}|SEioDoP^Hd@I8mD{k)gSJ{fTsVHopx52GCezr^$y zGu=p_aM@1xLFP%|#EnU&gG~UhG=$J5?l5ME9?Asq1<9d zW+Lf-odRAONG;0)hm>&=18Fepp~D!w38tXrItzZM$097sae8IpLl^Ke_d~7h>MY&- z*>{T~^<|It8Cl>6vcs%c6H};~#~DpwfCuU)JUtpzf{W;rd-p%Clqj$l6kWd~XFOoM zfmo$M?}`-;FU&BZKH4aG9b^_H3HuC+uKUn75Kc!+mGD8w1gm0VVQu`1FJS*C6%hFV z`!m$BK9~!WAO-^km{3peb&Yp!ec_UunGQL&yu#*raDr4tcq_-z74vh()>3I82z>v; zrBydnu$V{v-uEu_7g0_LfQ(YiJ<3aSd~5akIZRdzx(5 z7&^LmD;Y~R?7E}F{jn1@W{j1C$g$@Y;2VK5gqOjG`zi}{m!7xa1)-2gBSjdR$`4SS<&YxKpQJ$<6Ts>T#q+0{RK$~li;Rywsn_n*)<+83fGv6h%hn7 zlc#Ja#%6hH_9Y!d`byw%D^_Ar`iuLwLHb#sIoPx*Pw??Q_*)9YKzu(}V+^k6DC?oh z-l5e_TgOp0H?%K>8)A*f4mK?9hDs<&(HJaw}wP^IO$CS~YwZ>6p z&QHd6ztS?>aLFAq5T?BUh96ww41MWb_E%2x^e>=agl4kW+V=;u;k+`rH^ac?;}Vkw za(jAaqGe%wE4b?V3yc+;G+R7OTwsA7&!q9}E%h`+6D8gw2p9+!^e|;bqOZ_QR{)ok zK;8X`g_Ok{mA6BOEmd6f7X%jV?YfqXc_?8|h8PV~Ef#4uSe74tl+$?0PHDFdZ8-|@ za&9@iIelhQ5SX~VBdZn_eTYsYS`!X{FO)VTmqb=*#5!Unk-h)x=3jfvgB{T)(VscN zK^n+b2t;6q$yR|2EC;{4|5wm+?Z^8amEWrVv6w^d=RLm zW7(1_LWBxMEGimaP4|q&C-U5>%BXgtOHb`?3M^Ibpe0hVqVPNkQybI-Q920$Ip?2; zmQpccpJq_<6BcfdJ+=j65}*V)hajD}sLumxvJu01^|h8o_Q_hK4v3kg>(~8hHck>Z zha)407Oz^-S;eaZDP)*rSz87>C7wufQP8t_MKuL`ej@(TWJHf%u>f1lfsuqUgn}2F zTnR>-_6Cq78bV=NU{49ttjFDe<7KFU)m{R|#=8zNdt+2CheFQ50kQ9jkgy-r=hzAR zB&!zg+`ZrY^6~Ipvi3d!8s8)Z?g}sx z)4-*L^9d8eqI;*66}T~LH;Ufw`@U$}I2K=DXso}@v{*Ij7#yA&E`D=N4ItyYfp80x zg!sxuM5z>)Pfi$&PM&~dBIVpq=8H<#^>cf+sNwU`h5~*|Jb(2B+Kg@JYm0rbJk#?_ z#E0>bQ1+!A;m;~!bsftsU{VT`KLyBsA=Ts8AziSIzFVhoeIrzQI@&@Y6O{n&_sUuQt z$p{^|veX}&Vtf4@VQaJ&J;BgJ&oFPW!_$P$e9-XZ0yn(){U<`(fykMg5F$-jSrtk< z)`5e=?D=3zS%FLV*bx*a@)uUSvg5grKsqh&yQpto=ofH~_oEMXOPw1^Kwn$Gm3HBi zI8?DZ$7vhgPn6{0By5CB<48nk$_-7izm1&(==v-y;Sh|moKB;}RDb)Ro9Q?179a=v zS-dB#)#Rl-hw5r504#cr*SYI^`cI($X`W})@%e|^Qn#8qI^m4?&#Aif*u` z>)D|K&^{>?oqtI?QrSDB7cQHYw0NBzvPN$(H(lEg8ouIX0LW!*$!mQzZK}mI_<#It zs1>4KIKl&}IHQ*HR7F;3;>DPHE_xdWK2NXG7%s~<6vl#4lcUZr<=Y$HO3DnP>SY+X zohjk|`+AJJOo}jUmqY>wQOb8VQ&?i1M2~)|_5-P@!XoYX+_Y16(bB{iN6GzCBg81xh6 z*O(ntPs3e~`);-ZD5RH{94NPv=t*|L3$a>T=8l3@Ngf(uf%`8r?<`8?8+KXQcKe@b zK7>t!#Yi3uqaXEI8qSMv>tYu)b^^T8)>A{4e~$vcs`^Yh%iQX^TtpP=?vshWrCcRr z&Pj8o=HCZ{TMA^(R;0DI{>-4>w!LgP;;G}3GT;GHiAAuOS$Uv65wN0B6LQEQF?UmF zj`kFr5V%35yA=b5jc$!m0mHe349MV~>s>QX zCF?+-qJjDiig9g6cVeNCk9ruEL(7pC)y-F14~)5Ccv)Q&s2LLtHDV9atq?5Q7pAT)!vj`txeIhI#V>w%|gVUiOHX7B-yA2wrBoI>YhCm~l!*DNA6H z`dTwt0XQOcmi%{S1%5j7+gGkUKN?yr7sSBcGzoIW?aSdu6}G-BBB`|q#+!7~ED1nN z#S6hoQ9&@_*M309C>0+2G>0aRJBDfTsl}j24IYyy6S^2Y_RemyesmF&{#eR0Zl}PV zkL%YzlFkfFJ`Hv@oC>yo`9%}Qx6LAC(L%YdMz0~LOPm-jgf3-gT) z+PrUEF@hz4$tWjKYB|y?;>&=!)`GbL?e1vaf9G!omG`=H6-S1LO4x2+V*Bgo$&J() z&V<^5e;@)kHlEkv5~n590%G>ajlik)(rBwll5!#~G>bC7bBtmrB*9=e~-&4${TY`4| zu=;SRdAXV^>?&T;P59%hK;2!2btmA{{Pw!BspIIlNW!PHZYK^cfUO*``)zd#@~GI1 z;6-nsqjat1j4iNXpgIG+c0Ek4Ls9$t=OFrDe`cSR{$QC#WQ~}*klbq`W`3m=*gAXu zmQ-d1JB5rm@*jsm;B*Q86@#+g(#0%MIUZ+&SQ#jwVQZt|rbiAe-&D!;0KYTPCEXYi z+oL34!i9yuXwV@c&mn8Jo23;~e#k{;@MmghvsE$UrH54ZoJi5)e9|cVOo60L%aj8$ z(SLq;x`nl`+1F(Ed9x+x=Z#rGgaDN7r9O7HuBR;%BhH#>TrIxE>q?PMGY-a63TD- z@2fIJl`b2}ZW0|{kjbz`L99h2b$nNN{>&PyC1k*0YbDcEk=r)=k5m{j7}!FN$9nFk zp!=|;P-(9a$xOonQng4Rqm;zHl9WCIFj^uks(~$<q*?R$U$Zm?gmc?rt(T9Kft!4N`xsNoJ!vNEe%0jr(iw)-YkDsEuoR|N zkRWerz_+q9*)i33ftb?q-@aJP@^junxd`DL_AZn8Ujejie|-XBNJC*YVS>N`Pc1b+ zI+$RfJ!(K$zK#7HV|XvTqYo9F23-R)Su@n}2IuZMjNS^=oHXbry*`~J1nbQcPO zvqd}N)h**vnOstYM7rW#z@MqpEt37gXdRj^y)K?Qd%OekuE@`~j=WBrA){=ymt&T} z&25g_3rl%mUOuvu8fr^9!h*Ka-kz>zpl$$o{x0vyCciNGdLg*>WF{Ez(Ao}1GFL17 z|M3>oKOA1r?VSy|t8B6&b$&n@GZdCKz~(rYNr+OnvUl8RZ|UZ)X~uBDWUK8K=zv3t z{RdLORbk_Ll(8t7bF7Y2)|uF|2BF!Xd$!OD4V1?nJ+mvnCwlNzPo!+s0|fsth08R7 z;r=|+Tsix4*%`z53PJvkA2U-tNaD03sg>1l`%9nV2YI5{#3{GA3dEKkA=TlzMj7C| za?ij_@5^j*e}jRvc|&FRCgPHV++EKUfm3Y9EFt8nuG>_Ws$3?}fxRSJUXM z6tF;)LjDj)oA*bO5=hLb4IFqW{xX*tfx6g@obkI8>m^xPI1F-RkE0!aYY%sd*AaF` zA6)VPg3P#kphE<;7U5W4#=O{hTf1LS9?VDsd7pd1e4DCw80!46Xc_74Z7$GY_LaMk zh|=KpAuXI}m!>dcEZ9A-;>ZBCs15;##Y4!6Y4G4Jx0WFy6A*!{$;`Nkmf|Gn=tJ-1 z2zmUCV>5b#yNIy6vVE_cN?m`Q31{9lidJ6ZZ+Y_TsJWKxM2D1D-Lo#wGk+L!(mW4i z6gspF*AV4O0i?^?X)WWivFvaBTsS!LtDf`4dnzcd>1vKIsFSLt>4%_~2;_kUGv0qd z1aPv-)lV3VG|1vSV z+PjFwBWOVow^j;|JawjJuwT>R&uq33IZKyP*NzGFZ+v-f$op#8m0sWC0VcjIMkf=S0MxY>KmS){GVOSq^+9R&r3>10D z$V{7w4NSaPB;gArDEhBQVwm*+mGHaN{GZ^3SKMyOILJMKlqV%!po4rS-JwuQb8Ik4X3_U;k2~vt&(b)l^FfC zl%-H=^c7~7Jca2xLKRK0;*qz2qs)zaxgqsWL&Hf7QCOhNLOX)?CDx#<9iG5p8hP{0 z&U$?9!wfUoZ8kJJ2r7_;5TSY>h@m8nL4pC){0&jbL7uDdnV2bNbdfk$kWlwSV>Diq6ZsA*v_6Kin|lt} zNRCq|yn`%U8+_0wh)#2feaN7XgGQRWhwPclsD&OG)@?@pbG2>tSoMs&vAWw$s=uVm zb}u_%v`W?62)Dq*^BZl*i}PJ^g@N0ZNh{q_ImXYCoy9t$31eZBz9?MO#k7@~$Y3(g z@@}9$+VlLW5P=5TgMlwZH19?ci60rr+YJ5=Xs)iVNa5sF%Odo9*Wk9#N7jZKncxVU zf7*MvH#)z)9I0*;l*XW2f>cs;{^X|=j^iSE;ZZdo{j5tk)`|a)Y6~=oJhV!r)FE|H&g@QU;9k9 zt;|nabQ9#y$PA-S=uiKdRLp%tj07www#1kngvL4|NW_oT{^S{RiqW{j{UsRR?q0k1 zNmXW=Jm{qyyPP&!Rbel8CK+h07rfUJWhFGRF z>)gS^zTo2@6qR8hElWE!j$3hw7)n8g3Jb!AEOVKz=gq@x*XSXu=KvA#{TR;&f9Xys;RM6<;kqAd7xsmWw z&>u}j5sj1^9!IzteN`rvo}eY3zKQgrm}ZQp)wEJ%V1Tze@9UFfOFD2u)sdZMUze+D z)pv0CnA;Oh@)`0Nm7nzX`2gc*P6>u8xS=ze=s|iprIp)*zi1vxQL$hIZ}8K+?C$x!Lthn@vs!oOeNk-i-l+YLtA@GU&l^ zqFzN`rO#Mx*YyZ+%B)yPy6TX>mGyXLaiQ{wvx@UjD&y23&$~l_(E|T~wpf021gdOs zf1fxaXJ+(I2*6w;WVaLzIs*eooW_}!ay)n#Ip$roJJfV?O~^xq#bN1TQtV-aaXL+6?11)8Cph@syKOSdW7 z$W~%TQ6ECV1Y{tl1%^7kGTx&D33lI*D*21i!t%dq&6cl5RT?CgPH>GHW<^zSVpz*^ zy*%74NZ7xfCB+{^U#-YN_x>1miG5b%-AcCHByjD(`H_bj7BKa``m`AzYTIR`wHwN+ zFCigo?FIyq77y^ydAB5YX0w)RQPO1=BM#$kvl@jpK1^Hu`HN^wtNy_^g?#sXBBJ}8 zT6i$bZ^r-YK{xgNuVnrhef4vVro%7tzp;VIGD1>Ul=e63y?r=dDp6c)3cg97U%+dW z)W3CMChYI360=tB(`2Ruqb6@_sems^P#(we&awc}7Rtp(hy%*&VoG<#?=SxLqPqW!rwy4LrSfv7D}(WWe(mF>j?fq5UJSzX5Aw!xmkz z`@U(I6oG2+qSb~+qP{d9ox3ej-8(T&&-^vIaPDBYF(^- zxofT8`+nc^M8^6RU*p#_rU=Fn_?Ef)1|LBR0|upH<85YNaIdj1OQFM8#-0!Jh%_O1 zd0U3pB;cvRj4V`Vd_s@>J{QV|?Tgc|Gn40By6Hs{Y*6x&8M#6#D&pEbN2m04DifC=OFM#>0t_P0Y*u)-S^c3Ypk7K=xY9} zch%RhuA0}9{jBR#g#Pc?AuQ#OhIOuPMXhxtAH63SYg8?ZIyX!1#N9DRq-ht^9?p5= z%TTRX`Yk8!dV+f5aB41~+YJFd&sW$TeNw;gVah1nm1vUDa6%#smJP5#q|8K z6XP}Egj5aBQ_fZdKj|>4!@t#g$F=>&!pVsv*t_NPH*(j7GV$D9&V-@5Ntfo z4BLRrPF8GPFyp1YWB8JDXTW#Q(#^3O@iwA4hBbSFuezeiZNJqRs2m*xJh!dB5b+-I z2YYVoKiGWU3;%$YJxrb^9Vd?8Uoq{xu93_g1FKG6bN_NJw;bxtxeYhD;uWDPm@`$P zT6Q%z{n|O}uVdRphI@@a?GO!!d!BH7cx9X?tnA*AXB5#^*}-{@vWjb9KQs=>HwC@W z8ed0|vC1Xm9(xy~u7-*NkZ-hUF0b34^xb(qXE{H=N6e)-KR0oI3rn;R3-zJ670Rro zY8|iNBDyDf>&@=)W?`BYc>66X00>lx2nH4E_zr0G9F}=^z1}~vd0#eMd7mHMsdmoB z6#!z8{f{q*$2+kR@+;LBj~ovRy(OKha;Yuax_bu)NAsF1S#`uWFB^T8OR5ZCN1s_v9e_L(YQ7uXW62k+&-AvJ zG~xls=1~3u!KOb}mth>1VpK7eXxy_JE$sdIJ4{#t0B>S|rFzeD!oI7o7+hKmfs{us z%|_=npsp|6|HqB3iB9T}wi&`fw%A??3ofw4P@Foz?_GdJK zMN=Z@vfNp*fgm?j^zH~ER5P_QLoXK6JY#{h83^u1-;<0w@nn+q~{3;#>$lVE2 z;iMJjQP9EnDx>=z{ZR~ePkA@B_aH0mRoKfgsbUV1Z~y*EujU)IjR|#`0UAo2x3~CA z(hXpEk;O&s`}K(%dnc7DX26N2Cc9{e(m#d;@I^{a#<{*XN@cT~3dM=D_?0w-J(q8| zYU!%#44h%-q}&L(zM9SvITn|3#36^BPFyusjOL|-98nQ+@D(jpIzyrc z$fFqxl(x%`^}ro+?Y0h2hfO+0f$!#lA!FHmooVVLNG(E`b1;Z7 zFk(1p#d-E*;Xv^-rb3hyV&Ze9;xw0Myh+MeJumw>k&LomR;m8 z1y{wfcL~LnXjV+$elfyW^uF)-7;D}H*rayVmGX@IGm7k*u~`SwE}0qkSD6U8v-S+p z_8s&uq@FntJnIE^YcGa9&)!3PCNeNF^y@*zdSf||y6l!VNIfxXh0I{B2Apx>03sBU zj-1K?l+hW0xgP(&@*{s(Ulw`hgloUj?nUwxqQ`Ur);D0udNz`p1wsb>3t9jm(8riW zosK9mLJbQl|Cjk?@2cN!5<2}y0t_sOfIs!k1K-mou%*9p`v@9~Xq`?PD%&XG?w_PY zcJ!8?O!5fF`QJBQCLw>oXjkB2`^}NZ!^s3DbMCtINK1r`y-m zXB$&tLi-u(@mzs%ML1I0dk+wyZlw|#EbnCLaoW<`!Qaw=YcC50A7LJBMq^+gNkKoT zk0xSuGQtln$L|^XJzhz7;`l@1-qX5s$J}EWY|Pd(w_Y{bnW4F<#{0iX63aiB0Cci; zRWkpGhW{NUA&Apg5bC$~-Xv+G_>iJki*HDG|EH?vw*(Lt)F8Ei0C(e{N`GL!D zi9(s<0{COb$}vYV@(8bD8R5O6_s2@`+NCy@;5GXV7$sM%qKP*yoOUctEwzUK@|l!7 zG8lOOQ5r8cyXyPZlYHSj0$HVJH+LjoJ60DBGN6Ql(y$dp!|cU5(JfSG1FaC{rP#I5 zX6}cu76S!nErv{JP~iFa~GJVC89bo4dVlMJOzkp(NvVgcm#GyMQu ziQ|f(w;#TPE#iF>)q3O+Z3PY}qG?yjof@zwE__QJ(F(DZg|5uq9qBCg=5x?3VSyz@ zs?@oWoG0-|79>lAja6Y9!`;c*NSVKP4szaDNVEp9ofTo~yWW^#ZudtIxe51L1Mg9s zfJnxfO)wcU3(vl22%BpXgGI|}H<;RT1`E-6xsnC8zPj2*5dQ>4YFw9}xzk4qyU}By z!vT9PqGs5%lN=A@>GSdS`!q_$*+&NJ9!~a14LvZ>_kQUsB2?XRl`#;)}GzvV>|4&^aYU*t4Wa;pqt;qk~ zoZ$Tkp#N(Na$>6a2jBFLM$tgB{gyIr z+tVVq(SSo9-9+gEI?C167`}Y!8_(r(q97ri$e(k(##qa$f z(j#AccJ19JA=QHb&lw74w`Q%uI)vRCOiUMBx3O&E^BKqqtqkCxB%N!aZ)D3r!5$1bnC zh+4ua^03j%^xN}a<2`&iOrjqMUhrgq!fG@1aSWf8f zBxqua8L#azzl|??ImNNZg{~Zf+6K1O;HRx%WJ=W91#HybULC3c!wMv&L%`GQy93L; zCp$$sG93jgLJzy5uV{iO5T4|A2G3+KgHH#>x}L4SXobZvV^k-6{>9?4gP z$B#Qx0N@nQ6FyzXfN=VS+QIQQ2_cGueiop22AWh4!rgr}eJbS7T&`N+ma*&#IO8rA zHQ=Dc8w%W`ED!>;Z6>+bb~c*VTHkjX5cCFDYd<%XYZ#VZdf)vjdi5)ASEZDT+Z(Djiwhnq&vt^@Ue zhoUXfMmOg1<8T0g=Ua*^8-ibHg$M~=zI0h5r69*7Eo}ZcIxy~0`4@dz6ca315o|Y) z1D>=Odi@k?WBvH}JEgo!Qh>mQV7EwtU1LMlZ!nuVx9bXcZrU5*uPeYwevLW0jvcW~ z3LYc)#>%+?3$?Np;LXKpD%d~U@9YSOY#9BP>wBDyW)2<{&wYnLOtT*p9Q^G zG|+%#DKXgTHwGTU0`ENe`9K|F=!1rdX%(yRpLq(`3S8YtjOp>e1gH|p~NF{43z z(Q59OUtz!gzW}naAHeWk+&xS<;Ho*Ss968QqTfE=G|JKIMmuY07U_%#OC6-a*{?HFwmS3Xzbl*5EB} zIjl-n7Wl`q?RN?R-4&nI?`=vF?Hoz^8D>yQ{=^6mJb!uM7qfYdlF*r5W#BL|+;zjX z`t*RSYYeV&(YLIbgX0BUSMv=iZ(to#_RNjAznQK`2Stv>94wr3TXJQNI_i?BPV^Fn zXx3m@q>^_G9noPS$<97jw?a@44qe3T;JV5TeSh7>FdB{nQ2pp)PpA`VvIRM8ZG+$T zz=H%?7mt#n?fEOxC)=-lT==3pITM^(k*F|Ut<&|WpM|;LWDD!_|4xygzTRxr$r0&Y z@vW$4b@E-hV@+a?UIBOM}uz93v1K>BQ(CzS5RqMaBr^)bR&LQpiN8Ih;iTFW6h z*<(CblO47JK*uL^aB3+rx%FGWm2Z3|Ef{MU5F>?Hh>Y+&c_VGn$hFdSMMx&B=)0!| zofI>Mrsf(WhI543X96Qy=oESxkZOc|VYotGe|PK8kdPaFp$g7=&(z9KYbs>EpoX1l zE{qQ=Rf);RZAcU|(a8;f0%L2V;1|ZAFIZ*58%vu402D37!buVHjT#wW$&}`BKkpa! zXnL8P#(WVsP0I7>r@#xxnk(HDuA>^}}=RFepMfX@!H1VY1Df9{$HV z?%!Yo#YFT37RkJjCi9tPBBboZ4Vmi-+6RlacQzN(vTbGc)#bJ)%|i@OB3W8%r9J{! zSszS*T#S8!c*|+WPCHC-9kAyJXMW7+A)>$=rw1a_KiWX8ng3?`#2|QaT|rKy-ow|a zy6~tu>LVluI0QtLLiq__Pd1d6piQdC>Cc%mC5j0-ez``-IGOsRBIGh8xR#BA74A9i z0}W%`pL#te*7qaDS$Rb&(?P(v$A{4Ma#r5~vbvtpd0&k%QdK8VrKvZ2s?{tZE|1j=35AVV z`HOKY!Id@{+6IIa2{8ua2JQpD*7`tq?T8+W6w7}OAJrhP?z=IR8 z%u+&2WHw(9e~igSkj)^7EI3QpJjt|Y*)uAwjwfGDlU$*Jd^!n!Y^|y0SsToLSsH5@ zReebxnm`b9LD`dE7yvi^E6b!{1r??QwA3Xmp$a`Hj?y&S$sgr0m*^yO#z@KhF6%!z zA{#!jIum(28=7}uO;^AfNP!+~rBVqvIvxx7IL4f9lrK~o!@%^ZbV^45xFv39uuN>{ zi!9Q+SB)(x8+{xOKggn#NVp zgJC$e9s~#3n@Y)@W6OFT4bbiWLg-*roNBa117iKmm^d-VgOn2Jtg*Gn4IHpcivU;E z4++mXj#v{So_I+`BsI48WY!}BU>(yeq>QCwQTGf-@$hMMM*FOos)$Q3=!PRn1$8-4 z^cAPhK-b0NRp+atf$M6o|ot_s^L2K`o6A~55c&ZANQ41G~PFd3tB zlz1vKl8qtXZ)iG+kS&Y^PE;dfD41qDRDcIX=8W``y;7%FfFOhHlj8_h^TwA;g0!18 zy1S2G*PmQ{(V1mO8tjZ2_Iwn`_KMjQlhpQ~GJDxe@#!%j=%Xu>4y)DJT8aS4s#HH9 z<+}9GxQq9j534%#Ht;$Fvd5P(WGZhr99z<5PJHNEYlqe!vE|OlI&)|6$|4M$Hd6MK zOd(~#;*2B>g1uotq^@jAZvnTJyq3Z0t-V~6QRM2UuXIsVSR=@B1|8?^(O;BguMrl~ zqr>Dof2vu160rUz+>Qz^edd$NWuWzChEQYMO4mYor6E-%Lpq`X0A}OI%Zc6xGz1Yf zIq5@KHcH}LC6lmFx0zJeYR5fXRvAK=;s35p@-0XKUPH<5>AcPc_t@joU46mF!O&JXN=WXr$t_545|l*gQ@nO=+fLj)cK1tm4bTKJtVK~5LV zdAUO;k{bXfrEM9G(YG$PIRo6XfWt=w>CRBF)grB>;|NC%%f))q2o#p4y_(D`7XY z+?rtc8Z~6qY%7TM7T4^(pSWxOUKn!JjT}@J;B?p>ihTX9Sd6)3GSWAq>9}r1 zSK6tJCnOxp-Hu~C7;VPUc-!~2y0Q1qZY;sqc>$$qwDWE8?a^&tN8K`^N{Nh0m%|^l z{f=$4K(S(uvY=_o9!FnNNlJ5P;s1lRUv7y1!Rh^F}taESyYG%hMXCfx{y;N zRRWL|E5iFJi)e#s}b-4AIrq?i7Jv%tPBB zz?7)v%ViO?ID5h|VSr#|3f_ssVTKGzC-g*dl`o$w6DE=u{vG}z=BH$76~e@-9GUo ztIbzBQk$gIKC|jmJ{#D-<6Li(r)pI%my`=7y1p`~XF{+PKf8cJm?6;7t-wq(^Jr^BYZe>bfaJ4n)y)>u(C16i?K<7LWBM(Lik?WHt{sBlF zy>@Q*_Acr3G2am<$Pan4GWI$tx$#}qM8QZ5Gw3C2GGnA328U~yk~SG+zx!F0lQd<+;sX<8>NU$ky^xDgZo=7sf{m3 zX9x99tH(^9o7_BPX}5^-3JB12o6i92uvXtC?gapfwwh^DGssDZFwCxTtt~;Gvhc@m z1b3T{i;IcQN=?7HChgm+Ufg!=*2@o~Hr(^Mk&T@sr;O}}Dw&nTVx3T69TA+)SsB4c6mf!1t*16?IfbI;-cFNm3!+7${n&Cepq4p%UkWb zNrnV+s^Uo;ptCy!{Es1`l7QQ%Pv+mMZXir2z!jR>YAILxxz)Gp*aKHL4ZwBEkn)Ke zh*Y%d?32r~dzSi*WQZ027wEB^J_z}ran90Zad$^9$mnc5cpnSwkO1~x2p8b& z9;Bd)sW+?T2=GIPVYnj>r>n)%yHIxnaC28;kQwK;D8pY(5=W^H>m8);AjVXvX`FY zKe?2>?%#1g=l%u6UNFzLtQ-J9`zcyhS;;4l=~hN6&NgJ33{Eg_55d=wHBx^g%*HX` zG1+}WXWLtWBNI7_h6^HKpAQj$7sHzb^VUDx=)igW-m|!RIupsP`EsXoy31^)ryqa& z4h#BnpRZ=O6cps9hZRv226)Vj(FS2UtA_xECR1)19i?IOpS4N&l_kZv}xu*G*Y5egd zv_BfCpE5Xa&=(jHQX9=qKUGf-OW3q0vhoH~%L(aHA;H2(wSb`EFsAGNfCqVlckmZ? zig|A<-?sl4j{Crv(+Be}!aLxz5f+y*UgGYI*yC7hV#*c%2zrMB_|yHtHUFY7x+FKN2UDxDE#; z33~d{JHEARp)Naz@o^SoU&{4lMt~AGqrU${7|FdzOT~>q_LCiRnbUH^dkxHPeLWL! z27W`}5(peC2tF3G;f8!INWiQTPL{@h4i(@8+u5#IF;Fw;*)A$vMhPvCGt#^Rjr?$h zE@FAnE+s3%&pc8?Pylrg>rWX$mrI6>FvATf!qAut4U>1ZqA_N*w~2GYC8|n9Wv!fL zbA`W!(nq|<@Es~_qlD^yH?^y8w{m~?p|fY7)NeLH3=G;BsVh0;l;)3?tn>4xH*4JD zf+Zl`H{4sM>1cBwHgSZ5It5AJ*c(_R|T)8Q9*w%m;+*+c_A!*5DP*?2?! z99Tc@MnK8oW_itkwvtZ9@z24UI>u?k0gp`GEzum$QO=*)$t6`O_%}}eCJ1V(kRcf* z;Y6s2Y7Ur zf^kCGbYZK?zNt_okIOpPwgHatwz{fGen0hXJ#PM~H*e@-i$v#VWDPe7lyR4<>Xo_Fzup&|Ch6Z~k1B**!%;oLCW04WiR)2nlb>=qxa_B7h5bTBq8Wa6yz#kyK4S|zQaIP?f8qV>~0?7 z1|(?Pp|sSIw5ODZ3I?-=lw%dGlE^9u3g{e7KdRk?bkThWfj)A$Z^)3jK!Y*f*)-}~ zgzKb!gJP>s8z9-#qap*CboOt&pehhoPOGj$kxr1;x(d?afW#Iq4V_dWYT4R?S6;|H zfM17r@e`0|Wnwo?j z!$A!hs0R&6I}s1)5-s-G;?tFVF-2E=b;DxgfRek{Dr%<@`<3x^$II(sWXoOwo=w1uy448h zfNK1xJTE~?DG%LOW(4GrsJw$K+tq`Wl=TuQzr{lzZT?Tuycd4i3=*5vb%SID9iV%e z*$e6Bw!}A;m2=736>-yTi)3SCfNYH&jU)X^$mj>J8GzB|$t}wTOCmSbVM68x*y!lZ z)?1Qf!yo}Rhf8jW;|pUi%(qk_Y*D=a5qA5-eXrRhU0G9HeW;gQywg8xHS)>Y>a>v? zTe~vr5o5i%o!5-jliURT&fiS=B7NE+=w-W>o>^TPx);xf-iNXDmD~VjB z@wQR+%GTT^18{_(b!SF*nQhN9k{zTGsVFT<{;tA*5aTJyPEDAyq{?iW=h0xSePB$2 zRTd~m3lgOB9GD`BnGw<@oV|+m-@&IDZgotFH8Bwr>+UsQ7|9=(i1}0lYRh+JSn?|h z&3}K=uY-p7u?qOL^buP{w>J*e5Yi?|LycxqL~TTJ`(jM;0c&3grMgHgvRU9KHZMG< zV0Y9^dEM3R|ImUpk75Yn{Y`!`d-|t1ll8O|E`NF5hWw$!9e@~HJL?QDan^Z$R#3Su zg(F<;s&ccYMHK8Psgn`{+(@j-IPI!gZfz&N&oMu7xmVi(L?h%HI z+*U%%Bk>iR45?7KuMB&-@Ljj}hKaYZ`oaK>Z@wBHe=09qBmL8ksD(O#OoEWtZJAOd zq6>WMFAg}w*dC`2whYe`MqetgQic!|NN=YhKcaTof6o*8g{gT9DEN=uC9s(@aQZA` z=9c%|&(C9ZMtQ-To7?U>FFWz$idXCp*OWEyIRSsPdEB0J#CNwuaOwrNy{R>L`zpN2 z_Bb2UJH?8U*C?u7I>XdO?@Waz3{DPkT2UX1?u`2ddG?L78Pd#^M=4k$UCONl>A6*x zBBg-{Q(fY)jN>H${rDAcy<;O57Auz~_hu35q~X(Wxt>c#Q}6Rdm3AjCVml=IEt0vb z!2=Nn<%t{?ZJ1T^=L}_JYK0>*=@9dw0G@_Dir@KZ^RIf(03(1)ff` z7KZt{d1qJy9mkn>St5n5R3}B~Fct|Zf=KyUK>>+cB{HpY}%3{^g*d1aO1bmkFuz?#t4e$>du z|E8S&a`4vt_|Z*5i2l!(Z=3Z0*YYXa+uQs%?DYTDwRrw4O8p;Q%li>lRProoYsrgG ziQ}lcZAp&&f7YbNgk=+8przHc0WWQ^{$=Hpsau>0WigVtli>9qo4O8CH~(CGJXQWZ zTm*O50rK(^su07>%Or*WM^VCT16s{Q`hKXb^< z{%N^bRnvCKrklL$_RnaokJ*^`RybzvF!-YJnw0E-178c}T~iJ!O`Mr)mh`EY*XTs9zz&?k0JBeRDE%v+}bbrA&d7^0ayZ zg7+h9d7ikk9`jZ`9CHSD7VF?YV-8|n)?7xq(vysRk!+It@{hO(d+)l(Ig)bNug7+A z(L@RJJ@%Y|M+xj|3-H8r8a3mma^-zlp&`jL-8|)^++b~+f_HLo?d-It!u}b`OLNm$ zt~a!yLWn2XB@O@Ub()n<)5;GzdZU*g7$#LOFVq~79JzX*x)$jb<=g+0 zF79t!o8p#^h>P-9tm_8=O7s`q#r(ct{x9r11EKQeK}?D<2P`>U~>3&B%?H>Ga;^ zySvCgyNg}AudW(^`{S+k*N6DO-r?OaK2KmFoW%E;=jW5>8wnAWXtqN@pW|3ZXXBlv zEoc-+{_7Gv*bgvL^#$UxH6MYz^qeK3auFjxmh&EWHY^HrzM-Jfr;b2fY*c(Ib?~A& zKy|*Mwvh3Qk2em-L?&NTI$MW|B6y2Z1-^L1+X)e-K6KBIOawwgVb+=D5NDX;>!m6%gTIu|yAWZ7_oMGV5};d_dUa zT|JjhF?%o8;3@t_cFumXhG=pR9yX@@VVugfB7~8=hKCt8)y`&Ga7-Xf`QLcrrpaG0 z^q0%xNxbk5KS_5*UC!az>Y(mw~NHqkZ<`-$8E_#{n255aZ z8-vQfS$|j`4~SSSBZc#Xzx>Q*R(B1cE-);7K9dQ6l~Mp^9B>;YaS*tJT00K?KQk;b znA(?FS#>mZyLLEvY837%BqFmH?ush|_$6v*(wCCbVzQ$xteEZ7v#}DkHWZLSYLu<5 z2GW8F^0=YqWFj&r7x>V!s9Kh2PDW9#iL@|im~Om~0MINg^xG{pcDWNfn=H9HV@FtV z=cP_Io-KgbKVt~G_u3jd!3JDb4Fu0b^44xwuM6ZJ{a^MA;*(Q z;W;zy1$p|^)=2#GZ-)JAgDEyt+;^_3 z@(!Ts#s6z75Sir_$_pbG`vK`k6-l-QA#%>ym=2zo0{f`hWg3E#&`jT@2g^`=&D1_s zfyL0?o%mHTfYlye8aSyLEgcr5+{GH`S&`da^3j!nZsX6@ zofH5=-69%)&fS?idEiIwCk5%+aAJ-wTmb+`-`gcewN;feBS*nPco|hK0Pa(6Ii1Cq z$^2Nxs5x7RtTHS3q(DjRD2G}y*Yw4Vq}0()qZ1kn`td{zW^xJ|re}KTp!q^S%1@zA zoQZ_^moQ-<3lY}m&W;Y+IT<5`i(DQ^EDp@zA99cYq#Zh)8}*OaWM} zh83|K*LT9}Ri&A+5Shf`Y9gOmeV=Qd#S3y4wHYmjsoa;Leo5`yWxeTyu6XXvZ|VU7 z1)K+bfJ=t~(Fz4=)|rNgb?KyPv`?GrviAao!BjtV;c;Dp6mUR}e4>Zs|oG?a9-Fd0dL?eZvbQnqv9Ep^GdEstJKu5r4ET+57~0-5#qVnw7^c1 zxkFx=KeI(fShO^jU=oem5^xOuC4gd}sF&1TMPbf_u7*`uDxhkyw}>*;l*v4PlR;** z`ZpOLzYpNB;p~+?84j=tWj9{_m&Xp|4%5~4HLu>=L1W7!tx}3Col>8B`X?_p z56)tj*V!x=GgI?kMn=XYtE{k~D8JPSR2K~_T}^qw+_V|yym!eK+~_6S;LM1OB)B~i z%_`NfI<;7Rc1$ChEX~{@#rB}CF7drle=pWyw`xEyY8~sKtQoK&6adV_LG$3plciCV zL1T>;NY5x-+%m+4nY>sYWVvs_kg0Qt!lG|niQV5$#^bSvG(!n-I1GXbIBbNRcp5jOxitR9Ty3>HxK&S?h0h3XAM z&HOp}=IQ2Nv|Y<0iM<0wu#vn7id)HQ6_T^i$C*3qGdtdtox5>lCGD2gkqMO?m7T%e zV+<_i6;Ce<2mLq|pL*+hME;MiFDlCpLvjJ8%HS_0Mk(hw$4)D8_FmeA$ zBlNHf0GqP^_IA3PJ~c5eoU%f8*3o zg~{Oh;c_9is{yiV6r3-@ROvW>)cdf$8s9N3v<|GrjMonb?(PsiJ(rdN|HG>#Fn|}b ziu5WCfr_BCpaNKRu)Bl_-n~VBs!-~ z4T^ANAF%`r2|6A2Q82HtVOdt>x=!rE zbx6+0Z~@@ydV5b9d~P-R3_|vX)?bhwwtqrsP1eO`QRB3}WQ*>M`aos7&_fRVV@V!B zJ=J4M`+>42AcFRRRURqbk4k;Inb_uaeVRnWL!_r=A($^17ih)dnMeM1aRd~~fsb{^ zb8Hq^mRV7$Ww5ROLKoQ6w216%PfLGhzj-Z#X&4{hKYorQjO}a;+#BdM z)DgJ`I{EpU@BLQNV9cUJ2rJiPVMKq@WVCLR9TV--)QEbgO=t7TJ%%#zLSHH5hc%mi z0t48?n;FVJd7!r<;F`P5o^aXkL;4BntuwDtI#R=#gJ5|)#=!x2ciAM(L3*t4kbkTQ;w z?a)QhcnGffW*sCMvj>ka;UU#U)iv}%A=^(lr(`4{;4Z7i8)Io2^}x|@FQrPKtN=vX zS{sE8Y~F>~y3f2yh-r-S=ieSP%By62H|EE8)jg&h6wEnhilUUS$!doiiDxA}hh`ML zdVedMT=2f}BJ!gY+**;>9!mj3rq?G*H7i)#RpVuF+T(8^heR?c@u1#{HC&TkW8!S{ zOVg-i+Wd~iOUDWB-I3cj66<{pb^;afr|B1pA3-p=Y5P>i(png28^CzbJQnmRR0ppxgv$s; zsP$#CYO3?WFP$@HDfed!HE7u|3_%=$5!Dcl)0R)q3*M##W?C0jnh{yAI04$`^CYB7 zccJp~-phL))2g_}{-JUJm412`yg-+_(49JzES7-j5@*90IV~%$IMz+msX=C8dd+@F*HfWd^nu0NxI}wRTe5u2$4#}M zNd{Gfz?2PyeWzF0pkLu4LQdO0_2rVrk&5GnH#HWcIML z-V{`rH(r7d@BQ$g4`7@}lv5X2Hsp}(rqI6?HTU_t{`zBT_UrZ|%H*j_L!q=IEh}Ma zY<~^=2TSJG8IluN5pnrl{^Bu31uz-96x1U;z=%EC^~)NU^zp4t%a{U=ei)QyOiDyt zHJ3hh0l^rs-@GK@>BPa$J>0@0phpm*AkB>NelhRw;tkvV0%UZ*Km2Xf`@=iiOXqU7 zod>S~Rj2$)1g`qjY)@r@?fjh`SlIblIB*{YBei*qfp*aJb4k@#(eP6;d=mpVmHWAW zmH$&7|7yty<{#vLiq>zP z#=+trgekI{^Z$%R;=cZWMeF|)i~N@ZM)%U`Cl2|(EfdVh!2jXKknJX}rOw>Z#qjj9 z{oXh?VaAdSrX@wKNX$2BdFsm31?rA0B-56+UCnJR1fs3i@ac-u6};L(l)wnP-ergz z|9D=f>iG0<0C+h`Mpv4CwK`g8N?enuHdwA)6kjWI>;-z$yV731ZV`&>hwsOl#*7*} zcN=BDb^%9v-cLON2^pR`rC$!Y*&T$>)6bjFRj1> zjOZUK4A{?Q$JDtCTUW_aI^RaBeb;yN$Z};izT!V+0lJO7a#r^4?5*zXyNQQtS=Fl- zb<04Y|H(rtuj1n4uty616FKNcRc(SPy~b>Ip(-j|6gVu0%ADalC^yz`! zw;I6u>EfL|_SoSC=PqNB5roN6W6oR_QxvEvbJPwAv-q}2Z;(+=<|~Pn&9nu#*|51D zlLx+&pCHnOVXT&#O>)nD(Rcj!gS7$c%Ol2F|H9?M-PO1)9=qd{8q_B=K=?cH#{=VC zeBhxQNzCd9LGEtr<~v{Y83w6(7X0R49t!vo!Q`nfSj1cTvWdk4L@t7+WPyY^`ylz| zyJ%w?a9(_x5SLLOf3G*EKaUH8~2QY8V>Ufm_EQ8)#M;qM4@yiLAIxfkEO{)C&(m8+^iq7p(K3E(P0V=0vvY4~DX28Y=!N$=6o~8be>HJF{@mWB$Wx_}hviR~x0Au1k z=*$fwC{cO2pcM8_o-DBvO-USOMipewORhTc4)ddihipg{=5i4@Q2)&Wr3IweJ79!M zk$J$XU>5fg03?OVgu#t$FX%7FE9V)wYfo~)Vy*!mRbsg_xQZHq#;tiY7mE?8{5PCP773ly z_S>$ZYrPc;h%rR;5i4Sf9&o;xuh32dd+dMf1C$UfmC0${zO27A>U~uxgk&GV7S_0} z#H_Zg+P6i|R<$KfWbBt-sw@6yzlXu41e7d=xb#p9TXyRP zW3-69H7QBxA1aTD16jW0D8isUnh1%rYZ@4Npqf_*u1$lyTU0*CZrrY+OrRWH6k@Fv z4!QGc+f*$_eLHv)fa^*(1N7zq-BjJlA?IW-5}MD)fzfiY%2^{kI6EK`4){Mc^fTL<){r0u8J<9&cSDVM8 zP3X|BjWC176Wi8zHT1;~nFqq7Soo~i5++}SN~MYBd-R7W9d6q3T>wT_X6~;ip&aZH zj1Itl0y|wg(E#{6*UJ)a*?Sfn&w%aUs92IH&A(#T9=&I}8v8>@E2^uP`+^%^13O$~ z`+@stOQ$dn21whm^!g3R-09hCDOgi7wnuz5CovGoVj~=zEmWYqC~iF>Ve)g#ZharV zNkniL^{ki=$Umuw5jWa;@nE;cJPT|=Gan$NIdxXL zO*8WT)(7$@A-TeG1!7v;o++0VR}<1=E{(L7HehG#A_-saU}5VxzB8KyHfv1X+&cvg ztC;o`jfZ!MosEke%%+@^;!qeU99;ZTi^9Ebdyz6$(+M62I>Aw3nMQ=X(Oecjpm8dSn?CmYTs7y_7EoB1OKP|;s}WifsPFrA&l%fDBjg14q1SH=yH zCWeGoYRKj8d)dTnSpQ)pO_sZ3y5a7qekK@=%J9IkI;O@KgX;AUyV#!X6O2k=qfxF- zc~O=5)5n4-A;>;f^!X59O%RzRIqo8vNp|B)G5#_@BQvL*F9IcemZ;E)qyrcdHR7cC zBZj88bS!|_I07BWcN;gD?u^*krL(;n$y`s7)L5uj*gh8;Or|$J9IAc1O5!xGj5alW zA^thFStstHh)5MqW6!ZXx3>_GNSp{p9>M0eV;BgNe(Tj<7YOnsn0L_cSK{FhLu9Y;?|)5AFT4n3P5#CDJf090FMF{ z)*GJ!Xr-MDW`cRAeN>ofsPpm@Fkxe2Q179I=-NX?r3vX8e=@`L#rG-l z5}}#c&0B`p(xpeg%*d@>EU&cAe*CE z)tjLacji*;k~R%xR7eG22jr@EkLf)D`vXV$y5^c1wHPz=32AjTnX5+yS$`5zNU;%Y zIAWYx#&tr@63UQP9-B%J^^Vb%gzvU*?2c`_W81bmwrwXXwrxA<*tTtTY}>f`?|sg>_v~@k81=5VR()BY zYSf%HpZOc*Lamy83&1}010tBZ(`IxKQ^cktzRgC6?BBc+`TK{mHSlfomygHA_7UjQ z++nLb^GQl=21i*koTX^smXC$g0z-yk>KGTSj#9}nK^l|~+!A5Xz>_i5Ex-CDJc`k< z_Fkw0v;p2S0`gj1jV_>6Wq=)h@kTr<7X^{1bQ&qBBT|S`_RUT(9sG*%SRXdT`+FbTY-k~qXo!Dpyrhj z7YGd3rUS@Hr2u>ZS+cqwj!R2^ORgBve%#9~P)_6}D}O;wPz+E|3`AWdeJi&Zwj0ud z%Dw@cft$8W5-1z_JyyYpezVb8C#acV8wPiT(zEE$$=D!G_Tnix<>ih1@#|xqo(NV$ zEh&BP)npvBGmsL-1Xi#~-bD^i`5Kf9IFuTXhD$kW+8ld$$C(@M2%L~W@oMxzdFC0y zp`_c{WQ)hgEdpRw>qi!q@m+b5D}o%15O!_@P1UBD2`N*2(>;y@2zUf+36Z1j-raV?qBZS zr=7+^Z$oxt=GI%OZ+^aM}0;_*bB+Dbr4j2O#9K(E2QU><~JYj0WPwZODtwbw`o;s41&P3rsMSp4zCc zl#qr%DoNT#8Yj|sa!IK8`xsc#qS2GWzARH*k`tMM9m*%$X-DWwE<3=r2Jz*JAuKiz zW*NXdA$yxa?>0115?db2hgUbr!e{}4(vLd6*=$Iy+{#iIFU>Y>#LGn5LVWOELI$nN zdLGP&`a*O1MHc1r$bjr)jb$xBeGxue@E`sp<6}m&1b$G}6dt@w z(vwuJupu>}g0~nTBRNC&6MO&sVaB-U)0EJmnRj@DGdUQ^1#r4tz#o@LFEkevt^nE| zY%^}!EOz#e8_Tc(Oxp{Vz+AnzL$JV<2rSq@au0SYxQOW&$_X;h)T}k~27dzRLe>;u z?WIQdy5v{iFC&l>VUg=&|cAUzEQ{Zi|>QSjDLwME?BO@g39fu)_9T$-#bxK0_K zr5=p3i-OM^NPlI&D@}r$n>*H+3Icve4Y`>iTc^m=n^M@%Dg{L}WyKm~vY76Q^A@lf z%Cd2CC;h94mD}Qi*RG80csKm-;*8P)?hhRqLIUTxkmd9hhX9h#wP-PO zq?8*QcfJ-4tI_sO_PI*Wd}*_Qv%YCWGrHqV5Q%SeYM1?>j`Un%{uA0O*JNP=->rb> zhu~5&LY_8e)ttfTb=4g7ET#DjFWLH)(Hx?n`9DoZ0deh;Y7m77!+(gP@E4*vFMC)A z);8Q{pk`V&e*vhx5>@&#^Gmi#lRG8Ob_)J=b4+x5S)R!%;mJeUDZC`; zsJiq#U!3u!d{pQxolk7I>TNY=Hu`vM*nV6d+H}y{ZT#%7{`>d$teABV!r;(rzEj@yHdkp{2RnDhKHCXJFd;vvT8mYNB9RdQRMXaK zm0j0R^$)9-gwH8M3~?G4Jqi={7cz(%cpU*41lFtdEQ`!S!uOD@tm1Dj8*DsUu@b@U z<3xrr@ZE8xKrmnaG3lfX0EC#8o(~Xwie^fV+02#UYX6WH$qkHw?-%;@%@E`ds@5kW zz-SLj<_A^#K9u)FkH6>-eJ=>e%gE<9`PQVEA}_bArWn0t&HqnY!;t}RABS}oO>KBJ z5_7wH=o_T{t8Ca?@7cSFP&zEZ$2Jonm zcnH}L;zoxrIqysOPJyHRUXQwiqy6Ora9cc-dn8J|?3c)X`e~o{60!(BeBJGftqx5g zAd0Sk%!l%O^5X~WAb_kLO{(tmPc)-VjYR}mgGCn0dmpKMQ=+DBRE8nU6)_3)-HH!Y zN!s46e|YrwuW(W;Sxp088{tY3;A?!>gt;_;#9=d49JhIkl2w?ECq1El>e85t+?zm|N z5@&(Sl=WT~x6yOchd@14RPn^aLxQ|4lNtS^0ODw3PK*9N?50VJkFo9H#M)h@`hmSat zT+kzu^>@;x31GdDy4xS?-c|-xMWtD6vslpgjcV!+Z4pPqB#M5BbO{Sc0@>`nTh^yL znL0IZ`cdJ0YkFpp9`eNTp~t}u%5)(oH=%PE^B@;68o>A?P+52X9DO|EzzKeVkEIbeBW9yed>xoF2+rxM!ArR*<(T$1iGR2dO_h+?kN;3Bnh(+u zmD{J&Taq#~GBDgcw)vOcbQ?!&GhnU}QrKxy$C=;>EZ|xaOc=f5DsVs}6@JEm$dE7> zNAGDA;HJF(@?$^TAoSV>g<9{tR-s$RT?0M2+JYcg%G^e{crdts)xA zuM`&BCAu&7k#}vS&kzRk#vnEY^ntm zi+a5iDxH&Q7-<{&AUW-9+k_6SAEo+SeOE6RZxk&UGEYgWeI_{@Z3g3LKd_sxef+3VBG+WD3X=RC6WR@>ynaN)mCnyLU8bfCZ0?u`55~cojJfN zRLc)?E{4*y@6YL#wUy9J(`CAMFcFJZZ`y1R`zNW z$c-V*o&Wm&6nT=xRHms-#OMTAs@vWyR>cs0TDKi>Yws`G#v#X`>f`z_xnbO~7n=3M z^58fvULrHR)9K6c@~Gn7tiHXC`UgO+^&#YRRzdr!IK&tjq-(^U5p@kxmVjcIl?z2z zRF0t%)&gx@eOn)%Aly`TTU~Of9jsVo-bxbq4)Ya&tt!pwlU0xlj*E|f93j9NGszks zQucBoP%ab~&ly3Yfzq;{A?I~CtM8;Bghlf;La`9n#zK~wH2uI5on$^Y;Sdl|^1f_N zvl39g3AJuEt`p9l0(%vcHX}NlrOHhG3w(o@f!DrDKQiADjXFT%S|nJMLOV%4&9$D+ z6VOjtOgvpe#FPRWUQRlZyRdXM=#(arvU7SFD4^S=AQUNcGT(<-?d1;AhivPPuo~ZMbbLCq7N?D z1>X?v#K*Q#eL(gPEgP>px#z-hR2AZqj3B1M8*MV|*t z?s%q<^{&Z{<*)$$(goEvXQ|y3nQ*~pxto)@$C(2WOTiT^#-(&GIs(88Sc70KySQ+l zrfm=WEetlxm7Mpef{oR3~`(jj8d}tAp)%M7~2TG-`)R%Z2 z&2#gv8o%32K?(4U`ngDZgqsGAq6E^YjSM!91 z{i~74LQaS7ToJSE9&LjZxh0YbhxWuOs7lmtrFoiy+*%|~p7f|TG^&oB(w!oNX$`~GH84#2}EN)4&aCRnh~`-_F-KaovQ%WT9wR0Xrs{Y5Y@Bo z?QUhVcek5otXFrkxZGgTGwM*oPs}i{s1zf{kp>(q$r>Y*6;-6^lJlaI{K@6QT-ys! z^R&Cv0my&oVhgg}_>-PRTcLCwK9lQrJ$~K^s|WbaQdV^D?yT>$j0oQd>lC0ldEXEt zL7QWkGCLX+3=k*7Dz`Dj9`_%x1}IE6(NL5+I#U1la{N6xMiokHLNnekg+#$vOpU*N zzFvVWp1kr{-&y^FV+{l!D336)D?!ru0Ep+10_?%_0BDi-lLyo|t^eO;X215I(@3~5 z*ZkSP=eU>yWYFTo@PR`esE6nj7480Y&DUjDtiSXpOZeGFh=DlA%ltXdIN5xyBS-Ht^nsH#{cmOm|AC*^NpabGmhf(|0&?7_y=F+f*_mE?n(!P6RP>4 zlf}ZoSJ3mN&;YLgfIV}kWb&nYIdAfEaQd7WwY?FKW|ul17NeQ;vX=G_WJg|wh{qWt zSKCvIaf_OX3Z_C+1w(Q^K9xgx}GW*-nPw6I`a>f&jmaEjX6J*b4nKQ?oBk4 z4nH!iTeRrc=Ja02bxSG(5}>EkNcZU)JUAT3)DvKGdIY@s^dB5agSK(3X@oUP`Bv9v z%*4UzK<_kAh+l`kg~!~W{Y#Mc@sDU>gZ#q0rV@EZF5G|wGU|6}rtUAb6RLSYb9j_J zH{z7?U~f>7DXO709mttKRTXOA`x9VX$@oP%{mTt^-lz!DQ}yEoJs}*Mi1o#Sjyuz9 z8yTQ5ehgqcmr>6}FnwDteiaC0Zu030(0x z3d?;(1@RfdO*P2Pc`5GDD31iW!g6@h;CR#_oB6XR9K%2n)O;i5mAvnsQh2J0UNjz{ zq7g?8t7IZrK`W6APUT~4%~~YybksvBd(TvG_cMnLl25>i7|~|Nc7R+3KC};^PV;@T zY6?Kh?<#`2)Ll`>KY0*E+ffD9{r@gqaX{DpZZ`|tSk&wdGrpl^5ha!8?GYt_Msv;k zsgpeK?r<^UMY4QxeK!vu_^iX`7)WG&8`?L2?|C$YdWTlAxEl5O1Qa60*ynwRfp<`k ztHFM`+nRLxZn?UXbY#vMKv)`}MC3yvd?3>Hd5`uJ_2(Z-J#;cW47VZdC#pVs;pgt% z_QoD0YFC!tsmdQlZgf}VjF+7ZZKF86F5o+y8%PgsiT3-e-lWD(&iG@*-%5S?@=SF6JWJ^Z6({mO+hZ$j1zwSDoWRO z3G(Tk9!HKhhO*NeV*`$0+`6Q-7Xw}z6}RCPWnc7o7ZUgAd0A8AO@v|m7B0eNuo48F z-;3Z9<~74L!;A25z*7dpk7tHu6?2eM&zaF42MPFBWG}yeU=g+u%SN7^v#2mq9)|39 z)Amd0Ki_aL@dZlJYfACIY?dFsPCs=lfBkJKlou^o^bR4Q%_9J`Igr~6?n^_UeXRDE zvh32ml%wA+bs+>?BwwK5NXanH&-V}0UN-5@Rag%o@h{;!ut?M13(>;*%6_`WHaUm) zLRd8d1vKC5cKPi4a})4m@94N$~Jbzd5rTA z&H8Xj{gep|*M@*?idQp?GqY6Y1-hJ7Q<@48Ec(aph@mMhMkS`zm2u5aJD6v#A%a4I zi1ta5);d+o0zbv#c6YI2=%Q~jrZHmC`cXO!W63~BWiR<+Nuk5x7HIZX6*`%22XYSz z*@T;LYd0uX6~zU@pj*oc#Ct^F)%N+-$uw*9re;pebXvd!=da!8D|)Y$sM6w{|KT(Nw|Tpb#AHdaO*PY+@^ zGpdW_2gjri5Y^qsg;(4I^$1m5UDD9dkR^N26lx!&ivDu+X}n*JtACU9n)U3b`0kGo>JXV+G!Gq2vP+lJKm_K`TvK!uCey*zTC~ z4w`W#`$Q|qiQR#C!^-^4(1OQW3AhhD#Z)s#)}~WK{+eEuUhGCju|AZ;6E|p0Um*1Y zYq#A{MMQ^BG-q@pe;8Gymb>;T5Nma5!4dJ-;r#=o6Eh*xjKhA?DnYgbv$y>xu#!fK(Lc-Cvu;2pa-`U6J=nUP_@;RNB+1o*vjA;=wFC zxnu)QGH7TKzHo{hITv8Mlyla?M@_mBz|PyaCf&;IS%dcn9Kz420Edo|Ys!_o#|(!f z6=*YTEj+T5fznSd58BGww7f`{PgMxSLBh5SpE>ThTuFcVlGfbXrlbCSzz!fE=VgD_BkpLI-E5^a`}<#3qFeTJ>cP=U;zXqK9t-dF zGvHHshWk7#9iwJ5TW21LB_SVXKg@B4yT>t%S;6vQ_}7R?IkS8n)wtV1sM7cuW2?L}jOa|=L82-92=n8d#c9c5|yamE1 zNu!m|zJISTZ;$BVB=cCL2WHsuT`R`NBLMdInr-hE;pq*$`j&?GE+huy2xOI-F+Pgj z*2Apfc*A&0S8|dg#BH7?+@Y(aPi6l*+OkR-8UUQ2 zAVsy{mXl|V0UM1I!6Y?ty(w`S6ROu7wpN>c9q8zMYQoxZ+E|N~%wz0Ipta?-mn;z} zy@=|zFMUdLiHAM`bGWZi>YSWyGNUyG!VkcI(12M?({B6>0(&8E zxxHj2pD}WEdS7Xhc9fg>Q{sW+9aEP;XbRFW$UTyT#wwZ#*z$B-R6rj|Q zq*2a==r3x1!R9!W$f7ZZwKmwbb1mi~?HLkdY8U*Fv z3Rv0ySgzH9DRFbv({^aRI-Ft3wC~0B{*}sn>>VlDp+ye8K?* zuayeg^FdfT$E9J}#B_CWgcmR7{Zy+LE2|NP^MNHGGVf$l2VI)`X6P(PHbSy z;SvoXKf^RXYeknYm%GG?E_V)vNZso(x|8YPbyNfl^N5F`m^XmV921#eL6f6YcP?h9 z3XeqV@24vM0mQ)9x8Bs2{)Qf%N1!*9l06!21u@E^7-&5j8YwLdJbK^e%uqQKKtTo6I68svtUamxzqA| zHf`|G5$!9}!k_Fh;nzB?BLwAnw&s&0Jxs9J*-u6Ly1{7#Qhb$oqUhQ?87$#ZRYs54 zy=gh9R)EncRx$UXx0txi@D}FfUDO&K6uUlzadv*rAp*pZVlhHPa<1xJUQ!J_ub+3< zA2ymQ1}4nDG-X-|c62|li8bIPqAol^YpA-`E%q7Yhvk`@t?I)RC*ZR%{70-h>#(C9 zS%yENas7>;K~&h_H>tJUwVjj`lRg#VKF&}e1%N`V5dDbN>TOfYg)0wK4smpijR9%S zK0@#>=269cySfmdp-=asNWN@nEky+jgpzl?`O~Xnta-2;B%^apvU=yV0kB(j`4||} zBy}DbTqARy=unbrnPp6H+zP>S!Kv|4pkdTDPiVi$O5>oAr-aJD>4|O-R8@w*H4p~V z*Z@fnLC@-RBndGYT7oc+2oy=W&U0@;^CR?HILflqWf+w=ZG!wws~v1@i1__7p0|Eo z5DplwLux`Y5GT-?jm3jjrQZ14`t;H483l5|L?4)CzG^++g8IW(%6WlUjJ7jGv<`$O)OWmij7eQF|8P+~;I#yWX_=CRZq;2OAgwSYg1l zo@7jN)E`37mqKju>RW}q7hFn@o zLwF(gy`s&tdNLOxX>^9F^cZ#vxm=abx-+WzmF!DW)2QRcf(*R;5-Q8j~{& z1>fAh-4j;Ua0)U+_z<@-Di^_F!zO^gBJ3^7j|ikmf51Je2&Ua{04mfPFhHi%mr4(P zK^u5z(1i()g5qW(BJNiea2N`Y!Z3L@`YUw`Ly(t{E`W<}GHZb4eNEoGH;owWNr*D= zLCpp^I2UD@;uTiMaE1zn)_CK<74Z#msHr?4e+)PnmwXi>631Uvsf=Rr3AW%~hCyz8 z-+Uou#S|uyNCV+A$f0l^6*K>^c?*EeA@Q8O?owYuc2jKHL|q;+}*1AE2^Fk~~fF{=_s(SPbK zxi1t@y(>#BWwO`FP__cy5`{c!w)}(N-t`qy_0sejd)-o0^f+(9-DzJz{s@lS>U|72>G_cBsfK_U(E8$<1K3k z{_oSQo_IYExb76|pE2VlR>-5&oLID&xsoGkcH7l?HI6z!`A+S+9do^a-dmR(G>un5 z7nIUDGmS=z`EP~lR#vso{aFVI$qt`3#>DtawLCQ3vi)zU zxLUOwzmH1*LZ9>0I49PSQi$mkri}fZb!*v7X=C)^gJYUXy*fT#m)K=pVJ=jsrYhxC zvf+T@*~nk#L}s7x1RIZmvD35Pm_FB21^2yS$DCG9HsoDQN*>z=PvqD7c4ze?S#$9X z#JNN7_@04X44*3HkIE!X9-W84|QibuAZ_T z)Fw@wm8qs59L(bMU;owM_NH>=K>!B?^eO#6gvZbM|M{eP-vA>4jQ&r98~y+GDV!Zm z{@bRw)VBGL0{Pm~>pKI<23=IrU3dObAcJ!CrV@#?Ph8rlq5{&5Qz7WQ366UTGFGv@#CocPbzJpT*et0yG#Wn<`V{x>bLC=Fc7*cB4cL;A zmh4TSPh}ULyv+2f+{)`bC(np@Hs^DAOLS!ASSwU63~lXjpU6TT-(E(e0AN#NcfIKL z?6MK{<|cu-Tw9dEKnxi~2}{MmSHG4#F9a&+`D>y%`=;kWZ9|(anysptZaHrr&ADiv za(%OQQAnxPf>zlQki0x+@BoUKH7c)jC7S|_Z(-LhaHD7#@Wr(K5c;GL?SOG^+sF!< z`G)V&dbZ@7R}W7pA`rxy1b`Yv&?=h~c+CE*;_``Q0PJHbtPdvqNk*(0Qdt$)T0DX= z_T8uLra&SjBkSS4%RxS$Fn#Osu~fKUs0Y-8=Zcs-T8Qk11;&cWvg;J$HCpdUQMWV2ODFCIcTia!YIoAqhp`!ncs-oVrt?^P91>{gN z(djF1jeamR90|pC3F*n+XX4CNmB?P(a(($pN_s*>UnDsJP-jLE|8<}Zu!)0@s z(pGp>1L!MR2(48@`%so%f%uhGv;0g*K;1m@=m<3+XQ5|zPvcuj!Hut%;B8S_Jp^W1 zK=Xi8Kt+6%&9Qk<5J}15=93#ZNk3#5`OL#0=5Lco(J8sp0Bw3^IbJ7>zINvVi)}+v z8I7}*e>6r@?f+#=@xGz>8)Jil&L^8~_)dQK!lA&-V+EgQ-KAZZ=f*xJoo^}jAT$J} zUMCQ9p})P`HToGLWiq1wWIp+Q!C`jwdS5Nv(|52 zTwHc-_&zUa0nR6u?7R!u%Jcu+WOGI zAm*t^-u_HQ5Ida%Noqm<-pqj2@|o&A%L}lO_zqc9+&<%QUftem2=94EKT69N#?xOo zd%Prie6;q^r*)Umnx&w&)McZ<+w1`oCk^r5`f~Kc2VB@ob%5~?I78hBSSH|O6p`x{ zLNYutt^iYA8_jUz3EO0oG`X(}IngavC0549Be(nEldL;QLUxPsPLfjDL-_B>L`oUB z>DML>C)8&Q`TR-~r1$gLte8rgjtX>ll$9!2WBN$U=?SP#?~XW%_6S$tWeJuqUnjt({}rx>?_0F0NS`-O9U^%l$HLK|X58-$SJaPrPl zr~Qo%X2zxPzRdG#l_yTQgO84u&SFkemTg&E8ET`JGYb=mhKCw?ypQXCPz@Oy;g4nL z)`X0Pw?4z*Kl+4v`Mh>?bQ(pW!JARyNPE^`JQ{uab(4joU)c{c!V+!Nw9-=c;y2mRG*NV#C9k*(ESsYe~jTciu1&|A@Y|s&)-Y@bPG>sY**BYxhr24oM zxhkKRCgZGx$z=s~eeM84+g^lCKqqi@xuc%p9D1Rmw~kPc1Sj+yf`&E|X^^1-M5^F- za0wmjp7Kn0olSjD*Hr>|TB&Xp|~>B4#WG*o!8)dUa|0hQBMf9jCbfhd z=UO_D_gHNl>$5O?#Pwu(w&6Ux+R916n*#vCWgcHT|7yuUej#DNQ9SAxP}idzivN^z}WrJW?7PrhF|lwZOur#xvQHkFUhTX2w?#B7DTgRkL2_FCG7}#uKl8Z z743zxiTMw9_@?HOog7KL3*Ehu0=4_5K{@0dWM@r<0Flw%GcK za2|sXIkS+KfoOdj!0$w{Rn9R-u;ywC&j+fJg^p@+yxB#XEKWe}*njYm;4wZm!6#l+ z&nG&?qvhS?j@a7~tifaHRNH5=8#dPqse2-MZ=l~PZMXO_#!w8CEO!`AF&Dv@k6_fB zFYeWw@cvcc=-z*__TcB6|5m`XK)HK{IX(V!d#P^HW4)I7#Q5kz-!vXS8mt`UljQeN zZVRX9t=@m!Yxg`Vf+J`kpbPQ;@erBn!1#X;rz*ObIC?0VIQ`^5|2y%i?PIsWhVmch zTG@XZ*l?_FA(gC-fJ3g`RAP@-?OC5PA|T}?>@RH_a`xg(%JtV~{9@%{OJ@}hdg0&S z32r=FcmOvZN#2*;vL9l24+r`6MT4^A?bppik$6V`gW%nhc?V{fiTFEMqRbO`fZx~?+2vxLovw-Fm(muHh`zu)Rs(uWY} zytgPe|7DZzy=#byBEu&BC$c##>0 zeEm~Jt~e?3-u2o11!01${Ze&*o+R2JjV|vaXt~eO3Uf}W@-O;@HBw??lQpx*%c0&y zp9+N6Ltv!JrnNS1)0tAgt4`UjyC2#c-^UPmeXPbQ=geBIy+2WBnLL4Qu7zGxLi)EH7oy!*s*{f5TrDY5oUXXDjc_Y zy%`uEaYj7<0sY4fQu%AX@SKi}w*MGts?T|>CI4M3yo@@S?IQYI(r2sax{cEI+IalF znGnfrIy7K8H|91}_hkKv;Yr!GWu_h=NIp_oM=5pG;bW?C!o0#ltj|gBY&1^}!0a@* zxMXSm)m_+=`IGb9Zh21-n9axiJUg6Np6EgdF~{5xTX`N!-!t~!v^8`>$&e3FpY1hh z>tPh$iye4gH&Pt)g}`rkp~qoj^V9PFiJ1uulb2}Y%f9{C3c`pd`QwzzV?#`*v2 zYLxu`UH6W0(D}Y$@XU0oii3%XI8y2W$A=*|eahOZSziv~$y*c;eF@!)C~7=MZ1NFY zS_H7f;T<7o9wGe4KMQ|R^P2pi5#WW=ENa3$ok;7TOYSsSsP0Ez5tR8BZv8W4Y7`G+ zpCeb0N0i9tN?aNGjA;1RiY68 z{xe$|V*T9U9(kJBP^O`2_ZWn8-lWwUnGpbq)O{5Q!E&g$-X5V#ESde*UBc6Mt}23m zPvO#wEPD@6=R~@^Nbd=c7ozL{18fNc3l{j3(E=w%A1MHZ!-RXnlmv=*XL*7`FfPox zu>q4K{YNUV9i;Lo>E0=fZWHj8vP;`|nL12@xa~LGkAs4TmcKk&!ZI3(A)3N3&;w8m zG5jzm4;~Zn<8kn~+US4$8=xDoibMRiHEnfvOjm+6je)N%IO}|@s?_w;zV%9>Q9oR< z^wYj&__d;E0DXqz?){>!3#^!ZWQ^_AgaGjYp#|TnPf=Yb8}%<+?c8PmQJy|JR;yC- zaGU}1?H8LBnWzoRFWgh2ChGhJU2MP%$Z_INo_}O)NFP;7m@Ei+Rbqs1pfV$$*U2h( zkeusp6bxC*5Z@SjHcSDNu5i7d@bAdj8tmVR;8Uq3C^5fn`z$>RX`CiOW$>Sh!M5*^ zwHfnEV-d{Qy0{>PjRU;Ry*DYgWzcqK`ljRX1U3;vtx?6Q(CrfK2rn+PKpX+frPW^E zzZS#t(->^y!SPu4%K#+}J<79~!V@Mio8%;CBUSyFa2c@7FoJmUchlq(>y~1egaaTy zc6p0dlaiGMK~W#O)!dwl&*A=tGv$DmsoYiXExL7YS~EtQ(%3qp<;| z5o46g&mB@jOppT}B1R0gzOn<_9sb>*+>ctMs>TefxG3sdqc%#LJhLiTtkz+Dm?C{$ z;voX##2oF`qfCu?#CVPi%8lsawcFbCmLhr9dtOrQ5V>LQkq~!RgbUCv1d_F2GW0N> zxWc8;OPT?TU4d-`Z$@Ej(6J_#{)wk4uW(L)Bb zqm(>3Cl8}ikV@1MMCZ*=_vfCJpJSJ)iT*q|0$fKDq}1pn7QlU{E^MN~9!twv6#B{C zIwX$1uUqILskOIirGB6Qg-(mMicsTo*GxS_Xx-5!AGKqrN;?c?bWns`jN;RR+E;W{ zht8*|WXdx7khkjXVwVXV?Ts>RiuRUrLpXV=+L$~dA0GKP7hkb(2nCA_5Phw`Klxr4 z%Y55i+_ft_1K{>*6*A?6+{HsG-ol7Ost*Gmf6#ik7>geNttR%#p+tc&>5c*{Y_oc_6ggJIZJem5pJ0dqnEo0Ywx8|fGljj( zj=HaHxs^f{Nlm_d|Z*vy}U4`tHc*9io_#S5yw+c<66l+1N5>O~3j#YrG-Y;xIO{b`N zEg==TdY0mDB|#ZhzL0y6(ss=~T`4C2*&ZH##3n2(Vb6&b_({(`dCmXDLtq2VEBzJST{+ zBnGs^twozH2N5iZEM;HejqXnbW(snkhCSE&XBJXZ@sVqR621_nMN=o47@f8|<}VCb zdikFBeM*d%s(Ows&E|pjpZf;G7W;*06Uj76B1a-d>%<15cb#u@c;Rcv!o$H%WI@&b zcfjb5MpjW&=9}1rW*n7#NkM!`aq&AE_8%v99X7wEO#x2ng;6Bbm(uREY{h3o`p$CJ zmZv%hoz9lTz^sn2x{fwXJB6q_n64xwS8z8*Uuje=d(cfApdf^32xv5s5mz7~HD(6#>kME%pw%r{^ z4M7T2J*592-sG7Zi^rVr{v(!Mdaa6?Ct!l8u|)k0)K>duUjn?IAf$DFVQ_ zWtGwn*B9m+f4P+(3C4wHsDj@`&23k55Ti`KTgN6l^1AI%`lr=4dnW)5ZTL1y%{x80 zNPV{IHeW+1QNzd59)%6afAvH!rq1%zn`7!KCdrCOo8xP+cmowc@^yuqLr;-Jq6Y=U znr1?kP<|oT?c_DL84Em&_J`XO5(79gY>Bmm?nev$DbTSY!H#^R5szVSZmZBD?!gxn zdrSs&uuQ;SoP`*A_keiS_4_(oyUEKDwD;z0zG`de{c*E!0g~t7RqAtH8%Q_}P+@CR zh~KiUyMkSL<(8+G9*=&RKHMp-w|CKSpSrtw{*6N4zTeU*)p_@Iai-NEcm&XW)oN@r z^^j)3BOoiy|2XNN8f6kKxFim@3^sD`aMxB*&nZzi)bws}G)U*6NlMMTAsRoBc2HQM zpdqT&4pWEiNZD7bOHqW@2B4`QikAPreIP4Nl46fdOB3^dx|jA)+&xh3=DB9%lr|n} z4P_Kon&}Aqb)~f`^H`IytOW2ak8ziuqOsjL7~YQ&A9fZC(T^#=-Y=}x{=ghy9e8KO zAEFTb=K_~RGtCnfJpVTBi1G zc63mE0tEJ|Z*u|B4XOi8Jktb$MU5wq<6FS!iD%znyZPO0NSyE(-yDD&A{4Yg?$)KU z@~Qhg&x8LGO+WN_T3l0_+Ff5KPw!Lw=V#&VdU$-8Us;gWd-%Bon3mSlXnvgWzLuW& zemGlMsMJIFJXaDD*PSS8PfZ2&R;-sojvD8h1|9k9m4VlDSrMa|h+O7;steLL%8ql+w9_!d$B5QkneYh(S zuWH}_XjyW~YS>N3=cvU2yc>^Nkb+1qUuzkY& zXqdYAba{O-JTfq#gDh@*GBXy-LOdlr|MFGl;_iII%Siwy*--Zl_^YcwPD(baoBhd$ zaJ8XEA43{x?9-aX7}@&v*GBS*5N%{+@R15brWt_WT@DE4850PpV%Go2aZt(}o+GU$ z;dhCJgtAc}Z7Ok=hfWBz;jdsYPeQe$5FsFJ> zLQ%*d@Cs-gBT$>Ije&oz(%1X8?5`OyVwIkc&v1Nsb2)#U^O9z(;;qC9Igl#UB6!Mx zvITh|Moti;n~28SQHNC&6LLHox1OXG5MGNMNE;wlyR$we!l$3lKUkAmgISAC_&fx>Psb8&`7Z+q!!V#k?q=UpZnF}RYKbsg)e-1pY=7vQA8hnMcRJdkj5ZJ zAIuV$w8AQ>T(aqrj7}p-e1h)?eDS4G;*gz0?m#31^tCD04AUvRaP1XLJIf4h@yR=Z z`%MUq#|8LxL_!0iju&~2YR}&NexDigWh-?zGKy(rTY)ZH1DhiGi2dUZtD})%$JXo} zt8OUS&aaP0I$wUba#XR@z?^~p z=97vPkQ>~36D4Ag_a@k_r~zkWsn87N#n zSUx}kcqzb+12di}k;joS=uBQ{A1}cirLl#!8sx&=gb!j1T!L12)w~Q-^RKmJWT&Sp z=_^{4R%Jd0e~5$uqdsA5XZw@U?x*62Rsb+NU^wnwJ!Nr&P7U=+2T_(#($gef#b$&U z@FmH1QD@1H3C&-B^PH;>`^G-&{%zm_DT1)x(023x5cW>NfrV|?W^CKGZ9AQ$V|DC~ zZS2^#osMnWNyoPBq{B{6-tYTos^+b!nv-4o*=PIgS!><*x~y*)J)rcEz{Z&btmCwx z->a8fW9)kYTi;b*JoPJt$sB_|ZF*L#1J6S`_;PjDoLH6m=*>7IdBN;bt{`n1g%~D_ zU6~Wo!B!yCjKTRi9R@!}!z=`|ahO#SD+aECrAOS+UzLzL{W~6GmgMwG3%+7bU%=Mm z2)Z|(gcbt5WUo*wko!;pvxD@;%vEya zzDpBX5Znj2Sx1sC;&DhvPp|;2Y-r=V=A6t_tO8tr zc@9u2_JoJzTCgGq3J%Mqf0!cqa7Nv*4h^i1ReVR?nAA3-9o`1G>}b|Nk9OH@FN!Lx z)OOLVA(}yJi7y0`Z&w@@!H^U6aOhajiCu9Y=8`p1@F&eziaes>GqT~#?7s(MPFlZj zRRI2y2$*V$uBN=ZA1QPlMi=Tweav-JclvtOS=K_17Jr+Jk@_Fz~w_~3B?PA=1i z8aNkzqhAYrOLH+}Q0R1yeo(e{D5*IAoVq-%0-CF;)eb9D{L1kZQ6h83J^xj8FaxrD zNgt0@ac6pN(BMwXgl@9ldgMXA90wY-p~$RW+BxTCDGq1cNi^=D?a^_x9Ep5rT9y(E zE*hf+0rncdkev|%#uK2FBiQ3C4>%cRe|a8}X6)1V3yq?Ke}J0(MHkJLQf5%cq|GLs zD%$ps)fDsQvf%7HsjL2tjN4MJ1~Z-NNnDL91F{(^alNuR16(!GouzoGWKgd#puXbXhvx+ODRm#1!AG+jb}KBBOjkZ_ItKI9jwi;p>+1g=@opqD$T99bs}rsdjR;MkGMYF0QQ>U z+Ohv?O|#7Q{oJ)u737d1zs1_43a-sQ0|P}bYEI)VKnt<#lXaC`(Sp%Mq|lIH*NS;| zHH%=}X}A zCc{IKXwEuN@B&)XDYXbhQRYB*9?>cPaG!qMa?lKc~<+l=;K5OxUy^q zsuP0qrn6*E&=dw;F^qRm-=nzs5n^Te;kl*3=55zrU>jfmaYqQPfCOI$ue;;S!fq*w z#+@VUsHJ6X99T1}FMeS&&zQlQX`Nu!sw`_j5^(D=0%8Ss?LW;21Cn=%Yf0-yc!K>r1_$pId( z49l889FEfDH=Iq3rvT(FL#%i)tbzo}`EO?Qn?E)TV8Cg|z%EjbNW#$cH2F`g!IDou zTG9?_i7Kfz4+Ip7!_fLZS(qhr#H{i9$RT$n|2okFmj)V>a@qX}F43A^{|k(ikMi#i zQyot9|K^+fmxatH78d8~PHR|vIIl`vs_FEE$%(44YX2SF-qzkv;vTtJZQeuW;f@sy zu)C^X{sP>J^koH8aKs!f|MYFPL)5=k4dI5$l)r|+h3j*%yc%H{PfxL=FdEzT*^tSB=qZth!X4?l#N{Ocs7l zlr}zK|0l@ED~gwQ`ht%Vzl4(1@eFH@O#);@<9YF64MHOrAJO zJC2!*QCi}(qtdbLIp43&0tltROW)^kClY|u7bBYg-03Uqb3VRGHnFnw7eL9E=r9cN z_ZJM68nyfxL!-TZ?J+YLqNYrdf0bASZ7VUm$ePXgS>O2i{`JZV20cTfKGehm;{UFg zK5xzSUla|x7q6Wq{@v>4_VPzfN+$7E|8o+&vsfjCBZD<&<<4b}<@lsCop`B17aJGB zUz}jr@TdH}=MBpu^9i& zG~0;%WVW@cwBr0ZeQwB#hG{o6$|eW7wp4r&!qLr@5q9wLL^u+Ux^b}VRdE$DApif>b{b9 z|A?`K_`2aEQ<3|GQ+Iq$XpO?|byhzr?*1m!(83rd-?8OII-mRMq^a6td4woW=w;}! zChXp*eJ#G4~P~E73tAZ9GPn{x*FZKk(@fS>^r{lTlOGb&N(%%mNkl@&Fpxb={GmNrX<}^ zSj+_s&Xh$lu#O&b1O>$qEf$cPYCd`wKxZljp>P{hGM(gObo(KZwB55Yo9tuwL6s)bm(Isz-W8LfXFU@qC_mYw!g$IoYEF z{J>2ZFO|;#MX;j@nUe6c;?zj(UB4&sb0dCE+(*%fAP7yc(8WjG9(9JIjEzx=)v~4u z`l)ipW!i=^wcV&YLNN%Na~>a#Rlz##x_=XHg9(F#=?X={b$RS zY7@Z7aHQH9wq#Z%ki36mAZNjj-8sTuh?=fA{Z;`+5Mop)@v}0?GQ=ws{&3=0stww1 z_F0`3-N4oVVF^MnWZ}DxW>8%mIIcbXo`V$71373ttxwzQFN%Pv+hsh(o2BQGf_9v8 zch^&Y{sVEsxN177McvO#Jf8p08A3oE^zZAeZ=|!Pm_k*{tT5oIj|&-+T$A4}`C3ud z+t|I9=Rh~VF8CFQj8HNsXY;)$^b2EYkV&XNg5xoQ%?d>;w}Xx6S%$65zR`4_O!Wc) zMh;`ip{r1%#17UkPb6OUXKZtAE>uO%okaoTbIOHuIk4lTs1OK}>v+Y`%<6}IHJb0C z4buyY<&K`~XYmgU*RAs%-rVwqZa-KC41(~P=DKz{)-&4XYX zZ2g2yQMZt=Z%l-!mTts&-wpPvYCKiI0%Kk-D7uS@4mw^;-Kf4aT=voP(3oQxK#K4@ zB-2NBgy72OQtJw%14niwl3ztp%eU!Z7~fNLLBvKKfjvN%rs@77HGy&1)u{V0~k_9V)`wr>)!1AcL6TwW#A` zS?Hm@ys%A?4IZaNwNk}_BULv6$m`AwMNDO;e!j>=%(g4;XGTMwq$)ZznT?qqJRSH; zO3PND;6L_sx8^Ox2L2>HiBL#yVwyMvgTWN@=^%@7gAWYSNOKX=)64Pu5L^+Hgt|aT zl;ETcIM_cvz9k_JK}D|*JQ41Dz-T)1$VbJ0(lW)wo*R18nSk4=Lke^Os!89$J$*}0aBd3PVe7ZmFs zWV0^lv)@*E5eVZkhL88@q9Px%AUb|<6@y5$ksfp1@?qD}^{|a!MUaQlXedyBYoRRn|G`)-TXA(vJNKQwC`*gfzQ^@1QA9&)t9!!LDCb1Oy*BFpz;JYGebJ2#-9WaqBab}bI%?fsnYY6 zvj@Jv$(j>A`s`=fS8fuSTo%q9k?#w6Jj{wd zB&H#fIFO?cxL)34xo%V*K|x+Ig4?i9CUpQSufq@c2ePlFagrU5dSr)@x zI_Ru(J+BSnlr2SM=PuE$8N_b+N5ml7)`FDmquJsQL_pVRKsc7nz=xr~Z9w0h4o18# zL_C;3Kkhq`hoRq{;L&F*oX*H2_zf>Mc(+dqZR<FDU@x5|3fhE znt0THnSWK@TFq|7(~9OXRyQwpniGtP1wKRfX=EM1P+N~tNmQN;(jWMgsTv5`==*`& zuj0%JY&3?rW!fDH1f+~~iVpv{i+A?5y0c_|P==F=iGE`H7eYkZh2MEZKoM%R^Q1(Oc5~Hca0>}3_Gtu=eT6bN2$0$8=%7XZ@WPDMuvWk?s%eE%s zs+ty}5wP?uw#}G4Me=ew+OjNxW0PEg8Hh zFWRhqlgB>;&uji~rE?;_=i6Pb+FsE6sF}J_+(`m`PPd*egYY&KFq&BFs^R&ZcYiOG z6b{FK8Avo5o*N2FiQwo%qEE$73f=txa`hPBKRS1vuZL%P7ixQF*0=25>HhV<44mwA zD@{14d3bAR3SNU%7u*fG|KwasvuY^+;;{--AKTT#s&%Z@bhxa*tG&l)=BL ztftU^X_HONX_mdCX6p^6B{T(*59NgrBWFAFs4)6VquOnGIh^bM@A&(Vt3Q7< zdIe_*-L)?Cm!v*d`Kq*I4_LQu5vyPK2bq`XEE_kNUB+aZ;b65wwHArEILu8VP>Vtt zUicd`+UNHj>RDXb1#9nJ^Lzc5OuSdv zF`hi;GeGKmk7^OcfR7o4Nl*a8)@`>-KCecYu! zk9Tfo2;w7;9%+e%E(7e=p*lMW)BycVeavtcY>}ngE&uLK(io`nWq0GHJ9{xb9CpGw zl<2#t^V30dX@0nfo!;QZ#5w{+EsGi=_Ngr4C~KEXr1+7;}|qp;?-Bd z28hnx8S2bD0CuzQ|W%V>&KZ>nM z=HjilgErR^r;vS6uwr}V8Spa)DqB9t0;PTX1menCM-zIr=cqx%(0Yufbr4zo|Z;W!w0;4;VbTR3i<$=pd zu0s7YS}8vaDHFuKzXQ7f)F7S+w2|08olC^^_f$y`7aR;C)6B^k4i1qCijXV<3#8k{|E&HRi(s{?B%ocZu(gwtmVp zf^Vy^h!(rG8dSj62~4>uE8($!3V;G)RtUFY-($B^IWPg$zZ3IA_BVsCteE$sQ zhaIL$-LSxSEI<_U6Z{jZ6)I}k>e!>rJ)hnCU&^-o2xlWyH!m*2Q@v$Tmh%vATa+`4 zX^+h|f3E9U9U?j^>%HyGJ8Jtv2=jcXCzLSMWhgKO6+20{&D0KVescmv!u7t$^81$( zzAFu12fwMPlq7$5SG@j(1rBQ{J2v7j6Ry&v32st93BWs7c(d>sz7UHSHBXmmLf#MY zgwXKJpQ2{<4N2?(zeL8GPH6uRxDh?8V_6*_e+ z9el+_LkE#MH2j4ENxTvkzDOwhCvFvGI$oLr(CEE=D1(Q_u&(>7&iPe8I9V#Sd;Hv##q9Wpa=`*VX4ZSP8{e?? zQzUb~O?I9y4#CyIl^QFjfbTNkEAbCNhGSYm1BU6=W2Xna$cQ3G!wOuesl>uP5bO!} zM!K=ZaY+lOMRst>o-FttipHxXJrnE^U?4|1Pv2uJ%E5o11#VFAFQkQpZKt zbWgsMj&N7E_f-Gx>4y~z_EvWWeV}a>Cj36t{!t;u_Q7kNXAUh)_Yr{|7g&-sQ~fkf*( z%PZ*I67CH)Nl$Tl&Sqoj|(JulI7NByFAIxW#XzT%0<)Kc2KiNhvI9yxZ}%q?*^MjDHh?Z%y_;r`Nk z>`qAG;^{1?oD(LdTq72FKIcDv(Lm|@qU+C~wB-5^wwtJ6Kdn5nC6AGox z5-UInu}!>Z2uEkvhEb#;$hssmXXn>v7D$n0>_HCw50#GLTJ9empjHX|U{BUdMioLx zA;f_(l|+oS5B4p;%aDZ?9U%P~AJuqWI=R5RDumQ-8ODI#G%%;luAdZBTtG(*iy=lE zC-c!g3o2W!FGn+)x~nPTR7GNMW)P(=GmFfMIZSoao#3pqw!=GsIez#JK%ho8I&g61 z+9tz43xh*8CfDo|-d6$KRr;6-1_{#TWw?bXlZ|uAo-=-{ql0J{qB-zPt!^@_AOuSR1r zwy(fO>uiaExp>egj=6BMVF>p&kEj&qm55cZN<9OdaBX^+fy`w;W4{(6A~i>U%{2D zJ}Tm-C|!6|3r_(mN0C~*s*1<2R5$8HeHhH%3sZ4d{R0Fyy(}p~le7yr+m&563$`EfL28&hogmTXo6Xf|c2oza zLu3j@XcsX;AWhP26d4gCxFALf-QWx8>0+1RNGMyVu^@q^%IX$+cr|z5kt7qV8va1# zVHotg;`>PzN7B1dtM+&$gy6_EV;r@TJ?!{~@vE^Wk?~g{e8m^9;2RY1eRFr4bp|XY z6mn}LcJN=dtsS)#>4k`yaSR^kTvaqg8n>W2bOehH;pt;6iLoIVw^?r}&Mdbk3S-XW zV;l(PH;DkO5?iTF+G<-FeNdt32XUVjf<`VLd;KM+w#Li^%rsmE z%Gm_vx_Gi-FN$4EBg1~hAq&yXreFM|bp%wtMAQ*9XyXhU#YpN~5<%?PrfAEe z5G-`6w#QYPd@@%KB!l0plsjIEg0fzfvw5QLgz$##AM@ZO!M=G2eQ$+so;_7|+HAK$ z4}<38DeKOd>5^%T_?{4P@#yHu?;hd#o?j?o_+i;`iF`}XVhZbsDyIt(rIlb-Rwn}L zF9~Et&QCygK!Wk?^neR$a>2(t1a$KVYK*|EytxbzXNe8>B{@Pox)bbrMaCt+h_j%( zOP-Khyt@=~9HzTLIiW?YjmctYhZ0EXr7xcZ)LDno6NMv9sFI( zSr&ceBz|`U#c3Y$VXw_&aYSmcV@u4DOa)#O(b?EQ-*??Y28539hWL7810^)|iI|qAB;?fJMlWkyBJlW>DZNAJl}))lscu*&1dM^Q zUpQXbPI0cN0?@K-Vr|T-sUiYDjM?`(4>t3;d4F;58$l5xfHko18C|JJQ~W5HObNIW zk83amX+lJso*!hp@Vqb@HzgIEdd8m0`p_-5%_B+<=fK33HslYpBx2LdXC#;ML)fLb z8YTOlC@WGUQbttBME99*3-ffP8a5B0oE{v6Yz8?}8;Ol#&yabP?DHp{w8<*V$1*ks z-Q5=`B!rXB8Qkv{;5&1B?#)6Y$`-aWb;NnTKNc|1yt#yv0$s#<3B{a}`i^4}k&bG1Qi!MEx*cKZB4C+WJc|e8Qaq8hd^Dl<^$QlPCc?gqePl z$QQ?S=t{=odlbE;l<9B&{k39Ji3XTSJj(Tx;81STqv%ly8>j~xBJ%$zMNnKbY?Z>> z)9W_l)m#uQfcLH<28Ib}lvf8ep}ghn<2LtUo`fbMj$GCg6+`EaMC8%DoM6H9Finr^ zd(<#$K|P`ai_qA)y5H8PXF33g(~QQxj0_%G;W39q9J$!c#V)rnWM*=6;_F*;Tu0## z#^1!X{+CxZSIHl>m(n8DFWZ2!7bFv82xlWN%O1U5f>r>ly2W%AVg?XcRW*=V(P+MW z`?~|Z?~$&moX^^P+RewAMJI$+`9OBnN_+V{TeO6e{e<61&jxZ^EeGIibdys6Fk9+A zRO={OLWLAtUbdrCwBd7VAvKQ<4Ft&SyzhzJ?_}&la_4E?lscpxC9dxkW{9JIh{6TkyLj?Av2=0lww{Wt5X#=5gQ*5#4Op>p3)UL8=!s|~C%FvZs>;Ra!>34OB$VZMYWG{bB z#(PcrU0_P5byI+HJdAo zF}HHwJ?3WyZFlVukSJF<+c<>zTH6%?``%q?KejPjJkm(^QO}8}kIvmDDDN3#x#MUa z<9>HvfpTN;*PPAN9dDzDKMZWFPG}XtFuQEvIBGE154Qs^!_JdwnyEYdnj?5};Vq*P z^-T+q6x!P7p0s}7yt`gdq;Rpca}HK<9c8WQY7reU?Yjtt8ojEc`P)+98{&BxS)Drd*E~Fbw67RsF9t!a$Jc87)0q* zQKEGa9cghLtm$9jC3y+rJYGRm#PaNV?%#sBPy7KxSTVd@)=iwd=aABJ zLTi9H4MWF=zS}onLD(O zAG}rX=Z`AB11dNFT)l=)GZ>al!XT~?=?vh5^ZveZ7NE_5eh(u|W)Rne)5lz8?+koH zg8Nsp=`kwE)b998~&4TZ$A_1KxN^`6f+GxSeXYU)(x`daC9 z73@~KSQbj0nRat7#q`ev9rH#`UX2(Xe=F|Epx@j`i0N*LD88ZsUbJ%t?zW= zza?I_W7FCu`;@jByj_=yIsL(?_45+_(e|~14Hs_bkGl(ott#ztd84fOZk{_c62;W* zue`fKrqLEFQU)%ofeK>)AKfV0m4L1V1qbX##8CgTeWU74l8oL;{vldkN(-Qh!RGY+@3NQF|t z^K&wKc)R+y?HFF=W=LbdVG2Q6@%{pE?b)$Kf=EJyRLdO?kiaU_GxYntu|s*{UE73w zf_qA^bB9@aqIDyFF#$F^GZ#a)QmW2suYR28K6rUWBuBuXsUE>AZ17pqtH&-H)J26+VJ}#2@<6U^j+U z7tByWtenZppg{qOt`&tG|6N2s3CgqB-_^g}bpom^m6PyZuUaX_4M+?&GOSZkWGUuwSWs%S?cRm%-g8A{Z*%FVTnVu= z+wzFZcXW#3iTV-oR5&c0#S@nZV?I7)o!-)yvS?k$IU51L5Bv@ip@5Orn=>MmgmOhN zd$reJ{qE_LNWn`dp)GPvgKz!)S>4<>`j$KHshUTE?_eHp;K7`YQf4Tt#`dz5QD-b^ zUhJKKE$?EVQx`jtiv%I(tR#f9IqQe|90i+uZ20KPuYywo8`iiaNu>a}kX}J-z_K}$ zm*|@CbPCu8h6VqR+2nfb_}D8@7Dcc*%!|Wjz;#17)7N{fLm@8JbLA^c=FaEAr<9NQ zP?g2CO7|~alxFn*%Wi7K-L?E*yNSoKk2sj)zYVAV@|%GFm*He(oJ_V^YU8ju0V!yA z*l;;PCfP<6M!Q!;GFEsI(%WW3r%P=qQ(T)^`(-5Qz91ZfUN(!OIjy0O6uiJVzf*vv zgpC+1LV{ZTT*=>Vrdl!H4!rvjqqc!6m_y!P7WWZr!_q8};kh!f&>rhkH-#GhCBbbi z{B30$HyWx|l`I@cNOJ8B=T!V1M9352ew(!1^XBH@rwo5Mi*i7#4B#W;ke9e8ExOL+ ziQZbKZx0o+t3?j1jK0zI=xSnA{^aL^zgV&w;8Y_cPP!X%ff0=>s3Fg8e`aHVbDT5J ze?mxjW6ya-y;=DYkNrA+mqlDMV^lV-LsUdUQ`*yY&r(HK!#&l%u6r`15bo@&ljG}p zwST@@nF*h+`1%jGU^x3G4^ylhhK`;hkyW|+1c&`Y0@SMKMfg8McnnWi^=Dr_xYxD+ z9kci={{O`+|3kSJw02$}YuI_9H&3ZRtYI4n?IL_<@-sbf{yWBM+WNgjr5qG7zd2q@ zcJxv4IaI%xA|AQIqqcavQywKEKBIZ-K{<7sCJXN4Oa-;g@^^JlrsHX~Qq#-$do z$l+4Jo+lTZWdV-yV0XMT?+Yc>ZznuY`n6fZvCBVHaP6>T$kg){n10aSc#O<^$2(xZv-6 zI+i0Cso%2RXSdja8ORt6L^UZ873)(iTtNm4iuU1J<(6+G{lxCIx*zqK^(_jThEX%D z6c=@otP}<7tsUI2J|+%uy#4M63WGSFm}@be3MwEnB1n46{Ah8={0aMS4P3>!OGvUI zg9m)UjnU1Ww@k1xh!4a_2xh?#I8|J0WNheFJnz)`;r_v0AT&D#ftwzC7nJ#vw+6=> zb@rY54ghWZAC6Rv*T3R9k=OPDA<)kl0eX`6L*~J4*6p4(u1mdxt81hW+lgMr*XQ<+ zcd<`jT77`>vkME@9t-Q_KMw+Ht=zq$^Y4V)uK{a+SMl{I5$e()#sCg~1#U*8sK;l) zIjM@;(TyoUwwIG|WB%u}O1uu76MbR8|9OiN@7XzcM6irQe>jT5uEw?(#@~yrw{0Q} z%Z3-jH)wIM_r%WRCmoYF@SY!{R`75-haz=-m-qgImnRrzk$>Qu7qZUI%i%geK6B@T zv#peecsKS8*cC~iH=>eW)-he}kw0k*75+t`sH*Iaw+UF`PX1PKaq z#?JvGV%9wl*$t|o&NW`bEqI;*|AfBf{u5s* zAi4mhLD`5qs;rtlI!>_ahXO{~5TC^d$9?Kx4s8_NC&>|BSH=1}q4}YYZFBXqg-CwX z2svN#0Kl9=#1$z?3KabdCK{taue0t&oV-lf8o5puQ9>T35}eQ4!>~ffmZ{g zkRE`F&>z3egGj{rDj4Q39qm!{ z>BY9j>X)1xG`sN2Rq1V+)4VX)xJL0ovd*Q@USJ(-wWqL%)ov7(dr9F1KJkB%e1b*K z7|gSi>=*nWc$E-1Gr!x|cSe&eoEdkWYEAyy?Jkxc8^)W7FQI*CpI?;$2wDY|Z(uWt zV$IK~;!SOSYK|6R^^8&nU8o*f_NjnHy6m%jXs{QX+Fd2|NfaDaihZ-W!-b9#gZz%@ z2W3tBo<-bON7<#UUf2O?XZx_vRZWRI;U%NzWz>}n-1>%bP zOLC=)7#3mK#~s@C((>QF}0gpdsvKGB5lSbOaiQpyh>5W5;pKy5~F+5 z3@>!LIkoeDC$a&%54Wu+D4uv-_kPRe(@fT`_&YIDd<3!rl7)uqnZ3)!3PzFK$^yao zx9(nK+lg~3(JTQ|&i<_&9+yz6dg#e*&bTQh&-N0U<+&$atS5BPETT3kyj;UzC1-^m zzJU~PdYKGTSVcXkG zO&|Ml%M}otZvVi;V=HL-4XKHTMesI7#CcZ3Y1$%2^FuV~yUq4|ABOHh!!z{M_pcVy zA5_gKBH1?J#-ILT5J;6^V63R&jwrqykX^-|)1yLJtL9McF0hkGd<-$L5k~Fp5u6l_ zo`)tQ@c+Oa7ZZn*J8H0ss>~9A;8sTVMXZytqg1o6% zI;I{7{`~qnQH~8A(5d!O6{Tz^?#bC~4zOW9DdhnlLK@G!= zU2^A{D$`uxOayJ+Sdx4h)KyMfs$>2#<2c|2`NhosK^SWce$h3GfljjXJS!Rqr8Olm zNwhk3BD1H_-zmlO?U}#m%+9!HmAW9h%UT@aQd$-@1sKw>M#>3t$7vvjAOoGqtDwDu z2ATQxdiJ3{nYBn=I}2NRW_9vp6=9m;hUu>u?16byYxBl@6JbQ+5;9S?N% zA2F32!#*45W#_pF>k`eJ9eGt`xNWngsI(~{SH+Ht&PUR4^T1h>AR7$ij8)5)be3dV zt$m>JRdkO@uW>dZ!M-GXj08;SXffMacj|bP*hDCR>kVj#6lxPiP?05U=V_tGoE*)0 z#QZF771IzqNT@1Jo~JxUA2+fF(*j1K?J~FCbr^YnAC@;&K6NgtvI8p zeuKEXAL?)$-jNGm?3Tzy3T)|S7J=r`u%UIZr!lXt3f%|BOEYbPXL$%+H!dh?p|A>n zk>Mo#H|IfS8WAt|7Q^~JmXV}46k*uI+DHBkS1g<3a>iv_f?P`GHEz0PEjuPjkc@nD z6ppcg9eLQY>Y*^S8Q(jd1mA<_D=(lPy{0jrZ*kSPKWcb9vLfRB2^@sZzNI6cF2c^7 zZPjnSp0EB>H=Xg*3IxwSP4yQWdHhWjBv8S~g$7cmd)`A=&Vnz$wPTz27YZIuAcwr> zkB#2?HW-alks;%+%L^cKbN$+Qf-1LKUVDR4a*f*>-%~(l8{Y8G&vr1}r|ci_AKo4t zL#?mn*&-p_rOQxj4*ZGas zP8%sR!mw(7u!wNC@#Wh!GLfvIgHE9X#>nAw@3W`O^4wd*DAUfqaA36ef8o#;k5cc$pCQ;B(icajPevT(O&vJ z^oT_?8jH-!{U7!pSUN5-;O3CqFh!@xnLRSq9))rJ&kC z;(7jX>RiA`SU}a!^JFn8>V=Q;B3}$EgvGPMYJi3>qL-&IzrTsc;F)@da=6GO~ZZnvI?wF&&(#CRUyyz3Fezrp}XW6aO1kOmiRzgnbG5r!5RD!g( z@;wG6L}7b0bj$2k2t`gOI$wYl&Hy0{sfUEdIOfPT7GpCN_zOL_?x9MWM`^Yoi9eKB zCF0!-gAZsAlp#NUb@(Swv;7T+;u64nq4BZ8L@BE+N#j1tI^p^A8u)c=`>^a!N&mfJXKfD#pu1Zv3CRL2{QmCE`y08EPNsF zZO-+5)^4nETw+mllqy(v6Q4gP$&gO(F*n`eJODm+K)_ARQ!o+>)L^iG|6!F6{kG4P z{I;;#nxUDfhYH1E>-@yXv&xBr8Pfw1E$L{6JKQDC1i7uXgJR$s!yn46#x|oR4sR4u zE&Azg-PhFx=uagQ4J`+p-vd<6-77|$CNLc`Lb%R=-N z7^Yc2p@YV*!tbu|`F%zdEM)Ye0)d$!6(CW7GIeIQp*%lvF=6u0H|S^d?}JjeoM$V^ z!gHvn%8~)%1k(+?1&FeXMxr_7IFPUabVZdLz zup$%vZWKzMcUfL!ZnibAAE3xLbbVyXQ;I&0x9u)=Dbs8=7&*+fkm}5}lS4tbpZ}Iy z42|G#c?cBelE?NARUY_z9!#NsSh2mSaJ@x_B;EXMD~1*dUtNXfM%{!>DP-8KZk>Qy z!K0`YvSb=ANj+vDp} z5gECoevzN+Xl`?;IaP30F%`O@EWM-f=d}o+oEf8zMnDTug+`~>2h90j&Iw9{YngH} z<(--ZjZKsBLFw2cv`|bJ-B^G1yZv>z4pbCR;MomJY4P+JT?4nyRi*Kq{{is!y(c^z z5+Dl(AUo;!GT}^0G&3*L7^0>(D4{pXKU$hrXFO7#Y`$Tg;>zL-Fz>TK46x=abf7WP zJ618qdwK|7$x$*z8yHx={s~%g@#3r7E8^Kw$6;PN2~a-3-lge<)5hWa&%wESmS}2% zgvv_*?uYFtZ5*zPm*JruP)?ZI55EH-B;RHa{3?W$sq+8P6wO$cm1Y2{knDl5T&!_(3d1_}LDg%6uQ7t}%hc8CWrtrRum#Vwtl9TA)%i-x zDsu;b6X*sgLtV>J?x9-4qU?p?25_6hyxBf1{l3N*|G}B$Vg`f$n~Db<+Wm$#%yL+k z2mImzx$eAr*&O-=qqZOaqmQ8wZXw;nPAQ^`iE_y2P14j9okELgKI&lvQ|75~(fOC* zB#XAs_;m)gMkQ4RAd8O}^XLC!>ztw^joO48+qTiMZQHilvC}~%>DX4swmY_M+qRuQ z{mrad>z_53wd$ho-a7kzp0l^``k3*pGM5GY>{o9!7Fe*o9(iz@ufAE(bc?U64dwg2RN3vUU6q8@WE(=4mRoHT09xhjPg2Kk-N7+Gg>yPSb=39%h@n&5(o1 z+|0^$LKFnKreqqppvHfxrY=3uWt_yY9~%1@yjrsd}|px zpOd!V8>_(Yykiu+Fb)-rpE__ZLOHHssX~5rpwQE;?*X7p&=4QLb#XMqs(Wc8B&=$O zJ)eZ@gwedx@||Y-Ul25chnTUz9^wYUw!IOL%3QBC*Vg+nmIB^ruR$GNjuuB$57YY0>|MQ?b(z%0nv znQb+BYk38lHbicT61{~x&BMmSE!5W3qmDn4@dq`+88%<-lE&z=SuUpim)Y`RVco6a z8`>EA55OTy19>AEb)~DAsdeht^5Eszoi#HtPB0z=j=fnZPzjX#?pf{vqu2(eHgRR! zYhj_~I&XAx*F>wjv<49w`}1?ChXkrbRA7PSE_;2TnizFr*GOWnP*79S=b*CI8FkWn zW;l}SGUS|8S!^Id!JXp~V4L}#uhVZEQKu~I1u$+@V@NJOWWWu{C@q$CB9qBY9C+~e zd(Bn3m{@3D4-rlw->TEw4d^SbYe=V`LLid&z&_JVdmrWYzDc#Od|34BcOjJ)SqF~P z>{$h-u1pyXKVg_fcM*%Mf2#^FYI{b|2ng>&jbinVN{fzx z4}hv5^n_{CEVWa(BbP0WAf}mQZfaJ|wS4DItB%qBKq{2_3|B%{fk^L1ku!!Wl72!t zRZWCe+pU6?z}K4wmf&t$cfm4@vwGF@FIT6ECHpBfQ{LTdq`c;#C+$O@(*3WJ+fKnT z%K2iGQeVOwmd|;K;H(J8-caawn$n^EOu+4-EE|KBRFN*8S(uCl&3GJ(sFqB8ep`!~ z9JS(H3G?VJyxGesshYf2qk&$90}Qe41DY{Li|rr{pOjJ*jiGDnMa16Y%E3TbJSEco zOA~)Xb##}$p6_XvZs}7$^ka8pDuWZTF@uP?RHGD+ zvK>w?zXgWV$}4>b@)$_kNmfN&EQB+nBHgdEIFlWj`QiDAc3+`pHaog*t+amsCY2#^MRgl`Re=M%5;Ws} zOsApGCe+LliDKmF62pH;it(5n0H7ko@ye5ibbq&{4O3o4o9TWC@vNA@vFQ4&e`3kr z_@?wHR5J##Q<(Dghc}XYNDWXI7;QKu+(d)3q8Y#Ssk-U%ybwi$+-adV_oTh+t%uXw zp9)mA5!jc%V(&gXnXl`okNo_YztaArj+13sZ0sUGBSG2?8pK(}G|2@_>5)_cquaK|aP>cH2YJC7a-uEtR+m2hH$WSo0 z@Qy_rRyC>s3Xz3|$u(9a0*EDf*E$=S&-UZhItFi6An_PAf6EFf7RssSY|N8ggwImK zQ(Q}XO){&>hpw)}2Nsse%*m=!Qj1!K-WCg>zd0;RTZ1h9Nse?UeUNzmOoA33or*rX z#*j+>4SJ9*t=Gb70|zlmMB8c+@HU=ghr4wVDfgMBY!*+`yZaGQ0LXyzHH`0?>lVRy z!MpD0Vi0yFWcg6NVkeBVD72F5ABjwJB$edFGa-vwZ7tTc_Q~%Io_Y`S=d%r~~;E74IF2L`7dmkEPx zZH6LD$Tt;Nl0nTD>t63rI!2lA{%gaLTp#!kIe^_1Y1bV1|`eR%QoTw>%nC$#iP3#8nHh_IFt?lRNs{Gkhz> z6^F?}8Ipzc&D*b98rR&pkVitC$(3oTUXHSD}-@4%`jPrBI{Esr%UW7 zy|)f@a9L~$@f9an`)eHWEJGD5>x$XlW|P@p!BnALKzny7_i&*emhweCC66n9Q{8~E zX#6^rv1N*HSXVz=m@MaDh-A;5fTK#&@gm!X%-LDssvWSvqlH1It$pUZzWFm_xxBX{KW1uo z2X4@K0Wp4P$;dj?`12E4(4c=?eh46lS3DTgvr{1x^8Vcg89vHn@YKJwyO4P#)6|4IN@j5z0A~BZAgP&G!t?}D zhS0k4N>6_-3u`2aWcO!D@47zP+3_#>h*vh8UOrXp>J!fZeBl)~sxzpN%gR@yFfLDz z(>fpkMgS;d;a5m6z9fUp{d+RRHNn|6y$1vaNX8mC;$EED%9W+8(yknj#PXpz<@XU< zu8MnIRq7VJq)_)g^4MsyV=6peH8v6bVYsGv=B@(!Q|yD&;}-C5q*{*Q#Jhm^JyPxY z-y>BaF3A7m=9-l0f4K?qe%h~b-g*JRHNaaDkYu7Wi)>NeCLL$lBgiHPE(tKil%`Q^ z>%Ubdc?qwLFIOBQ$_iuEyy-5;`IY4HEO?V%;_6QT9-F3CKqg__)5aXC)923iezRC) z-M5;3v96-;GBB>u!8V5oq5jm16CT%Q z+tNwMJck@T$yugLes7&7nR7Fhx0O9)Ev)OpKBp^0ZfySqG z4#TO8p+L8+Y5+GZ98;_s-wj4NnGdPtbSG^)Z4PeENJ$Z%ZIigcfc-M1-+}&_gX9tu z47oGQOB{YZv+>6-lP=i35Tj?<{xMKR`}UqegqxJ)OHEX#;bD}FEk`w17rrO%1j)eA zu!13{B&ju99FiUKqdK@$4)2jxK)ftM_X)`QqL6x0Sb#zO$g@|iTLvUkL>XGByosu8 zEez{1a(Jjv+hZQ$(u6K}eI~ai>OT-$vs-E(dUIQA&psWLz~C2BC7CGk+G?X)%oV6F5CJaErMUDi0mEn&KmzfsqVTTEE%svjS zXHD}V2n69&5?$|)vIO-*B?wRTtM@=XAVf(w`STz&!@$)>9g;8;3Za6kmoj5{W+a9o zXx=k4{|QsY0qIgD&caAFi(olzT-D~<*PJ0D;SCoO1!|uEy{^;^ z3=i^x-V@B`EpSO*}DtNT8RKqTMq)5P7_HJjCRy+C!K_y9AnRz-uz64%XUOrG&jV zINn{gtg7mLlXzXBkbe7c-aGtZRJ*`nj5r{E1rACQ^ysN`a@~LiQ+68i?Kr5~g6p9w zEG+mV$qO_zW0F=TJlZ6dP+&NK1tSxJZ^z=$_YDzG$Okk!Ci|9>$a)q}q1WgnA9#sq z3<2|enTb8DwnMGFqpbbc-RyHiEuLx?Tz!r}k0va!^hcP53_KM&GXB)8!|6)4UN(Tc zS)KqQUlEUiIMI(7zXk3}I(TtBiVr2dq=A`we;(tAOk0&2YQh5%8$%s+?Gfn_Bps^HHUP|Oa^{`4+r)?HGARSS^;IBj*@QL5tNc2 z^S8vv;lfk4EV0n3T%?Fy0#qQ?VaeZ+9^V|TaG&D16)387CKVbdv|$HJ8F2T*>33c3 zz5d;n zXh;sQrozTE?H%q(Z!eduHk9XKx%0STsyj$8K9qMAO^DXBRv~M)Yr2|8v#IOK-CJ{9 zbagC9akFMk$Lv884BWD)2|x%L-7D?)Nv%q{NINUX=8~Ikb)V+GUVVw2mSI}#VzeH& z*wWJP>qj*VG|Pfn(h7*<7lMc#)yz2hdSjVMDB(0`=|9}mW@~B{vS{0p{`SuE$1(5w zI+N?3&Qb($uaHuw{TRN6r{hQ{d|aV*+A!7BMPRB6bg&IJhYlf%)BtDqLz}aND@oDs zZH|Bp5pVi|sT2g36CbcxI@jn)gb3Kol6ffx1(^IrsrotMkO{kl`6D%P&C2@jRA?Bz z``_aE%O7H@2<35IiRrQ=7RLS2N=74-mpXmcMzph02$2nmUg2e;uj{yVeq*;BSF$d+ z(2?A%K9X_WvC~S@5`gXs4X55b6M6|+8(gi6O-#-Rr?QtU;qRlM=eU1OjzaEraIBxC ztf(>Tu8hjg828G+JZAl(Y;&S|{w_+Nl(B8H#_S1MurenvT#d}{FTsTdGHd0jyCB(F zkuwk0^xeTO$^58`e+!-(%KpyeBQ|6g~*;8mjTT!vJY7xC&aM=*ZG3MVl;8 zM#L&;s~1uM7AIwAIcr!eea-YQ$ zeQ!(GHOzv$9l(8q=Z(fBQ{``7x3VBd%SLN9jm$%K2ufnMVdaM)M9?iVDd@@Ct(zivoUP_VsVI+72^GTE3Z#3~_=` z_r?{ea(CH>5i_e8LGSWQ%q#aRQHHeD#;|!L%MNUk8R)YZEw!B99ar%V#Wk)&7jV9S z!<3zH0>kz>t>)((NJl5BQ~db0XzdaQ%P_<9;H=7qHwKxSBGh?*9T(sbt)!Ou!%w3o zs>W@Fy8=Mi63;MPW^>WyE6|hYZ!&mB_L*Ise$D%A@n<*!HQfQf=+;fYt3|s_C1-Dt z+26lX^+-R`M^Gt+C6wwW=ulN9P6(bFD|*d67e5Pks?Iru9YlGi(oQrp#9B=x?o z3HYq(m1HI$kH)k5`8_QnExk3(RkZ%O3bwol>I6f`^B0KAiK>-;cN&DU#z%#&-M{=S z6o@%wt(80Iz~5E%IUH`^+ogl#Xm9)$53aKp9CBJecd_uZuy%@BIsFBVA0wTIoNUn$yIA2u3LwEteWfIG~Qs0MZowck6&E+ESx5sZ*YPKU~at_o(iL_ zV8eW6sg=<8pn+JZQSvE+36&Rz0?w&xjI!FnTq5}I-P@wYg03Zkssl?)*E-OP9M^9mj9|{@+Kd#gg2{ho zZ^B1hWo^QH{o*)3*{CUY?^FE#^j5eDFLPUIaQDC{_ce!WtY9Cy@qlZ5CmomPL{*j? zK1!(frTN-r8uz6qx3}^I{Euol8#dblzJ=@U|4X%ZF=fUM4V3LiDvggt*E_rNZ3B8n zBiE|S7<6AG!+ORiz!4>;1Siqolq1tIP5u}DEo$TW{d55b z8g%w1p;6 zXNKql6Wni`epN z&Y*aB_4FIlxKk#}g9~0l+obtSFDiOFAy1NWf%IY{wckQ8MBc}TJdL-oAy>m*lGu{u z$Y8*EG25(l-0PrrG@bw`PEW=P5mX<)J{hQgru(N4;b@HX6@KzLxs)V14wEpH?OwhgevwKY!21bX~4JFs99=zfti0JNk2&A*% zSWFS;e2}=H*?3$ye(JZx8krws2rV8m+?ZD*FQ4|1Zz)oh>duCOx5hO~c z6+VIi6!Scobw#pezwN{!W^jirx4cU6V6KIIB(TrqdL=%B$2V4-HOtM4#~`Z38oxS8 z{+vtr)FYG`FTL*=l@L$P3^A(lUOb@Z9N+i`Zj#w}yyl|&01fYik(WI*HNrQC-Vg%r zKuMcBMjtzk8@*RCYx{$jBs)w9e>^hR6S9d5#o|YJyhz)QVpaeyZZD9L&@KDV=vvxF zF<>Ab@q#HyW127plk96j^fH7kaUxM^+1q}xpXCD3G48{8Vv3v0sBmU&g^vKsd-6;!W)xRG;UBJ&t0c2_nXBU8KsJjeXgVx|p6& zFHm*D_fifna<#tNVFN%Mwn+sJyms%D?E4J^R=_6&0ii&WgrG|yAJ(AnMLzgaO|ph= z9qN=e<>I1v{Y&f3>yho*+$z9ZnTWLy0meGYd9SYI;Ty02q(xNZiFiXj&ycd_9k17 zbDnko8NA1;3w}h#s%15(&O>Bf7OU16#6kRDJ_xXJz%R?s4Kkgpt1p1;K5mh1AYT!J z8hxxlV9eLa8 z@SURyOH>JOPD}#G>L%<)KEhbqiu|-_*w)_z?mrJ}gMjWk;0M=$_N6dx5`ft7sQK9r z#cn%QzsMqFoMQks9AE^H@;=IeWVx|ga`<{t+mz~g8~P|(1#21!wFGOOtK%;}7RRpf z7`376KH{A>$=K$wbqVy^1`ARgp#7}q`!hwcUxw$g*h&BhBa5KhWqrkd-YTGd7NugVGGC zf+JlM4MPIlmkR5ax7>3_j7qv9u!xLOK)8dAuwtT`=-_o0W6}NQ&&>eoM7vCx3k_2g zApTLrH*_SiAf*uhxc|pOYIf)3a{--e_3Aufv4Ix)&J#lm6(R38#jLf)pFyy~uC!ET z@{xko2F+6F1zwB48_w?&(%EK>Qq!a=1eX12rq|s73uFx|rw-TpY-U`^72Lc{&={y7IWP zqB?)AURXINV>X}m_nWLbrSdYJ>7*6Q7E(v>4ahdefNBKR!qn9+AkZd^UU%4|F`$J- zwSMc_b&+xjcLvcu{SzG!$Z)`NRk0<{GeYV>6db^6)3Y^61{NPdRO;-DAZpkbP@?)@+iM&OZ?$Rkeovn(J5{ zr++HoxLbt2Oge7ov;_%6f&XWM*9c_~aCsXp92Gw9=0FsHcYsBaZ5#5p_=`$tCA#>7OLja`O^v?fpqDfcHW${&}%;F=v8nb*y8i6CE@=vS`pZ|ev-0U#G; zZPL0JEUF)X9;6%=={K#GmgPy8aFtZ{&=N(Pnir%X^ec@i&-w*4*~iuIO}0hkL#O$q zE+^+#N{1~djg!LutWBuPNbh*?3M&CfbC{CCGfL~sibp%Yox+AXR^^_W&5iymJ%J>V z6Y$g$MqB^++15Ovx!yT7GQ!N*h!JuFVU(DSMhk9IWY;zDahB(n9Yk>DSfqw~XP-X@ z-m1baR0M7s&DVXh-SRiv9Fw)GpSeQtB?VsdJfLvep~33Mw%Xmz1RVB{iYkCSd*|s( z594}XoeX@%Bbd_W^F(kVC%4$?ZUqKO3^e0N!J*e;9S-IwDylAawg-`}Xp@GUgukRn zLdIYDej8Hs`unhz`cyh{a|@&Ho|UPjMyIxn>7=scgbtJhGtn9l34Iiq1!pkkNwT_X z=qt*!KT{Cb{_$K`p*KdWkJ13~=^~s7f$$5vhTuDAj3XM|pNk`QZorffw_wH48Y zUj$_mZiYM{?9{fUW;B1Q*uv>7vh>9XD9rae3S9jYR@wWz2+LZv1B)Rg2ZGaZC;WuI|Q`7w;-(cIlI0gU^Yr(w@^K&>r^{HEK@Z6u;-C-X>T0ekS z33+MktPMzdVkge%kyH2fi2UJb|OWPg62s;P>Li}(fiTmdYW32!VvfZYc7B42r4^{xWm8-(gM@LgB9Z; zr+(n66WWClKH@b#6FnX`*8`kdPmgLws4`k&j2^;>_qtK#TS7eRqc@9*T%h<|uRqlv zWs#~L9Kn1D1OXCkMHr}FA5cE4;b_^g<_Zup3C-b00W22Nys@Pj?PhapUK97{T2-U5 zG?edNQe#Er=dc!c&io3jLuqbVrmijgCqQ9Czg&KhwGbvoibKR;A z$3n8^`8ewz@#(W1W5)=k73ZH={V;PbFHlj7Z57s!D+Z+P$x^|lO{!-h$&4tXpB<8? zA}93yVB}<2kOP-o2cpHx9>vX?=cLWOeE80drllxRiU1y(mrvGN-ppfu$ch3zT8r6>cZO;_^o)4)9M| zTH9~7BLf_Igo1hjA2;#h4T{zWW*yrO^X2rDE(AXOG9m*uDXd(vV>PrCzLu!rRJkX& z=P@5Yb+_vQfD8KZ)J5Gw z&l2hh@H_fjl>pjh`5i)Jy*T_pH+ktpD_2bja|R$ONa;v#cio|qv9O--LrSU_DWi5< zSgB)As!Z3IAp}(j7ne;X@q!1H34gj1{!S~Rk8y%A2Om`<5H8Y4^ls)=`d%(Y>H#LI zXOrk9xamU{X72a!46b)|xdua{<9n#fi{fzhFfW9;nYUe7%&i%e;=&HmBxOgF@VS~ zCwSz?>N6Rr4xG`=-h#P%S5K|DxYIG3Z98h}wqQ6w8Z?oq6Uy1FQeJ()izyx|RJukm`o=-;jDnQpmxPCJRAA3=1z>Mn)#F^xC#X55zAv z5>GeeHkrjv0(@=^{O(rUM%3~&H#1=LCXh0;@AGz^sO!ti$;U;ezTo%?&=YXU$bXEh zT5kAxR)DW8up1A_j~?ypZHHV=d0;r?SXEtpan_0-s3HIMdoIDJ_9T=j^j}oKy6XHx zwKCq>%}1<5iJ~Xbnl|qda)P+h)e(AEuh|! zc7vD5E$+j}AbV-Y2B6gb%BGWisFHo9q_S%f|30k%Y@obOAjEsV1_9K7*+6}554b+G z{0b-8bgLlVBc+)SM_iVjzi~@#D@Qh7rYD^aBU*FWSlQ`|nk310+W=fGvHUa$uS{}d zvw>sy^I+sOE8j}?i~piN_@GCVnJ+JLVfB}*3GN%x`j@mY1pr5#Y$!mC?_W>=%F5I^ zf0(2r))hC|mglvr;Xi;1Umi3t%<3e1RJ^7_+qQ-s|CCV`qiG%TlR-V(~$926+nr#%$1wL4z34SMKL(!BxF*oB%V)}Y>I1t$WDg{TNf#1d?KDC@8R zMzt1?{Ss}b-9^RHwtL_E;>1*6G(%wh%GPXj2Y zBAz<_>PnLvZnP#c+0;L!E8XevC0sY8Qa&jFv(rt(4T^c-){WQ^+02u47*DKFqQJ|_ z=hay?BZo}YfhBd48bjOFp0ejvRV9sHxF(kW1P6YT3P{rP@mqgF$jr}b?jqlK1d0+^ z-*aLG7l0az(l$JO2M4^F_bst;ZV0XZJ_$684Dif$Hj^E_brGHeLVy1K1O?rN!2yW* zEg3qeaz>v`^M3eV-JsdWR&6)$3ShOh?0dC;< z0DKE^p72aPDA;&5 z>n6=PZyhioEN&97$o|2^d&_y!b&a61K6he2$sRJ94342!hQpihjwBRdm+tS3Vxx{_ zjQBf_Ic;+za*1V8WrIw_`@3`2fr6qv`UK}EHbu*%pdYPc?bV<4kEq5KuqZb_^EY#+ zBHs-OhJg>5H4vNT&Hcng`0uFLmz;TItqrRsbQj~zQI{dqE2f9{t1ce!Owywv)&q4m zZFBHn8^;lO-k(vLf6g8NuV<@gO*)H53u{sf!_z^p_=$fL^Jej1tAr&BWseJz#Z9(8 zNI?Dt2e8(&<83h-Q4|YIdakRCu}!Nkyq5YUY#arHh_TakG;0Bo61MR##S)?-;SgUnmIUP`kdRQ zb_9U#8^21dQ-h4#uGJfsy>vLGHg!%Nd{U-z&mazbcT^0AbvFk6J(W#-O<$nRef?G# zM4S0nchSV!`MvCoam)-qmeY=Zel4rfln}l-Ou2jLOR<)%vUDe4oP&%74JY7~wSr-^ zMd^_yo!QKJIvetrEUI@=RImf$BR{b!Qv{&XvidOMra>Aqy|L<52$P3dhxU0W4V&&n zzt6L38jPDs*P&$;exm2Ozg!ks-wN*vN6n5khnBs@bFmR-!sglrG9Y^9)zvWMtt9_gXF}PH@$V;d^8+rfiDN05)Gb09pDY3zm= z>7%qeZ8c7pZnd!A*c3;3caV`XYqQ3?xrXn=ScgQK%Y{hhee!;?Hm1gG2{Jl&V>$~f zvndModKu-kHKTnnF;<|4dF>4fW@gF*Kj?KN)clP zTe8fm#HeW1M4KdxGP)4No8WrA-Cv|}I6vbbujk9g+Pjc%K7mkaHE!M=x|ig4Ej_3Q zcG=F{;O%$|UBrlzxcmn1>B9kq8DiW5c7J1HBKfR+czM>ouCoKAv;)1;QK>f4C=y6I zT34z}y)yq~Zq)r4t^wkAk~V5SanR#0}2pUg|8H zf5&HsYz#|E*6UJmv~CcbrHI;bbG*R7Ym&eTuADHaa~W|vkB0T*E)y|E?mglTf3OJ$ z&(Gk8NIjCuvl^Fj5X(Cwn%tQeuw<686U3JR`Rd0hLz_Z5C**0cKJ<6lODax^>I8Xs zD(*9%)hKYca`~629XJ8bu4{UG38SBab$81VRQj5ft_NjB(Smk0qUY)X~RK*$2#CZV`H zS#BPxU*Zhb81z#wSFdL=`bAUD5_y#??bsWf%+edgKRWKv?oz5wX<@;VQiTc@p!79U z9QnajKvIU$hn*^F-%DI%1z58a)`%+g zD*AyMo*c6z_L32xTD)WX&4t9le&jTT+PyHwDe|j@sP3Lm2efd#)`PTjf0K$#lUF}S zO$&4j?Rd5Sp?KuSXSG}tbg z^4TPOlwu(84X;Q;TG5>zUbg^I*i*UWnMz&w{<{tj1gvMmvji6_K^WZ-Yi^nhKg2!Y zpjn+W_BWI*(Y%!O=v5GTj^vez19DyTF-dx28-GwED8ZS7So{=PyXEzFF0#G$xmGc} zxi?frVvH#=KF||Fw>Q7@|LG-E4n}ixd>4iofG3Q}>2u?{Vl#35tPdc}RQ9!%F+P3l z^sPL+1&|s4z_v7U_}n|=IuekQ+90h)TRChG^mO9@Gs&6j7AG zO(&Gx#AhH$EqbOmzJRT5{th&E_v)!Y*<-}Q0@eVCag5sDWybzU?nrbieMK3DQ~ZJR zQ<|brJb~i`06hGrCk6QtW<-JABSG^_pW_gvNVAv|7VJ?i1?MSO->x(Yt{rW{y+3y@ znON*P_oyQXKdmB%kHuwqC=7mJ>ips)VCI7Jac2G$+7L~!*sGy9PscNTRYYvvU70bp z031jh-_&i=={13Y$&NguU*{APuxT44Df2BAOtNCpF>pvq;#%@97K#v$goYFMJ*h4J zoCfN@w-eg)3vRIQ_6S>oYo+hWcl$DBR(F*tlQyI!7g4Lo@!;quEsh^w<&{p((w@fE8Z$JbRZh%2&o=uy@(;=C(WPTx|{fa9-0{o zRXENd$J}N0CR-?p-YR4%cqTsp>w6W5+~IA7nR0oD80{8QrpbQS_nO6Mdqhp0p=)Yc zm>JCVY)|R?3a!3^P-ZbnhXJwt7wO>n_b%3HZ=b(2PSXr0q29-@GqhS;Lb3$7-u5dXA$FYh1pQ7{m)d%o0+IKS0MojUPN+5f?MG2pkqz4c507qDlh zTmAtXy6aIw+s%X=ZNkr5#y_yC`|_V;fmXH$Kh`&MrmFvM<`g>rKbTY1)8W4xc6e6b z4ZBA#U+{7eJ;=~PU1#!IO!?iDf|Z`xq@`oY)yr80 z-vv988xL>q?@QHL?+%;1^?(0`~I z0LlMATfWH{I)k1EFxBeYnZ_eX74ooH;ZWDOZx%z96>x_wyN1->o6(M z4F<6h;XU0_gF7^dpwF+eduF-Qk_2~_@)G^bd76jEQ(k4+`qS2Azh#%uP3h(?=$p&G z0+4YNz{79n<9-)BrTYUozq;&D0liPn0h^(z7l3^4G|m9;H0=Dbme0=;n!iaMY=|gq z>@Ax?4^K)#oqZ8=@D!S`-D|Rd0ehttx*=JL`Rp!)?MU559AfNbNRa+k;P&0EGcJAn zWt07=IpAPKkT!$Vb$hAr`9;_J)ch3{I9`qwhvi9o%1i-AVn_yvN#$VUnFw z{wkD{)1rf{#G<1W&xu35?Hm>sa#1T4%9|ePjW0YTj8o#9VF2oxZMTHHv?S=JcCv}+ zRtO}$P4Vs}yo!y-hW zc~5b^0s$U(ruJ%W$Srl)J>L!|dj8}y1TV9>MW!Fc(JX8{x7LRYcqy)<2!c?m)W@*B zDLU^+1iT`Q&Ep$y0E7ILASs9*p6?iH6)6GbaucRt{s6FQ&!bxSV+Q)ABMab`QNsmG zslD5fCETRSt!bhQoKXt`Sz24*?91e6iCe!DdAhv#JYX71%Sa)_gpQG(@8?}c2M9^7 z`ib`o-}Uzn0#VN4+X|9@#wF{u)k@uw*8W*4PBOF}4#lMQewoddb-WYrsS;oSdX#Y?l?iL_S1q-n^p z==93w-s%>PacxyEY~jbAm$&j5KpM{JIX(&GW zfwUfZDsxwNHE@}odbS>ccTSzno9TDKsY^V)fK{i_FLsZ~AlO2JIzngJ0HJ~fo60TY zt)-G9*{eXPO3P6%#8gZM%HF$_H@)kxy54cU%HvPdv@H2+O z3krY+8%zO1jblcNKT9O=kqG$$I*+?2jtjt%v||(`TJ!WiA6kFQubTy%aPbR%b&OXQ zSYjk_>~#D>STE<1iqHGLvT)Tk63K-z0YSGzclY_uAS?6%j%CmpJ>^#-T`v&YTF3yw z3(BCQTLZhaOgy-=+0)au;ZC@TWzclwo&;d&Gd$5yTccKT16-RPw_H@SN$*4v<4Fup9 z!2|Xc$*7Y@s#9(dAplw#f(9{dR?utmMeLXfHa2aMD^g92ygN)nKxObZhT}>>aR_lK z!K?)_XZ$f4^#jbc6~&EPQ(K)Ggb?^J2h-1Iojxil`b22gdk*D7ZXvq@fZI^$MRWTP zGno~|HSKV-e6pqD>QsRsX6Xc<03>%V-F%q5Ee*-F5%Hus8z5Lk!A3=l-4o(IP+KNV z@bSSmU0^BDpA@D~0xuUOfQk-i_R7inRhGDqq@cJ4(X-xKU~VQK8o}G+I_G5VVQv@CcJ#Tg?^*>Gj6h{=+k7<{SP5yL?QZ1@X zc1W8NHtAJbwj_+QuGNaHJ--}sQ$^wU%P4Nlgq~V^idx=gaGVRcCxCu681)I#poU(* zs*4>1ziSSg@lwn=jl&k)20IO+P)&z4??^z$xNz1o-pNW>u=xV6S2}d_<}n@@=*~+6 zH8u+ARmRT%|7W#Pk|U4+ z_o1%#^fNu2-}~z8NGNvBfQ-L}CL{Ym&=Lcg3Lp^OFE=XOXAHWpU_Nf0r6AU5BewI| z75Io%d;8rugim6GG4#7(qMcU}8`h3k$eTkuZ1QaS-U6^>Pi7*2r&^-=w@o(Kne2G@ zB1-a6&JD~2eN2gOx5TDKI&x&PM;MQM$GyT4^3X227~GEQ=+=d|t^$47)B2=bz#y*P z9JJk`kD_u)L*wtCEoZs{Sbg(YGVfHBT)9hJH^kc=gqd7o&P`C>IYGS$$kSSV++-&l zEGtN2FfahR38pvaT{}N*ELYYvUWq$V9qCrCK50(J*R!UzhG)oj5x(8DWNlbn2pi9X z-Z!^GLIr%7QqJYh;?P7Z^xK3FaG@7mv|iyXa4OCTBmMSo$-{`S!!h!Z3;ip#57r#& zw^TcQJ$N93Q7KIx z%?h|hZNu*t$Zgn1rc#=PBzh-E>;fe-K}3Upd=wBatFot`Hawy#g3T7L_Z>c98Wj*y z*LJvS&p4@d3OVP7nSShKePs z*eudKqECCrB+gZ>$Byfo>T%nC+%TipIu8(`$r;3n+0@4=7U1}tv;16SEPFMo4O^Ac zEF)2?YVU&zeEUNP_tATz&HRiV!F`uY(o(jToqqHa0ePrt3C2X^uh!q497cg*57v@; zS_~M_1Nr)8IrgMMW+a!2RH;r)62)=W#QbyYGz6~au;oIpNeLwmtmMbW7$F}gE&_no z$S)9-w=vS%7|F=ugo@C?o?A;i5}ds>8k#)EW?q~taBDgP*(Hy#S+HiP)M;90;U-d*-a?sPPM$4AZBcZ5DbVj3ZDq8ooxOa(8; z)WF)Xh`Sf>jl@i|^R8;5zV0&X7wF=7;@rncGE|Qh5TdJEvS;~uB~^3zWfj$rlQ5KD zyILf!ef>oDq*U@PddTD^MDohp!MZLBMVi@Mma4iZd&NN-%B_zntO!%2dIo?_{w{B^ z1I>&)F*%`e4#BWsV*HUr{ZXGtivp`qjxrQ}={h17Bm8aqksxLW<>g;sj98A?aLCN= zZb&V{WLRmhSm1-lf!+8kedB~5<8Y`NgJje|by z;aFgFN3-I7adA{+V}_hFp7|xl;YZlV8_Zb$`F6F>EVlO%R}3lxXmpa9^MoE(Oa_d5 zQX8cDJ0ghu2M#KUS{5P{b}ti_%#~I-)wjVnru=-1Tm-ERQ zj#A``o*8XH-Wx$aa&2>SY>8VB<)m}=pNC44FT2oyqw`{BKC7<~E1BjS$FJ)CNna_+ z&|}70+CMQcPKdx^Z zXsVL*Vry*WhO!2cf0#5|1f0@WXG|l<9p1isiN0!qV%^HnoJR_~0K6HP5+1$ZEfW0= zY7kQ=_lhJ2Qpm~7NZ_hcqO{c%zsVU82B9rkl$tQ5pRk(mF{56dLu5oT10L?vv-Y|L z<(Oj67mM>bPSyN;)TS;hjqfsQZM4F0^DGohpD2+VVe0EcOfdg|-f)tIz^Gx|W0HZ< zu4*{dzFJ5Yp+3{h0^q~vlSof7JE~QVTd*SV&3nk$4y+vin`Rv1fr8f<`NH2izK+%S38t2~7hC0RHNK#?ee#;^n2KW`;#+f`Uh(b2&z9f|* zoF$2f$vr@$s^mk4z@TYE43Y~{UiSu*Xkp8sZi!;eSsEw6Z_aM#RR}+$YAT)2atN}8 zvQ>!MWN7_p7?V;-SNkraQWj{#%v47#E3$0d{$>W57b+Nrs49u7-_;_WU^1Cut*R&C zz{H=hrCf`-4H!@OeU6ND9`pPej6v>=yE(;4QWui2!Q2%JwI37~)q?bm9V*Y0U@YpF z{i_5s{7A;90D06rAbQ;cn^pOqS&OY(zS zcik3nXXncnwVFAl_J*~ba@z*AoW9-b7Y{a#zpJKGxx9hLL@v$RxQ-uej$Dh+y#`K? zKK*M?ZM$~swEb>LW`C;2jwCLZtG~eiZAw#8H7-{pgMhRc{I@v(1jusQ5jhj@75t_82%&w~Ff~}&=7?zdLkIG8c zN3adtoJK6GtL(3joV5tUOij`3$JEoB)$<=~Yir)f&o>z<8jW`+%QW5_?c7wF*YUHn z*+bO2D_=GWle~Wbxnt127Umglq8ka=mO+lb>Fz$(D5iZcRyz$p7b|$GvqV-~d4I12 zB6kb?8wO-Edd7{c>@gj&wwEl@bt=iUBY<;9c(v@*;w_EhfZKH1>|ZaH6;4;kb#NUv z3e<1)k(BD+rD?z1?+6zWzTr#nZ_YUDg$KHU33Os4l(S$?$D_F)&=2uwg zQWYL*?_YowdqFB*D0o~nJ5@9SD~xrmL*`G4FS(!D`}JB)4o%M3Ns@|VlKgRy<7vfE zQKD3Fa_=@x^#;T$3oAH*+m8?|*N?-^prj5+0<-;qmbxM}`P8r#%1s z)~LP5iiOyq+N$}!&)&YoAnjWi-9tXkrF zm?ViYXWnSBVhfP0q`27;n2J#RG)`)F9iL>EGxP2dP1}iz=h1qE-9myLD@vuT;9&b+ z9_T^$ki~MoV4`KqldV+xeC)=0c(|lN^n3t#9Die$aNH15Ba+dBqYH6HmqXyxb?-EtQTEH`0Pa^@X zdkf0a1Wk|T$lL|QO8fKXHv>OY?PpaJExmdXtc1IjaehSyd&9TVpx9oRQ;c3gnFb)u z*dPFZGBP>k6fG=#Sdaw@#~Y8Y;-NxcOuo}UQ$mn@GXa`GaW!AcoVz4|X3*Po zEj?_$v1zFke#m%8RWwM9xSAw->qLMdV7llXG7rzYI2HgWW5Gg9jF@Zq#_0;6Q(zXs z!!N+-`Ej&#ErspEZJ4g6$xe${l|VeVT%(YE1N7{i!S-`_pc0BCVR zcBuoa@2^IE9J%H>&OXPud_$`n)yoDN20Z}|ewzkJv>xGq=X}4fh(@Y7Uhn}#MP((# zN0ly5M?3|+gD&^^>v8Ty>lcBo_R(%<%3X9gvaGGh(q=_-aJ7kOx_*>%Mc;z}Bfc8+Z83ll=DEy%9;$0>`fz z!@VC6{$JW-HW-s>pi+FN%kOFYV2&N0NTCoQ7oV@d>!maORpxE-& z0@d55%{=wlIxySvpuF{S}?pQnGgHMlxNm zu~5z-?PVn?An<-f#O-F}Zeb!#6MjH%G2##wy0J!}VvBW4$2fO7CN2Ti;Z!n&H2aTF zh{G|`XmM!92TTh24VH6VYkva`As6-H_3%Q;rlkx;Q9{_)W&ng`w5x#8vZX_+a5lE1 zjiqLBHMTyCdqNgw3~keT^&B;y=ioRWKgPflTzN7TG=cv$W# zesGVOz0Iyxuye9nNe zCh>ul$M~8Pxjkvgp{38@ydZw+*v^*k-%cC^5`#g%uO0xu5;JVv!*hSOvh2)LH8#ZI z45Y@@;6(a4oU$Y*5^ybLPbe{(Q}Uo@6o1@J1z%)U|7@BV6LbjkcEl6(W?q6H^@8Ci zjPZ&nuY&;f@of<&Hs14mW3}W}m3$B}8V$mz zNzO5-5O9jN__tYOEvkaE7~qAv}h_OtEt z@|>DfSYljx7nM!9^e1)2nE`pa{TE9C$k z;Y{)hz^%M z79uJmSjGc(ng)(s4=wXp-;WJ8BNgFv2#hhLblx}bW1WRk1kTf+D&D1OSrx&l5uBH_ z{HG8{>bI{A<@M5mqGDhEi&!KWL7adb9qEQoRs5-%diL;fe0eSyew()hfA0I*`b&u; zzh)>!5y7>dV4}qVK>8|G_6BUqKpsz#3lgo+rvZj zMMCkhZ)i_a1?~9~hcAg2KdAAs!pFcEc6aH32ug&W`nO!-*ChOq=)G%(*qBqFW3QkD zon}^lFp%*L@4AkMM#2!e$0r>(>r7}$M7yR_k7}{(aBri9_rS*OY2Hwo$ZJtdGnaE! zC}Cvz%_R#zf)1z8Ct}#tUtfUYWD40R+Z4>sI-cp7;cnQqn1rj}Ib)nuii&(vmM1w^ z3a3nn^!5s4Ox)CXwJg(W9a#Q+UTK%ekGEOGu_eA43!oOq1zh>RkA2!mea@bNbvvpu z{^;BMM{4I9)+f;mBhgJ^3@R5m$m+iLaJ4iS#Mzfg6VEouGo3>)G-Lp6V$aXjI}bCi zR)qNjr||f8h7}VY#SRua*t*zjF1n#AH{c_=|CRqQPsdlg-L6GEB_#Z)6f=c;GUp~( zt!QYTx_iQ7uB{Ufq~vXp87BK8*Sa~Hie&pjq3mj9yS~%oN&GOdH#5tOjWv2QtoF-c zjv`TiI2xje9+h%iXH`If0yE$OS)x|BDZ9yjD&WPuB22Hdt_PGwe)$-lf|=9r?~qjO zX4L@$FXQ``=9u0(p)xcp)kin6^XQPH#Yxsc#Cy7CrRjop*+`;&PKm4>GZU0b_76@Yrn6_2uGb;)DQ%^a}aDxpZvATMUyn z29+kSb)9Xx&2AjtN}k_1iT7mKOzP3*?_`BCxJ%obZ?nwa*uF$jWj)0>QwJ#&(i9{I zkr!f;(XE34tlo+QTNApooL!$1w_PRg9j8ySkiA0LAKfaquB8VWWs4nSp99v%PqJHq zcSc&zxX>@B0geEd@7$d4tk6*pfBcb@u3e>%1-oZSdVGEI2N&P)^R`cJ?gb;to_OBL zfuE69=ij9vMSqsH^73~t8!tM#XJ&+=Q^@iv(aQR%9h+9PQb+%m=WO{z{s(@CZ7}tCABttgt8mWF7r&~7T|Hl}p73P?M!dgum^)@F z9!T>_3CWz4k`0dv{bgAxox{f45g?Ey&N0jjTS1>@YnOw{`;VIqT*xWEMVcU)|&Wo>G%S_vobH zh%@g_-N!jpx^1suO4xGBW>Xd3%bWn2%9i6cdPvt@*5a77Q1f?%8oX;&sO*DZ93SN!EzIvYKMcVb@d zaP#-&PcSCXbd2dELLNC(`Wp&ROi0z+DWc|qitlsc&+)f?kQL%9M3UD6`KEr*9|`#A zQn2ADx^^fV`|BtTp2-FdVa(naVO2m!ALoJY8n7w*3GJoPI}}WO_Ub&zuAF>jEo_AP z)O5Y$@Tdv3!#Ex~Z8D{ruuZj_tgTp@;PNRP`2-&u*~d(G-53 zEVmZ&=v@{(j6p5-vIQVq3S!m;J*ePa26gvd1f~S>&KFrKXh437>0t=i zve0L^TVYidS*lAgAfc_waEzr3H>S3E1-x7FJv|s2L$0fs%cY)U)8!A;uP5k%-e_5c{&(AKf{ zGsRE(xY*wbvq(v!fu%|H;`jNFB z&@qdR_oJhxh=26@F7kDX;LOMYeH!{Xo0LV$LBqxBH_=~sCrdJHVtVOyk7<_dwH9g+ zqgj}1wr^|l3uVUn+g!pA!6n#4)%c-g5FRfK-B`_2TM)K%6@w z1a!5g5#a4x(x7*y;T`s@xvP0ZXqbEv2Sgg}QY*cIPr0#S9Hhv2_&Qf8J4MzUq0+M00isPa7KQJsf(7}xtIFC73#oLJLFTjfK zrfCB%AG2lbwI=^0cYTWtg@UWTfdi)4@%95nVSKKD2rsal?4N9H44R0?>W_$%M49oh z#nz7waX|;he$M15esW}O=6dc#d9i%=k8qfzptlw8FMvotHZv3_$a4fxh-bur0iS?A z**&BeC?g^&O5*0%rIy*NAY6Ou@Qe*JSqT|Fd;LnSzhD-zdlM9BZDKx4h}!)oKvnpD zjHmfE*mFT!MPtDa8ONdxs}86NAIZAyQ;fKH(yfcqD9cNMkcTLAJ@>uz_|0F5L(Bl5R;? zn*?WdW}#p|!;!YdR`;c@>P(-ckqW?=@%?!NstNvRpwvXW*8VW_k=6wf7- z*XB0gPTzGsnq*PD$>HSPU)@F0*FWRn(m|Xc&B-yhk5tG4?Z28UHD!;~ck=Nx*$Aqn zyBIPF&AYD8RJ@X0&~4P}WrHV4Xvz1VOJ%4gJnY_l$gX^9hCQwTIU*qbzVwFI6fc9Vmxkj3hAQmLwaCtzRi;U=V~ z2`~+K1&vjU`af3k?K)rz;M zNwd;$GU(WeQp{@GCrk&F&iPgh!M*}4&b+=klj6kxwhSWUobnbcPF5?pDclqL4k;TB zrGX7=(SwRXNx)k)G*pthb`}ukENhxOt9;l6ZC6eJf_YDEx7?pbj0T=%_3%8O_}*~r z#re8#&GmCyTW2@Am6|gpUF;G&r6W3oMpJ-ke&D-*7orB*Il7IFG-^k+J+yq8g)JEn3sj|v`2D=Y8rx}wD_ACHLJrmJc@!+|0v>6w=j(f=9g(phbB?9b_&6=|V|v72 zOyfh*6{%EVeJceZ?%G*-PrNkJ9(opW z(G+XcP_p)fIm3fN_v5B~pMr&5E=hD6qfb@mn+YAYBN-Cw34Qy%7pi=kGQ>)AM>u}u zK%enfd$n=wXz^f!NE~Unq=*j#Sz@NiN&qq@ZGSeHqsq>1d~xMF$2m9naY7ps9)h#9 zLu}i@zSb{g;+Zu-eZSP~9DoVa~^vCEoicmAk#3`7Cvz)R`;%1*A z)_OI)w5epP%(d^UMCJucr?44=`80jY*Jf^?^Q4HFPaYG@L)$<9+eO?wi~Zu$wdLMJpb|D5=%+>w&q-ZU-R;24lAuj`Xvt6e}i1 zn2M6!gcmhGzF0|Gsk7Q|X>PM@o99UBXd^9?Vncpw6q>q6d%x_lfasgXRM90R+YO2j* z$X25X35dG8 z9Q*wLY>lX74AB-13xVy->KbT^~u)3n!47E zXe|s4IO~`ODrz86zay9an)~HQXAX5iM2QxaDFKQcmN^PCQ%A+*(2QwtqDQ z(7oVx;+|DNkY+Pkf5$I85-+ryv+3D>Z<9|3rsL_tUBAn3f3+q9U6U&X#yCkbwz3_A zM2fA^il8e6LKPvQSOo$s>whc>*h;H*%S{o1cIE6rEpB1gn+O(}2=a?Jvfq^Yl9^Ni z-(CeSoSi@a^#GDWzJncFf<0W=J?P1C&}nyL%5kuaYx{D{zuir$8FzRgf~C!J_kvhY zh~_2X+#+o4jQSlwB?%eeX8O|_=v?}lM7=74unn@{1kLy}# ztxJf)y3-pV`)+^tnL7QZ%K4vb=D-s`-pzUiAXhS_|oix3zarKa8+#$*ZW+fHdX@6A_>8t>NVM*?GS!uNY@UMNhM@oN^ zSCA``1;wPvR=c&e_1J#vKBQ;4y#dPP)Iq!EI%3K#)Rf)u;_EwOimQjO%v)^g zq+EBvpb=p_HuKqOkPuq}q#ARC8`YtwkJ!IV*vgmnUw-RrYs5hO3t@Q)^C@W&qjmHE zc3bKK9LJnH#ca~f=s5ZlVP%18;2Zxj7vjO(6U3c(I~xv5$m&^*G0dZcbo5iCK!M1Z z_<{e4{R_ted7G1VEokNoq;}BRq60YzPdo%A!R?p$HV{IS0aG(^9Wl zIZfwL31V^FbR>HdxZpQydg&S);G^NHwO+&Wy8wIk+ba~amXAWoHl(VeGd1JVh6X0k~Zz7d>n2UdyZ1 z8oQl8d(U5erR0v&AA%!j>c~No$U{!$mn|OCcTW@3fQ=W9Cf=I zQCD4%g9|k!L|>aZ*Zr_yA5OUkK=()w!znmTD>$W!zmLsXwAjuAc;X(|3E)7H zP!u!s4HM~~NZ5oDcPh62V?{keuZ!YGjGW8%>qCJ%#se)M2u$SV0y6}l{Xy#F9%_g~ zMLuEM&Du!R*Q_`aticMCwd&SmD5pTv}a?gvqq<={K&61tTt&tR-xN(=v z#xUe#22{Ut1wlT#2^@fn&-%OCfMs`^gmbo^9&Cht9Z7GdfXpC#P!hCpUO82NH!z$( zS{JKd&Q|SbO%;jKO#td#V0$s^DjDJ(l7lMo%IdT%(&ekEGhBcJ0(>Z<3|=dw1_vJ| zBnSc_D!3$Ru`CojKFZa&B+uRkNT_tQ3@*2A`ZCqPUnFIAmu6$>`nn!ol_q_8nz(fS`&`n9I{n~TA6j~ zYx@NP58Quht2E(&1YlxR;C5I|d4T7FO&oidYY6oG z1(Yr<=MWynmuon1=?a(`+w&id(9>h3H!DxPc$Fj6MOW?#612yqr2Q0(f_j@{XRi27KulF0Bi;O zoi_?7k=C}qA)$XxgDg~YU{6l6Opct_11+x*nT9~`vgHoW6uey_Hfq}_+okEBhPXJE zs>O?cY(ncVoR%2z!HmngndirL{T*awYCn`0qBupN(H?c=%^>hEGIo+dhA9lHKnU?5 zCDy3~72dMW4))pAu-Y1K_SZ7XRUo*V{u*FvK#8{LrDU*rAdIqjGH+)vswqE=m}huC z_)nTVQ(9RcIWD||W_>eHW-fOr&X8R5fk5?a98{Bp24~EAs&_W*-sM;+8henwlk0C* zG7IQdEFj4KOZtz%0L=%Lp_B$8p=?^cL;Z(drciBWR|; zKb3d(muACY5gDT{Jw2B;*4B=({zUq56$;M*G7by$KrmsL9v(j^DGO@Ud@Pef7?Z8~ ziK^k01>0;@lM%)VCK6BpDDxT5U6>$`R$k?Ysp|*<5bNvg@>ZO@h)SLmx&v78p2;7lsqBGf$byqH#+x>oV?sWAlVbFa0 zSkpc~Yt8+u1L>W{D#Y^ ze5x&|t_X5TuS^0P+fAV0k@5E!3&RkZtC&G6!S2#RJ^a<`ySAKmMr3OCX2^)M@SI@I;5^Pe&d&ld zY*l>2zqBs8`U|_YDRBAPGgzwwas$9!G#D{O1m7%T+OMys;)_3K>UrUJ?Yvn{6UkwRuV_iJs6Fpy*c;Oh zi9HQt-cTyqO0QxGG^VI`!$1$MJrRk*oF^!+hh2=YTpA;$FH!whaJHlo_cE^%M9@}uY-ND2! zcu+s{G`7^ee& zcY?{kH+-5>z(+pAEtn8-9&CDk2Icy&l636^0rWan0dAYtKXQ}Z(_f3rsE*ZNm&x$g z8>DV3d^WqF3p02hwq<2~oT`y}A849rLu{}3*lGTAhnlN-z>{7LN^RU z&5Wh2cQ9|Ie2-ru11aDsFHjV?nm#)FsrxGnzR3b&uXxelUpI|uP*p}r?uMv&dZ^Kh zN8K)p(I6CV&{9s8Rv5bPFXk6^0MdC_=)5N%ij}*bN{hWIvH_ItPV;~Ca?JtS91naI zHB3PFuAgS;S;x*fDSJFeFN>(Le}MJSog7(m{VY>lyt!L zFb0G~P__T19A+3vK>W{@(f@)(Hy3kbdr4zcH%Axm|F=ElA1QVM{vT4DNZ_~8?Wi{| za~^H+OJB%Qq)Z8tmKGIDqJ@=tZ2r7%je#}TJz9NbhJD=W$ zSzhM&_$aW5kd>6yhbs91Gk}(jc-JL96#_mF)0BHs+#$Ui=7OFB{CwRZTv(Ph_uLmh zhuPLkW?bHGIZN`9&-jA~<0(5OFAZD!uLz$Xxs5N71gyYZUGR7kLBw!{7)WlDq4F~5 z&jBz@<$nH!UP{0m&Vy*i66d9-$H8O{*Eu~OX3i2Q`zaz z@DuVep(}Vf57k@%?xfj}T5^+s#pvPY*?m;g0a7sPWrz-EyCmfyD22%uf(Jw1rSvVA zg`dmAK+5by&5xwVB-d=#A&=jrXI!)SLe;JI{{X|r@22^f>+C@^hHrI<>r(;&d?qVB zAAqaeiDeY6uC{^YKofSJA=n80Z9|gQg4ka|pHKa0Qp^S@sO;#?1|B$ylI><8sxT8A zglL~uzL{K7SUIjN2nBI^s+lUA9d~QH;-?nk#KBzbQs0{_kOQ>4j4vHH9Ujdh3jEhz zj~~u2e|P57&)0GO0^gysgd2G6st=pio%8!P6b!{UdEY(QLvRXS??y(+>hA+~7UOXm zfhup3Whn=6m)PU~!#b-0{NMUCCFmb(dxFLUl5|f6`oSYiUihO>CJ^Q~2SCPqEPvkp z3(_SM1YUr#kyO*pm0aFwcT%?;I^G&a1xwL^zPy1WbKo-4+ggX z${sH=GBD2bBghJe0`Bye5*glloH7aASfTgWGaW!lIBmUafRZnScpl3N`kqZNl~wjT zmI$J3jx%B7kVN(cXo3l7E;X6M8Qwn<1kUhx`Lo2cf>V#h1;kJeaV+nA_z4oM-Rz6| z8*~V^evN^R@jr)l820aC1~RJIB2kL1lfJ9tSJ9AxGK6 zAP2(D5a$^%nT0SR3nqv zAK?z>Z)So__cnn!x{EfYs{e9y@2CNQzPd9g zawHT#TmtvP-qN7OoRYUmaGOF6GrvxHjbYD#B>2bG8AyWbDc1az z{tdf0j}4QMe1Cr-nq1mBIQH6ieY`Y3cz<|&Z)c752L|afgq0)y45Fhb(Ev!gEyx|5 z_kHX~EDbulu$+c{`wdeAf&ORJ@>!#?$*kr&X;rc?&7hFDWtD0kxGst{;t7M~RDN*t zx31p4(dfMSGTbzRuP*!1$ST1*uzw)0WS3SBIPVeg_w(8+9&}xeOifgZoAo`M&>;N4 zf5a&Qy}{d0L>!1*-bZwS90F|9GZQzyE#1Xig2Zv6gAco_%mb5jc`bR*_#oq1HrrE! z@XUliGSlp!LXJ0MMZbHJJC~)D+H=q$pco_h!mj5$=oB^=Ku6sv=r(bw1I#}*nwYk9 zvkWU(L)(H_`EOru@FC=*Q;P?wDIrb`?1&WGuY;&ERu0+$L-R_B~m`Vw{*RH=fvVJ8Ksax`j+`&YT?0kR8E zwMX)^BQ+KR>|hu+I)-M6WS3fc{l7X%d61XSFca0QW1Nuj3$G_FFagRWGgt&3X^cQC zDDnWPV#x`k#9Qog8ucO*^s$KW|yt%gXKnvmd}&z7BNPJN5_Qp;4e z9gHiLV7H{|DzxX5IweYZ(}L(GA~OtldS68sX^t^P_Kyvi(rp}^^GXyTQL?6mxk9zf zs8$28_;y^6H6KcyS)?f-s#Vd6bfuzEp2sCOt919&!&8GR0sIzGsSNa2Fb!r`Ouy{i zZv~=G1()!~;P&B304!-*Fi(iWf)6}`LbOVL@@FXod6cr3iy;mf_yqSz(v7sL1L8j< zR)SMb3*DP^jwI*5^Q^OKsL8U@)YEC0@L&u~1ij5zRV|tRnSg#ZodB1xrA6b%u8*7~ zZ?`gWi-J`X0JMm~ln8gvmCN4s<+e5q7NRlg;?vXc{P-lQ6EzQvkq8eS4J6M7H=Yj^ z^+CD0^kVZ#(QV*}JDTn2hm`H@coDK%@Nt47p^&3!vhZxTzefPW2A1GPq*4{?uND zDK+uIeaSYrt@0>q*%Qu+;sx@V5Ti~jZ@XzH6vF}VuiT)Oo+vu?lT3t!Z zQ?+rG3-I*KAlm4jq4*QP&&SvH-fiTrDU#|A4?4c;W?fJ$T0rvTX=jrdo$zU&MN_D|aVyz#_SzfFV zDr~r3H$ujmC>szm{S&1N%oPMP$@vfqJaMHT2Y|jtoe{Eg1}`{NI*u*S2xm0v_`44p6Zm_HL z&>2@+snUw?-2?Z9E^<)6uW}G;(oK(o7N6->81UeESSZ_-^54vf*~ClZ&ev_yaQa(* zl>>$#*t4d`fu-_1(5S7~@FQ2;YW4#RHN}E((+suhBWj zf>W%>wJr9HR7Nqg7MC$ZW2S_8CezbE$M%$#$QT4JM~a;cHgt9d2YTuJbtLzsn2PSZoGSa_%0A8^lz^on#mAGeo@Q~;cSnk8ic%iFxg~SF>*y)mmqIVR zf@6{G*t%ilviv%SUiO%c+awoz2~KZecg~7&tl0Oa{B>TFS zyev`wv z-NXC($=>7gzbj|8yqL>Kn?^qStoseunAZbS^NQYUQ0tABJhUdXI4=yE?mdNPGd>T6 z(|5~satR)k>_w*jzg&Z66DuYE?ytp1ORJ{drY#+%zHHGHCMC0(tp;B(yy1oPDo?o)U$9kyPHng;VhCtRJ!HiPj=+_df zpk=l4botmzM5U)XCUIHtv&;f9t|@~SoypGu_(jDwnj{JYW}@et7A3N>j;p&RR2NE#RT#YlTwl1<-)R zl2%!qG3fQr+%d~(w~j3HMR9rgV&Pd=8beu15&rs>Exy&wWCV}3h$0H20LB37>;NjC z)jtosmM=n2<)HsfG^KR(~XFk!n4(e6|TsXxkzZzNHW~@$N4M~1jER^ zc>9D=Q`;`<;qkOfz4adKP+bq~(Om7ko7l&RZRDRaGpo(O z?d(sGP-7&88gs%u5;=X1PN65}v_?2%|)Oy%VGciuc81*UmG|E+w%sY^16jIoabPt#xx`d%X_Oj+RfN5NL@h-ES3$ z{6{on3(J&C%(pf93%;p6AcR7O_j)VZz8GO^F0>EnwSH74=G`3Pd}LvI2i{yV4EQxL~wON;GsFfo@_e&nQ?l9Q|Og?m3(l9BGdd-$I!=Io9} z2?s{f-<(7m#Xsiny_yhyS1c*Z#ht?aNnRjUdiz{0fh!)%*nFw4y^SDp24(+~x zGtbE;O&WG$Vh3p+=(U&#%X=tsM)jJ=?RzT|5nmg-NB~%aHBPc2G)}onndYh)28x*v z1W*;DY)fvC`z|FSV3XsV=N7fduKhv02kcRl+N74Z1`kXLjEN0wwEJdG>XOaY94FG} z2*%0zV#QoAJ|rq;(KPG+PZgWo6+1HsA*lh;FJJj4AJhb%?WTq8pvSsv0G)GUgb8bk zTMeE7U^^X4->Wws&}(|OfB~{lg!Vb9m$kAyZaD5O_6`>43q5|ekt+KXv=>9*YH=Ms zPZL(c5G?mERC*N75~~7Ct&v+TbdWk-@#ol*@TBL|H}Xic;@lg5Fj4a15*R(s>NBe0 zzo5!ZFcZ2Cj)nHEtb~ZS*xZ;24Crd??UI6kQjvi7`q*3OQ?5!%8~}Urf|;-|Y8&s9 z{+|!UEQ8<{F3EFWuIY;WCzcDR+Wv`vlknB|ZRtNK z#PXtPlfg*Q{Mx;iP!ca7RQjx#Kg&JxsXjdpL~xVZkWif@Bw4 zkJwzGm^~l1UbUkRy-iQcrk4>k=dYiOy$w(zp&~;yCA%%s{TOIIJ^{?mr^`5Y;)-Ks z53`+zD=K-P2tX8q0HRRf!$By3;~BRd(&YLl_V-m_I;#}de^6*lowc~w7(Xxn%<2Y$ zd&KF)1*#@V5Rs>94FPJp6ep~phROLP<;Wh9EFQ%e))#TTb6K*qxd=MzZu%bz^+tc% zFQr^n&(u!+2ZiizeQxk2fGDJoP+Jlu|B);nGXe*~fM|6T2-wwqK@q)M(hTw1Gsq9j zhoDNS%ONTzB)YP}3KrXlk$<3v>z|$z$!Y^>;rOE(SwSedi(}QV2bN~qCgfS_n9Tlp zP8hr5Y}Y}V9k|{U%fwoj)DknhyX>EoJ8a{wI%ZKF13}2$%bYqL3s5$m#v-s;X5=BV zmvkngS`fq>0PKP}+WyqM^{eFvr<~VvIyhsP?mt|$ogy}<)SLU=v1ucsYhyfF&X8rP zjk1m;#w&978yw4%Aq7@V%^Kqh8haRZa#t;0d8&ogp3y#3?oLu9ii;0BHm;a1MfDk%ozJ+AV+Q|rx$gCYch*J_HX!k&T=n2I}e?9)~Kqr*H9@h z=~;f_hlF4*SpCKuPL=J=(ovxqFBz%9&N@|-}ubG$v)rRX2Bsw*yHXWz(Hg@S;IUoaR zMGje6CZrE&whY`=)LOQwPu3OXE}xM6hk?RgfDCk$t+oMVpdx?tcH=2?`M6>aqXaY2 zYyX&=0+5P_!4#F?rWe@soExIC4@?v>KruBY>+sTW&CqB<6FO+D-x0=3(*NO7 z?g24y_un@j5;r#rwRRm+O>8ACM-GU25*)AV)LNZz=KM;{17#~B)m$AiK{!hpV_6@G zUlxrjGo>Qi=&+Tj-<6-+UJz#h#PP(NF<}XD>A%&2N#(-Y($^b8;wDu!6Do5PmKo}n zDt7FzjOq<2RO&d9mIzJDBkOKxKa4ZPc^5Pm;l})jX=*_tB-cnfZNE2fCPqG|;`v5p z5^xhvBb7irI=)LIXzK{CwHl^sfz3zttEJtZil8-+j6RhFveG$CUGq>p7r9gT7` zi>%N=q@P)>#$96YFGu#pUEDBfBM+thgyac?hnH_nJH=Sa!@!V8Osb80MwH#OniNbJ zkD+Bx*t4^(LKyn8W~rITiQu9^>q)83Kj;c_kEN&jP1wJL`XbfpQ6iDe(4~{4<$ZDA z#KHy~=f|Mj#lTD^_mqnPJTdO{igTA!B^BS=(sGn-OUzaBPt?7Yf9qf-bKPf*fpM=) z5`B;njHb{sVWE`ClbXdCV@#J=7cm0{E54BxHU_Ej2+Z zN6XLN$*yX`?!jdnh(Tz0mdHa$soZaRRb-|@kEA4K_9x!(lL5;^3CQYAnXH`g;##v@ zNg)Yb=pN3Ze>BV)0V1FE`h3iKHJePaSgW5tK$K#9XOjhOP^U2<+H!R2^pioTsQ-G> zG%(O#{=E(TO*zei;vy1OYgR9`5&bA#Y5)nI2bf=sPwD4lwNj!B{4~YxM<3)QhO>RV z1yUAS(I}0x66u6=zTHh0##j-h5W|fC;1YTR_5Es0K~azZMD%bO=9#{eHH;MnJfE$v z&TYNEo(JcIIecz@-25uKn)>R0bAW-kv~O5M|&Stotv;TrNPI0}5#!5wu&o3#)Y|5&9C&ez-!@;XgPgQ#IayzCvD^$?dCt|2d`PoX+K)E^B+L-N|1 zLLm){{8#pea`&Qaj9JM1oQYDk%9>W1EPnvi)c8oZ%~(0*Yj*lR|KX*61Sx3I)q)aL zq2nmyQ?6XfH@yrdtVlxSVn}i|*}woQjb|+aSO{!DuVFXInY<=0!aZf1@1PzBIw-+! zkU@|~-f&qgGeoeNAn}*7KkNW$xioUPGUG`j1cv5#Il%^FzS7%wh;fzz&kwybY5FOE zN3vfEqJYY;4_McN_HbQVsuxc$+2Mfe2t=5h&j`XeB?opafozfzM5OKjZ&SA$%5N*K zULPlb!FMGKBx`*s6_Z#hexdXpb=%7pg|)^tI@V^rXHN;K0+)jcI+V;AYij+GU*oZ{ z_C+r~BA}QgpKd+Mfd6QoojqGO7A0e&QJ7)+0HUcJ@pXbb9r#CyBPSXk#gwpbUkE>B3 z;m}P_{i-Yb)uC2+3ckFuMt*HXkIq7Lgm1uykI%n;oF4|RPC(YB!Wn_760|Id|@PRR$w#z zYA*xE+cx=HP>y_cEH9vw7l=*4{ClwFAo15?WU!oP8h|?z>oU&`m_y@ruaf6ML4Zi* zgD<_}DoMqtgHn!t#IxYZT3-mo7xyc<+r}Qv>)C%cqWTv`!w&Bqh|!SY@RN9pR;^(2 zw+UAW`ng~XS`ExEriVCa_L9(~O91Cg6nOIVj}xS~ep;;v@B_M~`u$y@Om1lrMju_2 zeVSH0yIbxeGXc%KrXA{lJWebYDWEB328eknw89SyFb$}5w-=uzsqVJXPVh^K-1FN* zv?NQj{ap6a^NV1UV(?qGhU=LsJP0YuFn20bdQ&iJLYzb}bc|+d&+}-2H-Zyu7TQq| z=R9!u2cjWC^Yd6)6%$v%@UGV+r^Y+kptTeX6(azL-Hgq=$2P${QT6OMw&OeQ9E_)V z(EW%Apfen)y_~P|17hn!{M8_L3}00feduk=o(u7GGFTjfj1z`mDC58(YNfJELkFWq z$L9g(-TwEV(3dUdo{ndqj+!0v3!0t39UU=ST}UaFS~|;lSBY>jtFNtUBfC8CE#!_P zQU4J1vi!?Q?hY-Iz&Z4OZIBoK(3Zppf=qg2-n^^Y%={jEo z_=T`vhe?71^r|GCrqC4a9A+Fxr->xt5r#oOf}fI|(b$Y@bLNdUDFycEq$cnh@&XDPh`qvt1h6jja>}~HI)z8M^ZGg)rNCNqn?4HM9 zv%LHnL1Xdmq6H>LZx2uKtsc?9Ws?a&ICIdyrcEScck7e}b>Sh^2)PW26cT{TCgX>y zWmmYPtepl>Y=)nu-{ePnJ3}_$!&x8iGJwoS&1?}e+yPJ_A}yrmLARrod@z3#Qs-XD zbM7(!NYLE?997)z*dGx|8Kwbu-5Os*T-zj(6heM7_$<*En9Btt*q6d#46>;7XxRFQ-|gCRSugo0_B>2DF5ou&p+8)05aR`Y zaC@4Gh!l7`D?#%YCyY!#q)2B~s*|r~kj?N!#517+8dW-l5`KNs!F`5YEd@!7_*9!G z<|mp%-@rxF2J{0T-5Zp#=vReMeHT#B_S_9HrRf?|6IU5WmCaej>IT zH#!KzGT70(tld$`v5LJ}PWmCC#`+Z8qfQzV7x5@pPTPO4MECpB-sL;OV*`7$(#}y0 zEyzqu8>lqvP0bUSf=}@JOSBnu{P)c|Ekc2(=Ec;xYM!*X0#G5eIuIip9|F%kFp+T4 zBwV8!(MtgZ_pN+$32!UYE17$c_V+%&$>bD8^bi9_+`4*l8baH}XbI=>S3B~4wc1)h zO8I8LwZ9NnErh%V>6$kk^WRLOMmY=D@~XRL{;6?Pd`}D}N4M-Mmr$PS58>Du4M`&zaaAPR;XR>8`D5<)TyXO zO0!({OXKB=vo-AWV%w&Q<1ak+rb&C{TFH=427yMk0%%;L2nOzxd!0k@g;^k$0|k_{ zcwO{MVZ&luahz)74s_kVg3+wLw9c8(@dVKO@nC@5M`_#Z&+tKUGIiRvM)vMbRy|oi z?w||2g8ElgeFab1jV|h|d4yyasf#>UPh_JFs4sBx`Gg-*K}1P3q?prdj$G*mt^uUi=D4tRL_5$x{*oQk#q(1w5X(CTj`%#VT#@%?B| zM1)wRjem&mGSfJUE zZW(QcaVJu2&2TnmfgarjNBSf`XN9;UvYKdBO|MOHxrCt``|eUK)KLNiKkiYPi4qnB z01EQeCWKD4KUP-x!S=S07l^U^XTN)Qj%XEz_sc&8kV1>Kx@bcz{1r<}Tztb)lyJZ! z|A=jE0*;Qub60^^4(kX%aV**TlCgt6cajv6jDj4c<&$R|ZT?}pW9-ZI6QaW+Yo4UU zOQ_bb&H`IrDP`XQNA;CTFV@V%KBuCm1z@=`xLGDdElh7zBx2Kc{wBsiYfwg8q@DxE zHTapBzm`7zF8x?6jix1onkxKf9m}kkz9&@79HU(CR2_;aOmJ?wQF09}$Wgn@;W8-j zu>DJG>-8H+^9rRgZUmKpWh*H*?^)sv>KK*4!ZQs^_pcf@?e;+}5?)Vn&=seQI6&Wo zAEiOeq9E&MgLael7WRzJn(mIzA0}9%XuM=@!)p)Q47Y(^%&PaIPp%Xr>+P|ih7gwX z(7YMTYd`MMPaG8k)u>Mm0t~8kF5G1#&Pm-xd1E@}n2iKPwub!9+3n?g$ zC)L^FCNG~T@}U{1=r+Dx`K*$s!MtQ|{Tx%Y$c~JGi$64WhaBr_F?z4990ACKzvv&7 zfwcS9wDQC0av<&A0%%AT8f{FYh~!eYIfdF;9XgE?X$G6D||e|1%d7 zsCfI&T!>Y;gD}SP=L0o(E;NO`berx!uzPwS?EXyfAJ}~j5k0J-OEwkVCBm76-kyEe zuC2o9L8FVOyZmJXDd4+ctj=Qm{0u~lMcgjy!+!qCsk(P|ePT+kV-;aV+F#suZBF9X zj@0uEL=id)^&i}QS)OkPLl`*1P*9Zq@F+MlMR7&g@jt$+6iMn z(4t{<8{#{~H31|hLng;1FUF%&MlS-+V%zp~(?Qp!4U3--gf5AF1to zzb**a`0RF*Pq}8R828+g31zZaHnp`VUaF4-6+`OvekZF+dL&?!DXqU#s}+naGB2PH zL3|m$W}U(V=b9!|ikOORUUn-mBg$vuD%e!t#_d(f2yXkFls4^KkJBB_XZbPu> zATTg6|IB=(5(k6*_psi-VtW5KpQo}h478?Ia+e zAP3AdBLpkp;9kmjd@MXZ(x5P(gp%IU#*7_tXnlE=G<7vRuyVH_CrkkzVld4EKxL?e z?laD7PzYPHz)>jam~R`OKd;&5OZ|I(I4ySD@GQz z9xH86S}Z(_8b;=yIWz{)7$?p%{b=5A&wgPfJUzAVvfOCvHHRqo9Sf5}`Ic{^jh|m= z5L~3QC78V6W##}9Xz?cp19+dCq%Xcg% zBeD=$RL77+u*C%(=7d6MODc*j4FW_cu8@<`tBd5GXQ=$J%NYm95W~H~QoI8BZ9^1P%>vg9 zm&$rQ+Kf^Q$TJnl_%Me+uVqDQSbjUQ!Cfd+GPNMs|L{u`#z6ROXm*~->8O*o7n5Iq zFq@4xZ4f_UCoIa8OT`G_&( z21=+A7HClg z{p2ysg2pxl7IU}7R`hdiV0EBp?}of}!7zhNZNq6)@GCxpU;P3|cA&)gcraKEe1XIw z6p+94Pm}lHQa0KT0$=H!fXlAk@6{rmUKX!-F#Z^tnaPT)cv4v69q2vgr?NSW76+ie zX$u2z)FdssRJVpdOC)DOMoy-3F~>7Yk)~OVBv1xALQTkB+)}A9L)3jjV1XVL!armO z_H7ZY01^H;B!(3ohA7UQj&3Z^&7dv3d&Vu$IOfXLC9F+!=2p`PJ^hP6?k9)TOe7Kq z1Fs``&igoj0N;E=TS4E&>t|kt>qE6kIRXCXTj-$QHcNyY*+SPWMVKRX$ys@DrgztL za8a{ChOnF&D0gs979{JwnKM~3RHczEBC((Q)^%3xhGT)IDb9O${!0I`QBli z$xSKD^~89ucd5N3YlR|Xmll-gLa#VYHcEP7(typ$|F}u&5ZqG&vDf`Qz9?t~Bq29~ z_}hTCa)VsgS;IJapEd|h#{Z?Cs#C@2k%=9E z@fZxfbCWO0$@(xh$dY60tJYTM>k44S@Y5aTQ4jZnL$B1_hPlx_fub|cBl0Pqn)tkM znoSGnTxQ*F`L<~~j&b>Waas4L$p`O)BBvPm*d8=&8lu6Eo=}!R5q2+`gBTBQd zkW9Zr)l~kT+WZ=am(QY~i@PMlPoFpUt1ZG1f{NfMkQw;VLa|KwlYx{bu|aJ+#U_kp z^g51&K!RGKI4Ryqg;fO4LM}iB<+Ex^KD#)nu)=aIwX4}b( z?0pMXH0i-O-oQkFg^U#nu(!+}8+OQ|5#X?PV*bs{pR%*Hv;t8h>+>&TzS62f)nXuhQS=v=d! zOE)R^-lZYJ zj@R=8RA;V^$o&AAmhw~Rxq?G`m>OjT0kj=-aFQg}-1Tj_X^+9-STQ{~yRGxem_%#y zXI>GHvE-!KIsr?p0mf`b$LSNox)OEEfh_N8-*II%q6_=~c#Q$SxU%y{b1g;AESuCj zO9u1P;jvek@M(Auz`*y)_OT<9P|&})TKo!i*;hn(1SJMovJ(xSXeFJSKd%OvN**TD z_BIK>MyFX_O>|+tb$J#K>=$fB6tsyg)-ev^_eC4s>d;>vo;Xz`ygtGCH? zwM5qau_|lCm_&j>`h9D8eEV+3ox*c?TO|$ehc4ocAA*cwX_N>t5|c?!`I~=5F6?uF z<(`=mP2Lg!S&#q$SxwCW#p=haGW<6>P11HW(ru;8Ye^5O#}!FTaTtHd_Xg9@VAn~> zI8aQKMD0*JK?;+A4(4I7lg`q3LWb{DP$U#vJxkB1c zhynb7;kGoQAmo!H>9~fp5Q(&HDR0DgBDgrBOvHY`Gb-5pLQ#tL!~^eqDAQ@!V6;4v z53^2KZp*RCeIRI}N=l6IryM!dPi;6&SDE-D*oqlreE|yI;*e3SdRS1M#p1*GZj*Gn zv~!0QbHQSeYokcMFv@FJ?9;o*gz-bCQRIPMF^7Xw>`VA5YK?FkxOC0mwf-@`CoHXD zI88zTH98l|>?_=-EDxTB7Xxe?FdQ9>A&W!akCkU-JT2U9$~iiJr)jssB(}Qt(ds98 zJiOc0HI6tWd{g#L-q})Xd=BigyFzuE@jx(-@SyOMe(|1LR_4dZ2>Z^*^UW4J?&9a* zZ#~;uW}AAK8twLaG2)@ODqf(Mz*o% zW_(e0-$={M2@t-Uofs9xlS}2qkeY|*Ui#70((M@hU5wC*ZBP~qRh8(v%BF}@#-9Xc{17mYyAmoyXN>#paF%=(Tt#VWvacuC zS$oSdJ<_^rijgqy^TTK8fZS47`j0Ni4UC(!A2P2l7Bw+lxuw- zUrR2dL&6zm<+9bx=~U(cz0$^v5W{=t7_HSOJYTz_*}IEJa2yWwK;M^*SkIcRUk0e zsYMdc&@23K!_|7X8k{j=6D7p52K@ce#I+_j=^dB*xmk4ClpVR^T5NDO_UCj>@XUQ? zJH-GZ!@H`4GC>rcrborFUEoRu5@R@_N8K=2z^``aBna|lwFC*n6nIsn^L#bzTY!ek z7SO!D?+YBc=?mnW_0If5SNkmJ*SvGm0J)I&rE066yjO@VuQqP%f-&>+noI%kt*+r# z@Sm$F2 zW5yl>is+#9bHCKJZY9@a>yA1EJ;)x+C*)rP`LU1-n#dELgl{iBJWONtvvu8|0lGN} z9zhdu&L5x8dz~_tTW$accYxlLsiQH^W9Bd-HVnpuVu;iv$qN64k}!A?1#~rU&PtkHd+g&Tl@ytW@8QB@R6*(k&&kaTd&hpEei#&<2noiYCaO3m(cW|i=+8+L zhO|8aY=+Ss+u`>?(kA@BlqF6bJw0LxY4Cy6FCjyw9yx5=1Z+=8kAUrjg-`!;4)<*= zP?Ksbp@-A=8Y?cFIeS!Ef{Ir|=G`REqbjlQJsR5kB72aslGWN*&=wClij?2W!&}~@ z9XSL{vZV(D7l);MQx}!0+8O(?F$+)5xjPD7{JPx^a8PLl%uTlQ1!Rkekku+V-A_B- zs7Su;D~Mi~iWO;#>H?rLX{FJRE!FM{3xP9ri}|tp8Gsi>2@jh*`t=cWQyP90dDUNV zakkQg?>W{YuBsGv)=@Kw7JbF+*vEf=Cml7aE3Gr5AE6#m_uHoh^p65R$ zd!#llSD?yC)CyBHj(%(=3=eg{WAQWHAAd$zpl0I4b8@g>C_4XwcEffNY@FpK*eeIb zBsIKR&L*Nbcbyqck3fu<6HmP+Y6_Pt=*(%t9VE`?ezbV^E@Fou(2GCtdu)|tsY z4$CQBBpu+8yIW8k{n}C)dbXDBYNzSPo_s<5VXYC18YXg7F_X}0JP8;-nBQTYC5Rtl z5V*YZ0V!xAD6Gj=DP%S*6Nw##*dB{}hQjzhe!V41V+)>Q-i4zTAIT-2I$b)iWodXB z8>ZA)g@#!QV_pt}3Bymi!~`bAT**$lx4ipLLu5b-(I5p(JyHejg9|k4w<{H_KSHke z8mWcWJW0NvvK*6j)*Ru%Eqt$M8fn1$AOWEO!wm2~Xu*;!bO9b>u{!ay^tnx;1$Jx0 zisKL4cBh}5pgq5Qxkc#7w8KtiGJ4Y-+hb$MVtLZEce?K2wp|hv;mFCDA^Ny+K6IVp z%>p2NUnfR;Vv~n#UZ`M6$!H9?iEbtDS3;myhfz7WR;T)j|@S$iCD>KpLWE%+48U zT%eNfhtX5|RnD|O4l}yT0DXONfw)37gB>8>1C(~y>F+J%CIu;mlztsHUWN>6vax=y z*WdozW*j+VQ_Vg7zDJ{q=Ee2{Xszoh9a}bb!J%gk{L^do?;6XX#P+$Y!OBCz+Xu!WEf6=CeYrYZ*3A;b0PxO(1f*BEy`WElB|| zh<1XZi@4t#VY5G8x=$Z_$vMhx@&^}EwV`RM_5s-}Wv(2u{!fj^Rnrb^!DH+;k6d1i z%&gi*4fYIV_r$MazwD20mk-!mI9AFt%>~*CC`r*xgXj+WLLMrS9pGQ3k|AK~bR8SY z^Nu{7E?1VRYWx`Rv@GnKa_K`>S!@6j8p?FvTI3vv2wUp z8>$qzvX)|ZXjGm9mSQ(oCBJJRE7k0%#SG*>H0JM;a&^lyALYy8k{ea2fq^!--0Ua5;?`tSwR zC5GHYW(#l@+tQ|NA~yCMm@BTG+dOH&pd9o#vBZtNcp7(Nxd@)AL+2(l@PCwyL?A-_ z`9bEylI#~hs>W$Ji>nq`r1b+(wOd?z!&Yo5vT*=x|Lc~8Yz$o0tW3@6GI`QBya?M( zHg=o+qT$l4xoz^>O@Rheh`)v_?|L-li58AK25Ud;+=0TOWmuz7-WW6ofv*6Fw4Jkot_75UH&eoC=!) zOtDG~7vu+DBt`tMFwfErwyWCA?4MyjY1_mmgePB?IQsTMgTZ}Xq0-&X2LSz7#Dl|Y zMiC=y-`2JUA;j5Pu61|-TP#8AA*AiDK{CZ7p(S++8&(kY6pC1-Md$NiLJ@!?cP|(-OgAf;S`3Zgi|Ic$QEJ`Nw)BllU5 zI-Z*WrO}XW89q-zXSG^ck3RL$=m4TQDFRQrDjPDmE<7Wns|9d?%K3xFy*1%3_JE)w zDYkG!r+8t-yIIzKrb=?;gu^CnjY@a5>Adxqp*+;7nAn@{Wb5&B_m1*1@!71%w`Ro+ zx?0gM&r$y+D%4y&6OH=SPBYB%Z|fb}LjATlBC7dF^OwC-CjH9I&F0Hzw&w#&+jY^a zxN{q1X}3CaydzhD#08KGAQR}6p(Qg z*I$VY7L^mF*TAd2o78x!rnA{Ni;<%JhU+0t4mVwl?vxgM`DlG}d(2|fsBW48vA84q z_qt@40t1?0B0{TFKRw{`#vR9!!S{zn>yPAAgAt9Oz9ln2o3Tz=PiTblSnI9xn5*B$ zN5bJvR!tiG%3qyg;PE}bqgQ!+^qsi>&vVsbHlA1w_$!vU^z~AG@=|Tp1g|-^P%)m> zxL!tMVEeJRF4(&W$Xow;^DhbLvpz6b2MYpHL;F7@piH9G%YQGm{HF%|Z`FQnJBN*C zjL&U@KIb2QLFx`xt=cK-81Zi7}N@k=t>g&^T?^5o6Lr`pWR{%caF3j^cm!&_q19RVQEZR4|Rso|n~VFmw9-6W0+ zHcFHzh|4(7E(eh+uRCc$WJ8}0V>#b!Xe{eubG17&_zhTV3Dn8HxBNSFGvS>D|Gby6 z<@E1rKXKIMdXfZJ|KCYgaKI6YLfQcVHvL$R?R4iVc@zH`WrdTEW39+uIM-+Ndq2rM zA5jdTC9EoF;G^Zh^*G+#|keZ%ZbSTS0PSy(Od2$FJMP z)V>Bs%=W4Mqg9wA~G&wnHE>3VYa?&#_VN03W z+N*)UqVkrs66cKyoFm74_#Sc+yW|q zl->-jT&M=vZlDxA9iAjAh8ar%sg;9iW^I!ejk?{Yy<{Cu8V z$`=VSs{4IsD^)9Dgr&B#dg}-x&SkL2BU}IKu<)TKh%qqUUzixcNr?+nfCyZ%f@xCu zIAKu|1s7kbdXV3coJs$&f}%Y@1mGHJyxO<_fT;{q`L`78irYJ1f;-9rO2IJiFL0sG zA4I>xnp>kSV6j2r`_Rr-hx>Xg;5QS(*AfAhPHuLcf-%eC}nj8h4miBR- z<==5O8_geD6gezUXr7zj^KG`Y^QnLE8cD^4?QSE4Eu9(NVN4qaY}UH%xPiyo;t=Fe zY>KVuBN;)$n+e){paQyX@!T*%LvQhVdPEQI9JQhU7+G%jSp*DbhnP(n6?jrG60uAf z2G$abN!&vsX%a+zV>)13{Y&QNKWNcUDO8A)+}i+=Bv~f)tMy#?A@SBTjBXv`f&Qst z*1eI10RIY1olak~wDefpiXkCEqh_4WKv+=Et?LW|lL$B!-ZN>~x3k#LAHBXVT%jbNa`O2K=K1NuE+-kHJ?h zMxlu8N6`dg(e%+e4hVV$D(U~xf`7B7191GP%p-XLrXmtCk2MT(>;F#+lABln zKY}dQu@ADIdB$3}k!@SA7QHkiR$+Wp=x?-XuBtRpVx%a|ZqPSoCSwlXKXCVCFe zvp(8WFZtd=u~e4n3e4Jfn3icy%d5Klk%5luActIW-d6Ink#f+FrT$jXy7j#-g0nIVmvCs&?p zCXxjdzD0D_bkCRyEkE@y_~1NS%aD9g3d3-D?nKoz@KVOsEhR9abW|-7ya>mqiFCm~ zKWe?Cd&Mnjv2U%9x>E2U1w{m(dMP|xcF*l0p6HfyYcrO@~MrS-!U{-ZiA~| zRG~izE>t_((To1be(ZZ45mvl|O=adEwfnK5Z%j#RIK;v;#n%yOi(EKWtrq)^HVJDf zRHG+PWjjNm;zPZ7pfi#<3#42B9u}R%S|iR?cFTQwE}b8eJf?I)pBY3Zb6&f{z7O5t zE7ezn1i0!9dZ9Wj*67_@Zla_*TOnQlCx+yHQ@FU-R~na+5GPh{kk}LBOyFDn0JqPf41c2AUMT2eGO0o1-`62faYZBu8(- ze9C9&q3aUoJ?@yDHb(wTfIDo;n&sFLIvmU5XwX;iACb!FdJ*VUYG`A3G**)2qmC7KwcyT2SNUsK6J!AmUq1`R@LSb+}-G#Urc{e zVbqw7XhLXINwDqr9iCUuPw^X@-^t%O%rVKM|9qT^wGCPdHtN7T56IJ=XY zdA(Y8mMS92#Tk>(yr!lDQF;l*)wlZ{6o5|`yDt6(>!(fAaHLEB&@zbaNfn7IZ9EvA zeJDqBr}PWY{gBjq?!@J5C{wP`?(bOqOolY8R5wGF<`Jj+>`2zWpJx4or)B?$ktO|c#h0Y6iEvD4H9$KfI8ew*UioJrpH^jsT4r^yuxjOb+Nfd3`?CBnGWq** z;F)y!<-}lyEGH$se77Vgo_-}t6~JG%HIw|8kXL~K4G{~;V!dfw*L`}hT0n4&T*vfM=zFEC^7o(yKIK=pTEQcrFaXwfrMm%2fV+}n4q3P@5@psc3Uxz)-x~Q&pKLJhoCf`sR^Z=5Ug!!F+6r080kbxz zPY7POx}t&Xoy$6(DMmnV^H8g!b7mIygrFvqQhKH%=msnr_l_U;B{~$h(b|HSt7{834 zq=_ZIunkP>kI%6qz}oH;IYO5G>Y>xGdu*m{c`Fy0kG1x@dv$ww*rt?GucWWo^*WFh z(adRaul0h?Q1B%#`(swt?XlVd=SP&W6+fn$lkV?bkL@W0lc))pYbfgIH$?Rin^Bid z8Ch=((wl2I0mA?lSuX=!!@x>e_ZAE%)cdLT^_^>deq#pGsqF_5=8_W*kTnX*0s(gc z4h;>Sjm}l>M*kYG-r=-Ffq5nMwwI8}`IFaHSFB6h3l#LkTNMVm&d^o9MyQ@d?)Jnj zER>^BA~eL3D9ju{JfuMoWWD7TAm{!~sFHaW@wmpzAc9IL1cIK*cGxSQe0tvW$&-rA zF+aSu4s#9)q(pZ#&Hv65)eZ?YW8oW)Kb?UK2X)kqqvSwYjQd2nL7KT7Hi!jtwB-}+ z>K5K?k^NL}VJUB+QKHxO<9BcS0(zKJX1=^PU@@i(IT>Ai)`A9xf zBNjXX6Y82UORn*c)*76p;42YiDsmR9ol5ql9GDSkQ6*9;pNNQ%=8sL!#y&JdZKgUU z%eiswu_O$D*9%M3E#+~`tvZ$29C?nD*gBsRyawz}5e$R2e_yaf|6&$aSJo9!iygdEScoZ1;HSulyLtuRJAONEc z)Y!oSD}LSYw0&d+B<2wvd_<0=q`(wkFEgF$8vUQfG%A$+FM@SKqGS)9?UzIC}(Mf>0WKJR>I(W8S|DoIbv0)i zU~D#V9v2>V%wB2HcC{ z-E{*?^gm@Y3CNuS&PA~Rv@WMA?YwUFLXL?SCE{JeXT%O(BmopSaUk{SV>d5KPWq^3 z6eqh<1Pgq2joJsLbN2D;ouW_+mKfTs?j149^W}^z2`E)TS)g`x`%aMGA1-axtINjMBSj@Mc&E*vJfuY<%qx_zO_^B z?Y^$-r@xxDP9`JxK_|>X8y*lYiq2x`Nd2!MKL1Z(5WkXMU-pBfctcEA22R(hdxyo2 zTb3quvU*Y_UpZu|T9{&vBr$PU^0$m6aPzt;ihq?gIj%#7`%;*)5Ib`h2%scFo30ls zi>rWup(Y5{1Q7NEhyWFF!}xI?55PHLj}rVNEyxh|{asE)bYINeo(@-XmZrV}1gW_P zKg~GZX_zc`zXzx>^?ssI4*Eb>f2DGDw7JjmYgIU2q)ZKO5yx-!Hh%`)G9{^4b*Rxf ziLyC;*7kDMe4K(Y#w?erP05OSjV&tkoD?Tc<%VfE0gTf+7Zq_+k3-+B{P=inbU(5i z#wUp4_@(pEva4?3%ZFRaehrF38ah;HDh@|#v5mze@Y1n?)6K&QUn8+sfN^AcZNtoC z#vb03e$B?0c)E()bj4aLN6| zbGB$q1GvZft&~d;Y}k4QL#Rij{6Iua-P8NwFDA-~MJ+IVX@C~XhEJ}3*ZT|Hw0IbG z*e$K}J)+7U5y&I6fzV=M_enH0{_Yj4{0Fn);*dMG5Yl+i6mEDxJ-n?T7!!%QIkNOV za;m6^PQm=KD1lY+7~T=J6n3GWJ#i-CaMHN`7+^*%L!@F#9`l3t2Wf(CpEfiYn zM|G-de~}K+oYT_hmrlNy;a*udZ95hC!aFU*KYRMv?Fr5u#wVte1U)VENr6Z4Q;>=Zr!55nAq9;724m$HGtIZNn;zFYmKZn{=%rVZsL?)6Z47tY4Cydt4k@V^xK)X!E8;BvD$7Z4@@<^hO$LDK$x+5`=(>N$ht)>-d%`N4w1XwI# z5Q(H{Keiy?-|L0Q63rU#vcut4_G>b;Z@@^mAC?O*Z)uS4s=5zK|w_9DV0Dc0?Y`vsjXqMCLCU?{tFD zLeOT`V{F&oX>fk|yr%{sb2uA|1u*N^3XUwI9lrll&K|xVG=1dayZvGq>V`RrkUA5w zEKUd^my80gP_cDttU#pehXU7xBc$%Y$9xvdU>1OD!gMgDDJAg!*=bzZ{v!U!&e-cD zX_ORp!fm>tba?+%1mM;I)&JD9iRfcnk95g2eFe&Edc#Mu;>?jG;{dT6F^LOmIdS41 zZkK!nOHYx};BibJhU|r6Pw!U^+(BFYEa+?{S1QLKw(dK349fgp#!Hb=>R+RKO9N4w zclPykIs-JF1uXf*_!)21sn3)CYQ~QVk<)mhblj)3)D;nv5%%+C3=L#ItRiFvnzTz? z0_v5MLVj~=r+}AF=Ku;s%!FJ~D}UlqL+ch!R~o58vnpt|LdZ`c^ERZ1*s!BnF&sG! z{!WFA`OUnA4_91GkbV)z$teCf+abEt<`Iz{bf(!6*;L^fUZJToWnsszVRVyS(x<&q z0I1~G#{K1BB1(XBa{g0ez)4{scP4y!c((&LY{cd+lCkp>h69kd0}bnP#Yfgc;QUap zw&|s*Nyi#C72;O!gO^q<8CT%4BE0o69JcJOEI0SW`lQRY{|8+Py zD$4>pJDc{z1`1#;-9=4Ab0bh?|C`{$hN;0Q1azdHgOl_v-Ia2CKHo~1VkFPus7=}6 z8-)_o=J5@`tYe?nX#SsbjCUxHN6wBh1$QLI^^2&6^BP}^pA8$Zh47&vSA_F=aXyg0 z`s(&tkgY1uFj1-uL>qtpAI9D>IJUR#_Kj`ZwpQ${*tWf5I~{Yywr$(CZLHYFN^?5mp>=(2-Tnb6Ubj@B-Zi`VidFk^ z@$&GIG}>-_+2F4|Ib3VVUuZ>;$5#lIdeA^)6@PAalOvE z9E)X`|+J46a3(D93ahgJ|5OE zhkG>2l%B?TZcpN!B3{T26KJR*u5@loR&7{ndZ{7nXzv1OZ?m&v3n}!Aa?fb*)r*EA z>)2kc=Fs17?uOz|2z$4|nMj*4j&YI<2Wy9KlfzTq7xkVkPBtz1s$WXh%6qa|U_c<< zUJW1AI6@{K@=T29bd)+-40@z4&hl{rm9Qo)^*x!k9as}`utjZ zN256!N)7-?0kq*Qc4Io=$KF7xRMHnffB7afZWMNRrGbvjq>9=*Vpt5D1Yw4(c#TI~ z6=iH%n|y&5MXMhuCMq~I7;coBuF#PXsWLhn&r<-D=5jkWqUdRwr`#62TW;RXY8i4Qr zD1M`Yt%Vb;%K!0S%aO0Jkxv}+EsvBPuFLcx_X|Bb!bW`iuS?E%5B6RTndb-~*q%Bb( z0-(YU8aN?j;YKhoaL|~TTm5vOHBI{5_oKrg>NSyBKIxPcY>d7Q*yF?!@UY(o>?SN4 zSqh651G=PvR{8#YUfE^ApLIbAr6jidl#Rf>XPy`t^muDIA!9y|y_BQ@YT%Lii? zgS}|88*|e|*vpB)_Q(UNTseK(DSp)t01IFW@h#%W=+ zI+zRN{UB4bx>iiJCrl`Y9KDK`^Dx^+eEjiDBvntKhnDN|3$p}F1~9P4?%g&=@H_5h z2=vZ`wTDs>`b`hYlcUNwh6y<5^}z!zd|ZV&LtJEAE< zSa#!Z!fHiVi9LM%16F%sH9fUD;RAYu{T=HS1G zV@#d~W)Pf?6%d4r3-v}4>%_2&V-&oY+5|o>o-Yd}l=TJvb1Wp!_g>0mQdk_Zcu8optK=JJ{Lz{`AZiy+~7Zb~H$V?KrOl!1r7f ziNY=WM=1)*AM<^1#S>d9M&YSvyfe{B)IH(VJD(qu2Ql1SuNEl90MX-k;Ke|DKd&?( z=vV8jU0SNy@m8f*pbRWJs@Go}4xBtLRPfH`|4xm+7`|a*;io~daiqzG^&Z42{IOaKPHjd8tU6c+$1eL_=4z`p&s?hi z>Nhja6SKBPT}%0pw})5##wclj4bS z^@8vz{vt{NI;P#{pMyn=ppybbAV3DIJxG^MfzO=)W438ORfcQ*%h6i>E;6jl^(ftjS`>Ydc?Eo;aX)B2f*jo5~(r)M*b)q(D|*t(<= z%S@YKNGj~R!AHzU#@e-XZ$@k!edoQrJY?E?GIIz4o$vG<#&{RpqYJwV(XRLOST&~m zaLmZqI!3U#gR2u#3NbIGGo%fE@xEC8iR+EPdMWRpSTL~umsiQ%p$E>3e3Kbj8;z~u zwqrKP7cRMc8FHj(Q2vqe$NEGYQ1hQL1Bu5>^MlTE>`F2EzgAC0vvgLNk?s5PHNME~ zEh(V^!(!l$uuBZG>7Z1*^0G7&XRgMKnak-JUaMZz>>N$|J88eO9>?6HOcLKq-AD%H zDEOkATtRBiN&o6YB7WUkuHgr+8pq7kect8*H~-9` zlxKBc*qTU9xsr=EdFnGQhtY&HR;v{}fMiw%+%O3jO}YYk@mF9V5kgl5e*oOvPDQn< zi}KtJVQRH`G$8~Y$@%!dMbKP2(9Fv<>d`U0QjK1qRMcMFn93IV?TFS$N-r;qrAV#C zpTT7!dVdd-`5VJ0<|Nw&l9TLEK(LL5eY--dlA7ZWZa%O~>r)qo1u#<-YdU;d#e15`+F_$f*bbw>ia;gj+1JCB~Zp zOQuj^K0};3pq&-uTG-GUdH@uzI)o zV`>_f=zivyzt~`94#&V#<&`oX3F!yQo-#&o(v@`62{BK?5L&J2khwW~9hC7wfg>D4 z56FE|6veo)6O)qwUQ2i9bI%({uJoUxzBb{ayn_RAQs6qW#o@)h#idpe%qSInsPtNY z6T<%_4b|(HsQz8I{#>zKi&;Qm^y-?p-@jfv^37UCEP@kHs+m10d+!o8w&%TxWWzaM z=wOq-p6Bh7zJFktQkpGsv&`Nu^6*SKI@L|Dd1H`G=K3%e(Jx`9)EpF$>U3gZ7)YwCXrng2nO z`d?^Y>jAhr=-CmFu`VQw34~a^_^Yfexsrlasr==-hGvkdtv@|GPGoDz_{ZRR(&l3q z|6=>bPixmB0JtrG@bvTukY5A1zgbcrp$GR36m{j%_d8p~2bs=tDnr>_x};fQ5X_kW z8zm+D`w9Q}=xDfmt!be2+PON@AM4F4nlOa9fp1SUDrz97T-9;Rc6))JbcqJd0C#^O zSHDHWj~?Q;XZxNuMr|0(QQTFKcize(tgceoTFvF<%(sLAd~2Ajf0|UF_4o1CU-doj zj)3bQTsCf_)2^3EX9lBS{{*I^YE|KW%92){| z7@Y)^SzC6j*=PJ{+MT_&2d z9(pR9=(R_E&(&}vk?k(TyvbyKO4QLbN#M1CJJPv&LNqIGT{ucNtCi5 z`#-FDn&AO%H`kZ`)|3|N?4GatLsyX>G0CgV&6T7(l$bF7kCqi7LqDi&VN+38O4s@T z>G-8wutq|lDcCMGb+(9Seg#`$&;@dCvOaTgA4~yPRflUzs*3IjYUDF&Qvae!sg5;N z2ebvHonyh@eS5wQl89so`Fyut(2KjPR)a?d512tbsD={k@!}X_ksC(&ooktQnR^v+ z7ZV6A-J+|x3m-$AwXVnh%-M~Is{!wGHRyh0tGH6Vi*gIA(dFxd+|nqPyWPqFc!#z z2b%VvQvzXFkW2g=wO|M51}pA4x+unp2^GPSwN`OcD=3OYHwDTZVamT!R{*Sl=RTLS zK^iN#$rMoBf2^YiLR%Z%;!P4&%M@Jp9>8%=#<^RgF=NV#EQNZ^_EK7&qEHnMmnrS6 z^qRkPgKhe~7SNR9!#^SD!Bd%E9JhtJ4%Bf%zO#qK_3x*0Tl?QlwuqWpuv+jMkj-V8 z2p)Xnr05dyyTkqR$R<*IJph*#zR=NbVfk{g&n!uBrjWr;r44ol^ZmHEX&6oQNiLRg zIe_VcztCq@`OCvOV)5s2P)z=jK08O-c1d~^rKut+Q!NXuk55otXwS5WZw97ar_|KA z(W0Mkk(1cQYZeN$zGk0TwsIS{`k`+^j#qJeg0f<;_euipVrE5_=g!%J;XmsNwoaqwk`NGK0ey4k;gQoh6f zg}WJ&-yxV=03UDO?-WdOx}RdBBbV}!hZ$9w{?Z!e_GG;wVaCg_q-x( zphJW)g?52mUYZptXvGFDBAJt~*OvykggEs9=~;x_iV@exmsD>(fdtvX?)WMek-HegAnsQmkjrCe}jLWG0#xH!M~Wo zQASX#=w@UrnB}V| z8UYBdC^mE+*^?@wYUTduci>ZqS$%S4U5nwk4-iy{Xph(_HwL{V3X*@9Ft&pn2--#XqTul^%N3Or;g zfzPkD1bqRImFT>|q&-uuNhA7jH6UPA(xt&=?MlbT!c|NC9PLcWtxKgiLvsQW<1{`y z0>vh_tB@C0VugH)9%=<}Cv1u2D?j&hb4R;dp*nl2vRdu9owMvgh5dL`-j;4H+Mhjt z&CI_lu53vI2laP7Hp1MUb`&C#TaAxvChbbX|4lFp^_g|L>QB?N*iHqV~E5i z6f1|tS>*4)`KW$Ezd-j=P&79|;1atE6I-n4ZLvM~#3i?pE&?jR+d;U&$N>QuYAZ6b z*o5P5fG?VIozB{_3Im6<3}dcTUcuNo>bn5%J0n|)0V<;$&$Sk%a`T<HCLA?V2ip*1iS{L{eZN_Ue;dj?}Dod0JT1@h0`0s19VhaY{UAR4G`#@mz zaCP5WpaTa{715&Ytcc(vPba%HKdc9T;rt**mL%qdrLo(gtOku|S$)2Ba5YMZa@Lm? zceAQ$&OnWPMML*>wWLi!l{LkGlR+!F&E=7Y^=+U)q*$D5;PXRWm`8 z@ioF)Aosn6d#~dZHxD%55)tvAWS8xXO5xOi7X}j{r1pQ3U3v$%6d2ULCj zLXD|SL7aK_?>27t?A9ODN6Ei|r=+U-lU?%UNN}(EbO=_fF&a{tDzkU;7-f%Fqm||< zfFsG_o|NAejYFPfoeylwVPejum?wPvtOnceZ=A_z0ZH)+Nre!G3h=|-@+PGFBDC}B zQ-{peXwdXX8bR0noKQC;%sA8BQ0z{qv>U@TFWBd+gX!lcCxbp^07IrNoX&8z<4hWE zpM53rmnP>A2~A(odgAZ~wyE{|WoKHh+ zUZcGzG<)ZBBC^fH_fv?vXTvp}8gOt=8W*o});WVD%}<;83CH{nbKAOf+Q@K6$ROtv zvI-vz6Sg?ZlwBR|(awEz-O6pICZU4SOs=S{iB){SB)&sI%eZS}P577aACdaq z<8)?600N5E_)n4gpTV2|?zY(*8e18fo6?&(8rqotYjmJ{U&PmtY*XM==rdchQ`9dj0{)?4kpJ{Qik_E>7GZ5O!)%KjyZEcHewu#k~sx!(I{8W6m;xj>QwCgmhFfupIZ5k znC`npG>@EP)3P{n3gUx=IqD*&kuBj$WU3}uIncJ)^VnSH2sF`oXo38n#Bg?(Xl_w9 zu-~Fr62?`~g)o4SAm-0w?ov%afrYn7z4HV^b+l?T^N2s5Lx+@L#Y>I-6hz003GW%d zHPZH@g(^kUc`Bj#N2%TJPYz+Tr{;P)9H!lF`OCV>z9JmTpB|fY0ba{{fg;JBXP)^MYKO`T@BD}eA zG@f$a^*8;F&o?fh{tuatb*~>(6=_`O^X-*50Y6XM1%hu6cW_If8>ao^`R$MgCfx?W z1+a11el@oHQ~rW$3Ik3FBT^yc->d*l18^m|oz^R(I(v)`x%lXszvj>s1>_-M0oPt(FMz^gtx2bAinXhJh^1MgX37esND4zySN0bC?TGP*R z_nrU%Zafx5ADpil^Tmb8eJDo<;N4E|$6lj=UzXW<(?13=;4<@j0rS018sdG0XRP*@3gF!-W2@Izgo!vp5adNiB z-?CckzBtn!Fdfs`4WQ!c#~Y#5M+S}IYe6mag!Hsylu?&v6WeQ);fh#*9l`N}X7WRp zeUe=rEh0tJf-=e=aG~*U<>9dTSHEsukv4I&d8x#3pSF`NbNrj%qY(O@z8KXp#Cd5$f(r6|e0VBa?EI;#ok6Cqyd6TdX7D%4v9UzcHbBAWCIz(yu&O z-7I7NcZj`l!=R;E`tSiDqZyIy#6)d|>dD;f>ycU+nEAD(b{i?>DHK>@S=_sod|tju zqk}^ET0uC?BS8Aq?J7;xiwKS@mO7kTJ7JRC&m@ZxP%@n-9T_Jdo{7?v#Wzcc*G1U- z2OEx|CfDs@@8!gYy4x`Q`D>za%EAi{$~qvXydi=m2^ z->FZzYc`qsSZo#mq)#h+w)F7I_J<&elSh~o{#KIz4GQDe#wuL|+%1=nKmfz;+~RPT z@#yxxdH8si=n|UYfC&X-t=!D4(u21LDZc`6xfS)iPjn|20V?wIkj2j zcqofQQ_uE@1bidNh2N@LYY+@u@W<5f!}#(Vhh>q5~EVvQ__0<{GpI4aJU2pp5{UhmzhiXlA$-D_8q!C#1R zje7tod6Y=FF(a)_91>@SQnvAhun*>%W!%9=9|sVD=wjvS5MR1u9Jx_r7T?*x%HieY<> zLbYA4D};H_m>} za1Xf_2y=D84H_&RP-|=<^v>)jxwAYgc=sYwaQP+R+9V;qghw?5drQs{Q*Q6)JRjcD z#&RVlCZDWCH5cLcI#wv8>Wl|fan=wQtcN)vnKsO5VZ=^4V;WV9^;4%$F;4#1oPnmCds)in~Lyh(O#Y* z3gmfgZ*>6dqPEXL=h~3FJq5pkhTr}N3RE+VeSTIz6aUk#z>W4~Bj?B|f%1_nLY&iP znSFm_0rQW9^YL#xx}D2!o+%iPg8)Es(E}=4b;R@uoBz7!mj4Nf@ zmGyID05Eh2zmtLAP*^N^F|}#IjFUw%@z+7&@51MTMuszO^wEG8De!~Y z%{ceF_Z9qCn~zs?TRyUz?Xu(IVxmkLmy%gZlDoggcsA#?Q22$AI-mN7-&lqNO)SIk z*XHV(R$ob|kaQIf3|e>$*D<3Q5f+xYHp<;!-OFvZYQ#FKNT)?$B=rzl8xYHOd;wWW z%WgF}yM>dNPSmwrSKj9Y8ovNvLsLt)e+=wjt0RDx*T0zJSke~t^iRubI{H|6yKl*p zkKUYP9{-Pr>9Yp-`0I|IDK_e-dW&X8ujy8>nrn_Kqy>DwOTz$=XmP_M;y3JpV34FEzg_fM$$;DgYHwZroBT9?ONQaG$v2bmFFl z;SGDme}F;kxc>qMwfyP0#yhi_u#C|Dmghl4%@Wzqdt3tZp)+#tl!0G*S$!LQ9n!6D zk1u!oV0bI{zJMK`+s=hPOP1UCrgbI--ud}a&i%aOtVcY1is8v^_ie{ElLlK<7Pq5|jvBadUcmF2ar{@eLai-MCJ#&J-EB;1b?}nDIBY-OGbTwq{#;+bZFqz;z!Lx7f zRGW@-W&$S*3Coqi4^)JgG3^oN{b`LT#NHhHqTtiN+?;LzqO9L+c_(kTiLwV4c#t9? zCUG}o;B+X%mAhnzS_9hQFtmXBfDql&_+{JNLt&~_W5zWGJY8Kj#I7LYa^1m_`~xrx zOG(1|UVu&0)|SsaQQ{mu6|yUyjauF;D)Dbn2w90A&rPld`GchgOh08#zx6rR56m5oJir2Q%NAYS0_y<`-w2cBk@8#o`rBjw z5#Hf9<|*QmAfr%#1t{nDpu%7SfxZD){qM*Z zfYB)Wz^%2Fu<+q6O;L9emu0;1&Kwf$cPRk-T?zPGd))))0hv(AGAn#4m1_dq3fI&nlYNo*dvqZ-4t! zPz}|f{}If@1hT5vDHz&VIbTMnie@a~)?J#8Td++v5eJV)LtDPdB3v#q<#&8Mpgc-B z%z5|qo@T!{m0wdH+xY_%wmsY^Lr6Oi<;xDN5{u;kveYBsUi8I`0XKhUdfCDKh_ak17=&& zpfIaFAj#U`0hF%zT?a&c*8vmXbpS4Em+?elQ8s1C!7>5r+!gHwx3ava#nhO^WHC$r zr-#9hR$4123<~s`79wZ$dznu=MVzN7d=ylU!JzuRVWC=!U?RKrqWR35IU3u+wMLbD zgUHO4_BDoHJJyv^)t7;ta~PzS$1?omUDo`KRh8ADyb7??A=D8!Flc+G_Y48ECYgf%+2nkK2ZRB58mM_osqWC*A_*;o>7<$Xu6g!Yv$4Ze4IUl)_$-{P7Vx) zRhm431&S7>=l$b3g&73)R%=#h6Tc5~xXapE4rr-X$+!u2D_9VY2yrr6mqSG?3Ybi? z1sC1RIzf!!LLCO^f|aY|gC)_~)%+e=Yc44_nUX+bP5g@b?`ZZ3Rd|8VzkII?|y;aP9eeo7iI1c(q))VNx zQOXGLWs*_RDCoB>=&{2@B5y8Fyoo>;(lG8y*PahwH~`X-lH*Mdhmgw(_B?FFF`wCb zS!iyPE-~(LoKeXV-Uo>JPPS{5H zUuJdVV97>mRkayQ&5H#Q9SH}Y2D1Ql8)aO+Us$-P@>Yxr@nv6^2;_fmlWG)Es^vMT z|8=PR`}Duxe{dj!2feQ76&F(ct+-NdCLa0TxxWxALZ~XXUy=s+H}x31xqbdicIRlS zazTEttxJUeUR(c{jW%Tu4;&xc#M02**3QY<(%9)=7TW*)v0@h(KJkD3*xJtA+|t(k zKb*EV;^6pz|I=+U-?y7O{@Y-y>tnYr@ej_=Xom7J4DA9)a-G5-75ZVE+D?97&!xQl zS0C)lFY9S`1?QCO&&i8w{W@s5FogNsa`tx?o(|UgjI_u7%)g86+zVfwwh4%DLtJg2 z?w;FRq*9s-{7ZmowyL6*pF`d4>cs8RHZu>hBgM(ZO^oRIa6SOs=n<6xj>O@Lgq(3x$1$@N=U$06IPldFjYWb*bTi{f;(`$C7u<$4X&h-2Fw1?zylxlf+??j=c=nmaK#CL@0G zQN6SeKIRgaKa+JnX78px{AMtx;dU-V<~u&qx6G&TW#`O2pNar|-$>rqV!OKGHdZXA zlti&;KKt=e`8E3~YP6+ApC+mFm8>jO*~X-Ub?3pe2wJBd`@UPE{GMlKTK|2$BgMMm5!$ZiaDVLB!mn;uxyo%<+<-c?!KtM$J1u33`4v=3{O-~kO00WGtY|&t-=d~Jp z@izgy=+s(bTz*{4KYFJ;{VkP45TyT_ti!{EPz>-ARcV{1tAx2qilvV{ZH!dy>#7V8 zGI)K|2sD9ai=mM1l}nW z>a=h#0>LmK1h)T^cZ9eXcp@#`TJ4FV0NLf3CO>b!HGU|7^(3>9skqC|@2E^}C7%s2 zM>)Jj?J|>Us%ncxw~LLzn0L|fTe6;e^XLXSC%kW%;XLn{O1l=J-iek@*B@-8l%3yu-(@rcQ5tQ0f=*B{%99-sTRN8BBk8!8V_LhIQn){Y36$L8@IDRdb>^VeEwlx|TM)%1pdHhnGZDXJopgN0U@kK)LMoE8`lkrZ z;o~{kSWd2<cQS=^vOuVAN>=S9chGY{|;*xZ(ocaOGC*-kpv;6r!X6VTuKx>hpH z1;x>xuXu8&$#nSqeRZ>s4}sKxR*`a~W?^Fe}84BFdX_C#;y zI>vwY35rM6|E~`rC*UQnRGPht=@kT`k>gC*qqo_E6OIT2}=3Q3)65Wk17Qe z#EYZi#+Z+Hy)py8Xa8@uPjyNFf#2C!gQLe?j3b8~H2tB{v8+J^yCQ#;m)&&K?p(** z44!NafsN)%LguoC?FN-=OrsT$w@RoO!06)65R9E$=* zK!Aqaw2#+WG2aU2B6AZiiwg^t#WCfr-skb*(i9GUpU+Tgr~5h{2p>(X7agiOe?5qZxe$$DJ@2xI6T52Lh;R}8Jcd~l#U-6JB3qPKv66wXkS!Z$#Y1TRXm zIWD=6Rvh2Uq3v8tNmi*5(e$&EoTr(|7WC?@6Fr9F*R^Nbaj*9?>$h=iif%S;sLdHA z-iKDPkcQTT3XGs$t_sVJ9#j&;u^$7{g;RX9YrpFntL)?!B!NN$IMEcusupsW!)+&q zNFXO$%z+%!k2=X(`QJX?n%w|9YDy1{pJI6v%OP-+IfXo#(()KXIfl63Qw?zP*llme zt0{j^Vd+KqQ?ofGf&W}WUQQh5v%sk3sf6HM1;#vhqCWHlK~F?F1?zL>BfDLaQAxo? zIcX@hWURGd${S({YZu)k%T5SIXU{}O(s|2~1epv?U$)JY* zu$1~4fIuYy&(X%TgCG&JS~{V#CP=J10*+rz>y>LA+Y&|m!t5|nP0<}#>iL&vaU$+q z$`Pr~rdFDXaG+HCs!kBeI1tXdzZ*1n-7tE+KVP3m?;`!W?--t7Yhh zQ5O~Aak|}jW-?EG{OHR#u--r9n6j*7@KJfed%&f{0PXb0qU^GCkqYlrI^I7Y#s>;= z;FrJYY|Dia8JlNS*TM<)^SkKGr-}V}hicqG{Ml!Ibi|vz$Zf4@Pa*0S&enG*@MXUO z%Atf7yvoa7uwxkm455lemJ>sA19+jUusj0s+rl(~;1`dDS#u()Le<_M4(tYv zl+8pf0OR1XXcpvX7OfqvOCV7&55$vDHm+7dowO{yBR3dwZ*>>JK_mztUP(w@;xSP} zAt8hct7Eg0qb0zJxuBPQiGpNKdy%aOjH;_=%_K-W;1j|`dUdzsnppnp931K#v_uLv z+Q?Mmxoc33_`<$dP-qKdp`^3ELSXA;l6FCR0Jzkc#c>0SJ9b;F36t+|m2g^uf}1En zwu$gEbt?jj+9!CjAQ_0XsYh+quJO7L+pb#q5gcEH=rqimTPl)l}I~%E!%{a zj1F(C;gK|spMNu|lNyRoccc!hi9#4fRCKOM z-5%Ji2^%4fqhTa^KyIa{^ik}wtY<14X=`M&obH=noux7VeYg69^8Jxx68P4-EXJmj zxuyei&FV{SnY{rXYuulWPVJ6~c+xq*#i~0`;onU+O(Ut-o10c8=L}P0Hdlz7EN~%> z?%Ve7|B)o6UMEw#VKrFlEJUW5m3lBMMqJ zU29yF=e$8EnVVX!5Tba53E~O?pLJR5rUFhHr$qDLL`B%=ect(_wa`Q4z{^emsC>+N z5c`Xyj6k?1LkU%kF7(~DqC3>!uD~QSPI#YE9Dn1!mUSUId+ednSu=!xaYK(nHA^3g zbh>quwJBj7Cclxcivkw!^VEv!XCnMn@^6}%SX9XIt+Z2zTO4dS_alqnp&=0Qq1vcN z4WmM$TRrN2ZD~_Dhg1Vc3f?CGFLE5?DYN!Ea?eJ`^2D+q#%J?!XsbWAS$C;L?1H*L zDgEnGUOD?}3Cz=85VGA4X>9(QYsKSN{Vh#z!2S9dq8Jg9e)QUsTvc8dHZrJ$(nORY zA=;yaHjziRhJiaft+Kpj9?{A)yOWg6UijUj6}T|z8FKd^$IAYzdSOx@@U6yr){sLcXMSiU(T7`nf+O0&{58rP(Vl zj+pTN+GHbCJ~Z5mp?)Cj8$t5{d&TpSd1E`*%9Obiw9ZZm|NdneW85_F555%aXP|hp zS26G_L=dma&2Wo*KQf?sM15qJYcM&c*3jO7_oV_bOMYc%-2lP>TMhj^Hs1Vt$JqO`5JJ_b((<&-_S5d|B!|D3JXiB>~S04U! z6*FG{@bRcQov;2M7ZYBxp#1vVR_O>Z^*dHL!Tj3qzm&OxQ(7{*JGY#f3G|^-8}6cs zE=R{nO-S;n#(Hl1z96Iymi~=SinGaXSNwL-BAflkerk$=2iX6YT66lhT+{Zj+u;0X zFEzl_e;Jr$j4Qoa^1|P#3Hxw;_3|p03Pvm6rm6lg!Z|wYsN>p;%tgy}A1{jz$+$R4 zqI-mJ%q?=uv(Br2;q}}(#`^*fKYl@eBNUP+NGtmOdI=vevUYiK7X726TZWq%Hkk2) z%EbTR0$*7eQYo4p?|6T|zgwfJp!M2$`kRLYVI_wo8nE$A+;lQL4>pZ6_H`J4%hbSN z+r>hut=-Ax9YhA5=4HJBMf8{?dzN^P@HRi5jMP!m{>C9a+MS-n_R=(9Y)kjZ)3j7r^B48_xRR_idohAp6qs(F}e8V>3jJB;5HeBbw>gSqq z@{Vj~+1W|;_l7?uj6= zTLwpk9ecNeW{GqoI@qBE>THel#A+wplnpeks}tXKtvS4>Ajnp#boL|m6J0EiBGM2O zxNLUWRYXB#Bdtd|9akZ0qq*GGs~ z{~Ncd<%S+*JP(c)F!Gcf80aq_jn~u?_gA80f%`l*!DpU}i+rSNW}~X1Q2m^WiO9A$ z2q-T?Y~%vZgnBM3Hp@-ZTExppAdJFMBTnh>jj~b|J!9S2G_!;Y*t-8m+m5=hBtQXN z=!!POA=@N8A@w4g5Ehz85!@D!Y}Idf7Lx_sK2t8AUND5KCLS5;u5E^qj+p>K)7!Mb zBYz5Yp)wBGA#Nb7O`x|kIZV#Q%AX?CHe-l~7b3@C#9GILK;)FHB*bQ7Ch{%)<{!N?LnWf5@jA@;p6T}=kk(ruC3a1g z3U8QM@@j3tt~Q?Zi{*)SNHtJXdpwqp-hn?X)Nc*t7%HX00Ud@UKuq4K5^Z>U$yjr=dzwG z=pdRH(X#jGHo6ZX33N%EZ9H5aZ9XpFIUdgUrwYIEM|a*3RaJ$hkHdKtWQA(r+?S^N zG|oNX$oKY{T5xX#i;Mx<0AQDOSkCUH(zwYXSrThBtv|$4Mv*=d^f2hH2Hv5&K%v~x z0v9XlHU!n3bz2rEF9?-pB`YnVzF~3w#lrS!;`LCwh9%D0-%8eF%e zii$gCR%_zyJeZ_Th8q)~n^mNID5$x2pIKh<5#@Cyit6!D_}^ZWe=J)3{B5vSxgeSi zfx6Xy6XD2vbA{n$1HOn~6mJBX1pw%-Llz4!n0V`SS~tc>)BUNLaoJWyT1lZ=+OKI*H6E^}9jbuqNqcVuLovKi)ia)@ z`LcHJvAafr0BYE;&KpJ@WKcnr*cn$bEz8o(9iB>TggUVvJh_NSp{5FPRc447#k0o^ z?n*t+Abx|Y2yhivnB;tlcB{CLB0CsGoViQL8c^$yb=A(ou#}NjU?M(Z&Z-^3XG>}H z2n?3lMNmU|FCR?B(iT=;C~HIKCdSq;dw?je_3Ms)&4Wn6?;%8RzmUdg@3fYZS%P@b zTtx<>&K0qsPlDf_)?V7HjjPeZtDNVg+`8Ue0{%<*2XMjni2ch9Wb9X;2N5c6+N{}| zg_W-;ED!DnJdbrrM^Z}pnZeG%I$0_&U54sfmW(k?1|;*c=ndkiQF?&`ho5!N@qpRM zUg0`sJp<&aywLx{*EaMQtyZXgU|;?owA{;+h!P zIAxrdmY8Qyzu!N4Hntfp0o>eHS?{Vxijanc2PG_Y&w(QWJqD_H+D78ZQL87WB{UTD@l5j6!Bx;dx=Y8r+TfTH=xjNakyi14Wm*J`PX z7Qq;A?II=>O<6^W#-^0LY9-03Wwl}{4Bq}^Qp4f&)w%%S>lo_<3i?xVZ%QFPo)NO{ zd@|NI#p&CH+jfILApNUv#2X}GPI(`4%)W^;Y&(vD3w`HTKd1myr;lFJu<3nsEFN)p zCvJ3+Mh%*c7HsF^;Zo-`EeH(xM(bd=ZJd1)fGs8DWb6Ytq5`DAHa_f#I18s7Dc9tPV_n;U+F->K7D(ZM1N}jeqke`T|6POHX=(K#eHLk^?LN-Fd;&>Q#3o)L-eQFn@5x2($f3^DId{ z72|lUW^ki!P&>P=V2}(B&ANZD-|;%ydz?GFJ${fZ{^6wZw!?k>UXLeG1QRvsknDHff6Y zkS+(wasP*wm_kwmxumozrqL|&&>NfB{UvV(+$Y#yN5p=hje`Xo&@9RQp9((q9pryj z@c*|tH!D%`uQ@k(^Oer-eV%U_ak?f3r69VI4()V0-D-8tBw?-J)`)FQ;IBDX;V44I z5*0Pvr}>fRQ72>wYjbF%YK20FYO{#B?Ugqx%3om;@GzLEPmVPK7{H0-j>FC?cUGcP zbn^8O_Cud!fXu8~vTnR!v31IR+X^llWz(~=jW=Z^`}J#^rO+YpG;J7#`W{LUtWd#2 zMgc<9pVT^7Um*_#kuBAJOR!v|NSX7v`UmFw#iP6+okRqMHwJ90PZ%G(=X*~ZG^0J* zkyzHFY#?lwpP%?OU`nadh;?x^&xw77K2Bh@eV~6ku`HZlNDJC{X25L(<2#a!Tq~-0 zNu@@iYGobQSix{oqg+vP68BW$=ypM80mx4?vC3(I*sK~x?{rzY&~}l8TFX6{{7U?JBms=snk}8hBVPi=vcm@_E=7xrN*2rM#B!GQ3bjizAGP%Zr(e>l} ztfN7)gr8iH0SNr+xX5k-gh|!0cabHSlc;(oIVL$&(##k%uyH6wB#7KNO8D?of2!8` zu=O1w93vzsRz{d`&$$R%)D$Y^o77WI!awoTt@5}M5tBQNv7=s}u%vz087BaZO{Tjk z^XQ`@NR*=_4H3ARLE@h<_62;s@J^&f3UYw?0@sjv3#?I-#74EZZyJo5ijoY=L~2fz zzaDsgDOQUhOrj-pE$uQe|LNTPGZ+DhN6-LSO%&n|y~?rm=>5x$y^V>I=#EN_BBTN2 za%I0xLOicd`E9eRwz3;2(AH=d*0#jxg3z@|JkKiM9{(Ikiha#^sKj5< zf*hyLD+1o&o2u=Q#}9Cv$mbbW+i%w+I#kUm1ni_`9a)aFD6%m)^SNI^sbSwqzdWOZiMd;GgJ zG$38$B}`(Rv0h1XWGqECp2;Ay(wxXUGcJUcId`(X@-^@J-GB|QXP%U~h1W*xhAH1?tY!m%;NT(CDIqe?(bNI$v3JoGqP0h& zl`qPidQj&E52yQ@&+8w&7t=>awOt$zZ~%W#vd#Wc)S-t7@~kCWE54~!l6X^^0m~%Y zB(+09Ib!@?b=D+Xj6T6hT#J{;&)D4H61?gG7BWmhh+ychJdvGwVu|9!3;(Ix_iubE znZyX)86WOD@^kp7`|&kfopwDz*2Q{Rl_55)e!;)tpV!}=L@s=^=OL>n6_E1;jsVJh zm6BdBe~y0xac!c&!et!hW8q=Sz8rC&Npjgx6MYO(Q$ z5u&x~s99?1Off2iMPoqmX0`kI&RiFNTfgR(*J2DL$-XKxncT*g7~4YZxj6y%gimp| zzE8CXs>c1OP#28vl>H%)VA-(OsCfS{5*~tj3_h()drf$~wbLwP z4I?lmlI6r{`}+v1wZJA~Q&LBfYc9jEwyzfvmboXELdDj&m7z<4ZgM=Nb5%nupwrfo_w6vms;8{ zYP<>#mU4bxqA7=d@?#sABc{@3DVOnjL~^uVvZB=--!N0^xeSC?@F=ItdB8L3a02ON zB7O<0ty&lAPWmA27SsFI^Q!Id*Sb}_dQ-K|pVVpx z=frThy6v~W;=sVrm-io!jj)9Nl?t5MZXtTBhAQ7e%6E#rZN~YuS6r zoLr2)&e}Q$kn;M2Kz0Jkv&uijoYQ5R5Yp_%_z;p2BmqR^e@Jf1{C`>P%=qt(XsCQr z8Pq3r{I;ri_PE6)UC}QSkM)q9JOTZLqNLV(1!&rqCheV&9^YAUw!bWwkK$2ykk@0* zEv}LC+#NFh%#7-Kk{glo=~VOlA1+a~m%b$_)xg_@4SFuD&eE|$TOZT4cO}P;`NgqT zGY;w)kY?77tj~X*<+2=lpN>Eu&;jv(DoQE>u>ZHB{69>#z%C{ZZisW@l zu63w`pHXgG_wt=f=grgE*A+e+Km^`pPXyH?c}c$JK9bIGM3Ze{X_9`$2`$G%=uT!# z*(S)GGqvKKQD}vI#~2uoGsG0gDcfKWAKo4q{chfgM8MLuB@EIT3+D`JlnuX@EpgN@ zaWzcfO^2EXT(P~wx(c6i{~0oEQA4D0>uGL|HVf|gi{@<{ZF$xIAhvA{z|&Th?%=r) zSYdYRLTNw`52ZAPl~e4r_z*MKAJ+fWF(BfOY^HBJ6{c)jlSX|906LnXL`3XqBDt$USgN131%zU!v3Piap1 zYvd^~*bB%l<9X1JTKl_U5cVDRy`LIUX9ld{{kCq?PkL5FY0$wifF%wq+Rn`&SG>1H zv+&Gp81*Br5D!*@xyZWv46(^II*|=q`cLtWK1E^bq*Lc66mSl(6g{DqXKQkEDB#vj z*|@TjF!|TZq13a~#YpGU+^X3Y%!qR+XYA*n!^fWWw@{Uyp()>wI{oz?LAgV_2nh5J z+Eyq8AdwT|v7?=50o!cwLfOtRIrl9_&Dr`2!(pI$h4bHPi6>^yc(jZtAVr{Nn*{Jzqa+-4z zGC!e9Fke_!k4>`C%N~DgnHe%APVFwE{rPN!(kk(=Pc zyrc01%hK=6Mw$;k(S&_S>h2>0@zC@`St5%I*R2QLq?W-Qxf^dBMv^Aw?uw@db%_M%w9UG;b zilXWb(Zn8Qeii#gBH9O?)P3rV3-@B>&dB!dQGiWKi?=novEF<|Ny*SY-~KG!nH_r1 zeRm?IgcVfuSnkF9249dZBa)rw;vqM1 z-zI(;KsFwaT_DAN2iGiWdbx=2sxuE|1;YU=WKuS16~rm?*Cz%W6&M?U!jAJV$!qea z;S?h1oFXb@MDXgV8Mc?Jq!8M~cVGlJdM9!(yvL^_8@MU2<)Ao**5Sr&^mi_h$dv>Z zEmK<*{y7C;3H#n2*h6WcLo2Sj!d~=Iq9ie6TqJj^W#09ik+_dX_CK@`*G(;(92o#i zhN_F>q#oeao~XAF3n_dLad?s9$CS&~kDR^avLb>_kjm=a%e2GVU`AYm7(cUJBDwJ zRtoe=5ymJ{eD*61?}~4a%r*?Dj5PrCKx_d@t-+jJ-=skFJub#YYM1Ct=?y~a+m zwkPNvg-e8P$oCn4DP~}dw$%`@sqIcrUZ>hBbBu{zt=fTmlb%Zn)C)F!!j$Q$iK-3N zg8FJ3f7zv&!Tq|GM?9@Y?dMjEkE@ipioZ{rZ%@}fKs@veblJv%o%JYbt3LrIuhpru z)GKPaEPB95yDU<6by&;OVGAEkyQg43lLGYWo(8%IGjIW8V7*j;7eTzhGiT)uu9>~k2rwQkUjWmWN zKr?kUwR8UOcG!Qat^d6*Y~%97+0;qc#{P$?iRj<2{uf;JQC{Qx>xC6kHTN_OS@u_0 z1xv^PW_ckX6DDl1eak}pH_J;|o5VrA^R=~W~s^YIu9%ay8HbhGpue^d*$#FB|+ zwwP`4T-?U}O(XvLJkFSg$5~Ko*imDJwYFwWekEzoP61%ev9U{Bz2vz+&#C}?+pAt9 z%V>yR@(f@}iOO|X{cxdW#H%NGN_eeZZOe9$!hc`PP0*L5xMp+|qmOE~@jmLP=oCyV zh$FOb?64&FSbi}0ez8rV5I@R!6)K2fTGpD^yhl=^t-VNTnMF`>zLGvUyj90yuK?_t zNyFGLU*sswSmTVPdSfEr(+dQM-K_4;g#Aq+7L4|mLsw*lea;nR7+VC)<|Ut~C309` zWyD+V1sRdn=_u&@k&;B`*3>Iqc)_1J$o2q1Y@Ctgcc`*AUKW}7PIg7sXMI!U*-OMi zjKSo9trZYDQ#P4{xTMzM?ol>DB_ieBZ$znduAECgj7O7||^t>ueOJK>E_Ie8bdP16WEbd2NBUCKh zo<#EYjpQ&vKj5(xipPK&DPeK#2*Xb$?GR^_%)2YvqQ65DgSdaXJ#+~^{QLb)a^Fjj z3SppEdM~ITi6(C=1oW-(%$HVt$XL#B$G9jBcG6z;Xsg~P66|=^M0!U;$$Rw6W2|M1(KUNA7wAz#e^9I z%Mp-m?GM~ebm0Qw4+%GjOb#>+EEZR}2()B?fF>#g`q9^styZsDS84Z&2 z)O0=v@L=h6>);n-2I^5?$8AY%5fgagZ_>_d9IP^i)3a;s1AWeaaVstcr?Gb^Hc04d zBQ}z?OXO=t6+IR9T5rfgJ(RFDy>}FjYZAD+CQOJ<`th&#Q$oD#08%AEzD2(C1UhM+ z2jyutaEPsMdwfLTBvm4(d$2(rX={E_4{3lhA3h`MkVtD2LGfThXE~WOH+Y^w#UICz zm5Cs?qIkMIXKYl6)@yX!qo}Bnuirbr7!4~7gcP~_IMr7GTJYwD# zDpK$HBa_Mz-~=Uyj}eb6MgK0-K6cSdNH{4s3{RS1xcH)^yggB2>vF9-a0K9+9r_6u z#00)P(Cx$690PL`KDd1>=#h>>g}btCsWr=I=hC*9yI>tZnBNXwXG}QDC2>JQI(vYR zJO~=YA(_xiYB5O$E8DG9r^SxQdN-joWN-q1^pJYh5Ldzi4d@rnbDAM-O!Y*}ydH)n z*7N@n%v|c=zgDFhIzcJaunf@Xs^NK`TAv|)5@#u7YK9tCg@DFH#5U>KqKgX;ma$;- zsAuouePK-TwJWZutr$&L^O(LYiec)%*2b(#Kgtt zO$bhnU=L8!!XtitI_w36-=*>W&19UnF7&cS`xMzG<3m1#=^#Jv0+Ibn1g-tZ;`-%@ z$uTu7Do)*&HN-oFy8vl=s^XDs$F#HDJ>a5ioF${tQ=pwBhQVnAhng zZ;BnWSU$mY|MtjyIUZTk^bJ8vJuEBIa3}Kl!3wj}Al9ccp&fwT7qf1~#ka+!f~Tg* zC_g$Yr?EleDnF8N9J@Z>!Q(iGdj#iJ4v&cXM+Dp^XUYIk859As^eH|RO1m|@)yC92 z_(wMI*xJcy*=v(4l_w2}Cv#xB^iJm_Za+TO#5ZBblD+Vlhd?Ardsquq4V||0px$hB zkq&=xT;S^%Suu76(3<9&3Vt1&GNp~0vP~QF@Y@WdPt0~$!VNNbjp(H{`zHMd zHXE-mkQnKE878OcoizpcC-C@XAEpw=aQ4ynNPA`yd^XHS=08kTD0i>{#5 z#CH6EipOujlX>BJq$QyydvF8sC~f`#dn`S!?~YZVY!#`N%El-GY*;)MvKE+EHaFN)l*pngwVQhJvp?7!Vhh|wi%c0Bg2La@9TrD>LqUO zkBx?mWe9_&~%`bzNXRZz^hOV%ZUrY$Jq7oq_F?s!a}QNv^H(pO(>c@ zPpcA8sZWfwfI0wbj;`7G>0ZN#&Uh);43-zBC^A&f$omm{0AMR^yPdrqv7;Qq@a6FL z))~1>;Y~N#MpV#5<)nW-0m3M^k23q08Mm&vQy00L&G5s{mj^JKK*!@?l|T2@JS8DR zZk@@cEqs4ud|K1eWB$IhfB)yhi?cG@{ju4}+{8SFT~X1@yu? zNxn!fy=M52q}shc6Qagvq|}qH5{{gAq`$x`JkUov0Ek`ddH(Z|%kV+y6~ck)2OzNNfh$=yPn#e zuirxpvXk{aoL5An8j~fm`-nW;vui!?{#Z8s`8+>~YQNOiiz`E-!aB4yQeimlif%N` zdXQHg>eO5#dyjiT!Q#CtG1oLF2*j>L1|))wrB9e0lp8{B51;63S7Lj;CS!r4un}xy zS73>6s+JY>nW;PXOEkbDaE7?g6MaQE*o96}6i0eX19nFSaG5YubMPCPZ~PDSp~45{UiofHXD!Hr;G7i0U&Ng z8~AgW1D8)KEukM&CHh1AT`jR$X5N4+jXsg7;8=v#4L~)o;XX>rvxlbRy9Ti}&eaBj zSip+-rl=sAsYr`lpc4 z!PjVs@$Z-|Q80nfUn+p1GbYI2049A!hUv*KiHKiKn=pTZpEJ`&WQwuP0hK{IwR)0;sPUlCtd3DkVI z6fsh(k>%8sgOnfo5G^?*UF@lZV{%{+45wr`k>^3d9pOHqLxtCc;EcW%0XZ&$Am3aHTBaliDtJQv(uu4a(G z8ZU7^@H&-n;^erVF6)FI{NP8OZ_+HfWOz6iCc-!3F(I8RrpnE>fYL+mB^UFy{r!)y zzix={zR}1*tfuQ+)SU-lRx7^$E9~)+_$3$#eCJ*uTw9A{pku@O$jF@(91nrQ9?TD= zW}3Iwf%$4A?iYx~Akpk8k^ZCPBf+s-mBiuGQsVAuvw8^^GjXH%FX$LU=HqERPM@0W z=Q}e2VYF3aG!gW8(OaOf&yJ&=@C=tV3lYp$nnpacf06(Y8V8)frYo&R-S$iC^qU}h zV8bkjvpOg<4FZeHc~N2fL=9zGY7Q)%8W&>ms*i^{uU%J^$$XRsC*W ztguQI>ljL~^Pmvh0}rny_`kZIjx#cjWug%&McRRU%wd__gyY2@DC=`+;dZ{wmX(P zQd_AJKk)7Sn`X^m?Lsca+ju+w2bi=1u(}+W#S0sD!cH|eT;a{Wg=@018<52_$jI{W zh#UQ_;TwM^E8lrJRT5pF#Id@w`H{E@Dh#q#)BzcYwSD zMXrQ7VP9KBp8UZiNw^Ge{VW}N48wzDqxz!ayQwNKCP zl-yC5_vg{pi`+knv3YVK=vZins-G{UHp%ne>zyg2^H1P3A7T ztI&S$GhXR7D)bUug=AA@Xx?cKaOJq1skTBLAC(fpJCdF|lQ2%&xQ^VN_}Tvq>?Ti# zld4_6%N(D|8b!TQf_erh(7DyY*w&0p)Nz<1nhBNjTp!_|Z-4RLz)I82J&g zI3NLEYSacZ5x>7E{hrF0mYY(vuD&%V-0PDPtWz{8n(=E)CHFNRN5CE8CB#g970#?9 zo&Yn;Va3Q$bMyp&=xg4{8pDrKh6dpVTJjajU^`A|7O@i|Ep@oxf+D48C#7k+Y=%jq zTc^o(Wmi4Bij&6D_qL!$3ZuM!1)=6k(5C?GV!8|zVbe%lU*&J0#1EVW5r)tX)b*Ul zYM$r>%lvR0G2IUyo3Q=GdR}3iBheEV7VFKIY0OQkL+cFarNok9)sBH7P{VOtk-YAU zCq;d}BHP)8N!AqeeDuVh91uix(u;weHfWedP~p^F`vrUY2|@}& zA5>b-cas8GrZNQHrfOc+6&|Z=8rwsCzjx5%V3{jX)aeFbz$E!l3KJ9Lb%Ft4USTWO z032d(tkkE0#elEjQMLVdJ!BNd-VHI-zZl}Gv*4$6DZ+hf}g_jO0L`F+?JAX%FG8X zzX8>fj8iX{ZN+d0kG`1A*hwk4`WWYYwSOk$mDpQew#UR4)rt!9lST4^&9PU>%?bN$ z4CC3r_UT>7gyVK|@VD6ozlW_GsFhse8|iX?wo@6)UVs_{ys+(2#I9#%vkc0el`pUS z#WxgnArXn3irUfn(iSdg#N7n3hUY;vcLA#oJnmu-V>+3=7(6ZZR$UD+GmylgQk5^- zo*O7=C3p}yDIHUu&8n`K=8%|7c<)YeO6U+ADO0!R_~3Lpgca3*nym-a9ttD|A{7Uu zbE@oAY921Cvi&ssb*#h0+F>OqHUtY&A38V-1*CT~@-m4w%8e$D^CoST(R>iV)24 zLfF=OrdJMyPlQ zjdjG^R7E3Gk%x%|D>W$fngDRRzyaWX%;qDQd*WHJ0Ii<4U_GI?wth4b_MmXJUFY#2 zGh~4oij0jt!Mj}$loWkQW8gefB&|7Hm-PY*w@8Q@HxWxL8w5CDBP2l0u|MxXsZv}F8%5JTsK)*cvG*T$6Sh}NULwD=n`E!pNc7Mi8UsLXVubsmC0w~L8}7MBrR`bIN~%p?@;z!jLbU}7Wn)*P z4Wb@z#98;xm488Vc;PVcMA-7&&_qis%WE}&!M{D;`5P_ihH}5#4Qx$$ooFKzEcTq% zAFDJzf2U$0bg)T@dKuEE6NO=d#SCV=S{;V;N;_R#6J9N=6qG-M(o=vXMYetA3v=tl z*vL0K7s;$pJLLVJdj(~_0$MkL(*s0tMO{SSj~`zDjJ?UrVfhMhLkB?*7FMm7RK9k& z6ng+`N8BP#Z`<6aE;kB|b2dAqFS0i~ynG)op8vERx?KW4ygqh$r9c{fPA*-te;j_h z%HHhuI{J2%yiaAyrNW#kl(a9xO;daK8A0|*l(!i9@A4P7C_14luz5sP@;_&oTu5M4 z$A5zp|6mDO7aL&whv8pX@h_p!`Ik`S$miWo-1WlO_)n*RCE!8V??XZ(NnWO9{L?m4 zUS@n~6a2I7=1-2Uq;GTmitnEO^lp|ogs$Ixv$kligv&Nnkh9)%DVa`e zBYPi0uwO=;Q_Onzs@OA2r}h|wfK{nV7%YZ_@IF*F@R_sMbbbbGlO-oug*o)jenkH+ zgxg=%isu0D$LnpGdIpeDOl8GwmdLy6#{|)RCF5A`6qEd6g2g>TY zsNRY!>%sJy_2<2sjLnd>zkfyO>4c@Z2C31-6_a7-zuQ>c%#{g%i)~olAV&rE!1!Nd zp~*XB?68$Yg95PU6}wx}ZtyIuQoRlsxmvl`cb-hmyuqV!?fZ9@7Jp==}o_Nm^sfpv+X8TluvPmq+4 z1P={tzu$X*aWfl|{8mv8LVFkkPy)vqA9FV07=B~i-t@Fwm_!ucX{MLl4i-ezMK`?T zF5;Z?MGfr1ADgxsm?yIc2ry^)c$_Gf2>^sn+p|j>dmL}^&y9sHAg;I&K!sjS`K90C zz2e^TIfJ}5nC!Ucu_xrn%4d6Sbj!$|^BkYsIl=muS0KFz*q+CQ%K&n+{XFyk0T$TT z=E5$)J?zI3{CMFSgr_rnt^+wPSPc;LDokv|o1lHHp4(6(;-Q=MzM)AMw12ix9NmLN z5Yta=nPDV}`olCV2(>t|pG<~l_A;)Kjvrzwy$WuV@3__XZjNGie*xzj9FBkInmZ7gGT**HbZy&c#R9WA5bR~a*?%p} zOi0n^jwi;JyhD6x5pXWl`oWGf6Jxn-mfiGY!r*>&8NeG_2aPjl<8@Ud6tnjgp93*1 zdRYI_0D^sAa<(;0FJCIlGrNel?@&~P@pjOq8$ zRD#1F&l^9fu+^K{5ylOR6ej8Ai2DhYp%U<2(E|y`FJsGh_uk7Ft4)MQUGh zocB!QI}(9~gVFRXm4gdY-rdby+r}a?8Il2!g&lyKSYLMkoXIc;K%(@eizH@+7+RBI zl~iAFxh)N1_>9j59|w^*#E7^>l9tPK@OD zxzxt7iKX@gw6{s>u3qnhU7eZ*!?NIx_Z;TA>_SyJAmgski|&?ARUizHx{tEho&|k< zc4h%a87(lNL05neP_(EBVs=)zM-HvqJveV8GXj}u!ycmX-E}qBy!rTWi@9el=U805y?_GClxWiq z3u7D8X6;Zq_bMb{4nGL+Qb*(-YBHCr5OTNl@y?xST?uN$wz(~rO><2{-jDh287Z+0 zW&bF8fMHRGN_-&>gc#CCDy{Ldov3}2wn4QQQRyzK;7wJ@tP7#ikZl*g7wrcon=(CA zeJnNLS7`eI44yNRT$hNB)_(X*R*iy&RkSWE~Q z(dV{FCy3x}cYvxzf%9N=wFDwDxHZk2AGbn#0!&7IDC|lxfms2=rs+B&IJ!Zg*0JMX zglMXngVe&2$2}Q%=(!JS2YT}p7mhy%Z1#J6>5_?I84+fWGCu_o`FKWo@Spxs4PUeGzS|{&gj&w`Cf*1H zKBSqeB;mO9*Z70J%H2&DYUC{zw|4dzyNnFq6JYF4_qt4K1~~Oskg<-cfRVWQ`AW)> zH&N4w42w$oAitMV4i?L9z&6E z<`&f;R0eo#U^}tIG<=45h6Fe4v)!E@oAz{aCerHLp_C(*NC~ilD+!C9-#S5JvVmrMbJT*O}>NS-AluJVvv zE`sq{k1^IHe`|B%&0HmLZE1q)vI2*lHn9-mA%4X}_V+)r>jqkDfIqz5o^BubG{!%X zP>k(8ST=I82gu5x!dbAKHg^Q22%VWgLysup}`2H!c<;ledd>D(3iRG&zF3KR7^%;DDp6xxq@S{ojx`diL}htVCP5n zc4&(-h}dZh13--2-6Vj_putfER6?`(X$du^9)yc#C^06ZzzqSA;=c%nPN~vgFoD(8 zSV;a>cI5o_NiUE^B_7KIH%tVXnfVYiIjQc0iA?0p#0#qsdbjF7lzE}6lKtqiEFyv- zq{bNCrmmY2(s`Dq^A?>rJ9Bz--+tq=;J;>7x>Q)~2r$N-jpqw*>z#tP__eajiSZ57 zbTLHgLhz=kwp4Vbmj%A9h_OkRHNU9HfaHSFd_Xb$;m(x0ul; zdDT=j!kLLK)84;OQ?2B_qJqA$HsNd8L`}Vy$*)2)bXFD^A6xOIo4o!oDI9fL-yK#$ zHBBx5UI0d|4$W`JXHwqdI&! zdP+k?T3_kkTSH>fjI!uLM8_7-rS9=BdxO>u|FG1N5QTO1lH@eED{Jg?cRr#fVW<@n zTWvPy*zME0-Z*a7&uCNmZ#fcb0s5FvlXsa2HUMy@$vi_^1cUwJhL3^RUtcscli!h_ zYS%0IU|P{*pmT6qd0(Df5g6d|Outh7rW-Xo#P8og3NWJqT0_r~K$Od7;uiXr+J(=| zAx$>-tzoUJGxUq7OXMfpekwVQm^>&+c~b2+1F;d~&60*0W8obbNr2)pgzv(AGtXQ4 zkWEC@HC^Rt#vAZDUcQ(8*t7IW1pFV@r+DW`PKZALfvGRU=L_H8tMu|#-IUUFMLCl< z$yAt|p!N<>M)e8RyZB#Sk1G_&k!ZlUjabG1n79%J&;DcJlCcDiS$6+x(87C{Uz2!n z`-nI$pGQD#6c)0?l8__G(|#a!kZmniRm}_k9^S#}y6B3U&+z%$@r~`n6*O;Mmky<& z-<{-;-ONHFk%gJR$)9=-!7FJ{5~Q ze%EXKYg8Q{#e7WuO1vR`inPzl{JVh>JU^~0y9*Nh(xY&tcD(2s4^P;AmiTo~LB1<&V)rV1##zpHb^G;7N7{5P@QpU?h{}K=fz-B`DrN8)Z5NDm<{y`Ha zrGez-*k`cnF=Le`P1N$yx5nQgt=#>S;Mc~0D@K40}#{9ai%<(=Rq#(2cCgbbJWZPD|=5nJ?$bF8aQijI`?i)oer7Np-)2eVQ32%9k!=c33@ zMQn)is9BbVFF$@&UcP|P3+GD<3YUOMW#Qy zZxhAGH0uF@y95%V4njs;B&3=av2*~!IFxFX8v%Y62iED4++Vs)J4iV2JVc@YwS?t+ z_&7H?S{^f=k7S>#MwzJI zbNi|gbFx?&v)uVktKO%uJAt8l{MS^f2b^A$pEE-qS0=o5G5wL#(x1=a?Yma!4FN7# zPIZ&etLBhc6Fkfuh;@<2$`%Ju*t!$}qFw+Nqlj^38S~WjI|+G48yiAqSnuIJ3V*Kx{(giU`Tp4twa+ z^0P!EN#u(vY$`#)RqytC-*roKvH(hc<>$v19w+>4_sybuh8?t=f!Y;E8DW5gH;D&C zT5le1To!gw969(nw><7AzBB{^z4fQ=Xkp1}&l07L!XrynCVhluu7TNCA#H$nxJKeG zf8ZY000A=B@2P`4-B+1y91|`FQeV57??Olq852$SO5(A}UX=S-48Hxj7RlizG(#8)2yCN=LL)5M@0(kQlYJo$ z`x!rV4-7h#OUdg%atf*cvLog^I^^4Jy-nBxW_BqJ6&KG}S6&BUFa*=hsL2LU_|;J+ zo%EvH9q#y3$J5WtWPCkN9U904n~cy|<}mB$29z|SUkFjh6|0E7y0qy8;9TRtH_`L+ zOWsBYo1P_tno65%CsFdhh*p|J!^cG7(I%m`HD|WP8?$<+WV0g52XMd8cQ0XdGG39i zhOiCy?^+jdfIdgqr&968`rXJk`s7}LeRFkkB<&b9+*sQ+Bt*plLj;bKN z;P2T<9xd%`d4;x}4t7HbskNFhPsEz8{32U(bC%`~BYi?5eJ=x>BjiuT=M1$8nxZMJ*N#oYJKWEfX^}qiP~a z4e>{Nk&Y5<%Z~@i-y~y30tW%;jaY=BbOmEgDxQ@qXlXuWZ*jZ<>G^_R>;v%t4#WQa z7BT+VcVkY`dWWfuZEKd)Kj5iz(HWWDh#3g1=iOq`7BFP-Gj!Lc1o;6c@pmV3UgT2- z$&qF2s{l5PS`z=wtN1_SdDSCK**OG8maqV!<<*>N$r@7&2xWqrpJAQFU(~v`g-N_M zqNMB;uj+4|d)>al=dYZ%;XG4f;yv(joZX51yVyD8KV>VC}@x578k~10H zREJ>-3TQmKDcxM_ZN4Pt+@6F%e*<3Y6a+cmEO2!!-gLE8Qs7!Ew4ZPXa4D#E4YujD zi{C|#9c|>G(0G9@OZ{l*YupvwbC09(kS-lH8_1-!HX+1ZM&~pDwv$U=$N^X|9cK*I zeor-8@gfz;K(e9_(;{XFkIgH}QBRM>h-?_H;C7B;tKQnlm9HyW6t?r@L61q)o4%5B zL_OaN)6C(ByWv7_J*|xbz*#Z{O3Fa|lLlL}>cK4{8isbrvasXzhdPZY*vpB-mSn-p z2EHCn1aKiyk-fETL>6iQ>-%9jq}Jhg0x+cbz$hxYG_MOvj$*_se03oCNjPAjUlN@) z^jDGFi<3zMx2I#^bIXKd5+N_9Pyx-t*i5Uk?by+8=oGDKRjFg>$Jt=%=g2bHx2H51<9Fs#*L*hnh@s znput$mhGOaxivEYt`9RI*>~`_S=^d>0S+?lW_Uv8dMuyl$rg)O^Mo$!kHXSdAmld4 z?BwNOFEl&h0yT6vgw-+0%L7r6wiUF&Ham^C8p$G^1X@)U%&8jR_3N7OE<@ zf0S~e3-(J!Y{d(kH`C_m<6jl6AjL#k^DBmL|K)AI`Pvb1Jjvyo`hwy*i&9 z{#uacc>=!OKK}DCK3SZYDoe$bs^FI-OJ!a0V7kq#{NAg_@7eC9qVOsE(^EYjeU(dH zJhDQE8sR|`XCGN}o%dfnQ0S66s|O4+jIjOJm(^5%#s5*9{QhA7M{oM0c+iISC%bnb zHSzLGIAyVUFaBJPjIjeZ=&$)p{%noPX_bZ1Hw;m3fral1;uxjFF z{(~Ej_jD%v$Lr7oKZobhU$CBne1c@DL@_f8-a}=&D*zq-NghJN${7B}df5j~%Kp^e5a;;^(6n9<+11fNQ^iSR9LMXOOu zXLJ6hVUizbE&V?Dd#tCw1A1BiVF6M0W4YfIvim5T_3x^GKEJ;{aKQSoez!d2JWV{Z zS$OvBeeeQYF>vD`NH^BMNysxB2clur&U|Lvcy0iGL-rW;lp#BmOcA%dE^$D-(H0Fs z|7$pXG6RpxM6$v%@~xbBHcHi9M-4ilRGrPy_>ebC?;1k8Ce;FOo+HUKxXjunT>d(F z%rCZT#uv!0YuW3|U}Y<;dKj_qe!)Gy{TBq_#kbx32Lxy_6#feW>;ZT{5&-y@1Z<3e z{7V98|8EjtY4#oI0eaWy#1{v0W?CPCx6NA@!cWXY^fN{Ad2qDo2$Dm5lEn$~9}*x~ z^ARcOYBV5HSJnb!d2YB-v_<)_b@4Z{U=72=){kO=?lT9!Wo8o<^yBVA1MrGB)VPHU zKj?9~!7wQzo3R+zN7)g89?$Wzv5RO5XstKB*8gY?2RI-f3JFU(FP&-D>eN08;uaX6 zW9!e79Y+M+SeJ%R%UcONkO}){n!j$F>=51u)UT7Erwj0dK8P`02cl52?EeD+NKYbi zqs8cB5l>(`_bs=??LYx=xE4@{x<*~~2=mtE-q~2U03c$ivZDS?Ei}j-rG>_W z$S1*a-kJRL2btzV-6c&I%NM0}aW(;GKIgWK^kUDHv+^({jl#+9vDYvGHP7*pxnKer zge;I<&L|uYa}ygRyzAPcgIYf`zJr?~HIr*37%&aSA7{nqKunMJFnkgM&$#8X?v6AF zl>UnV0DQxd*J)Siqg%(@5(CtObD;y#WVA|iX_%1Q0=0> z%LKjOtLFSdo^!yM#|E(fPiDdH@~#>Xs27-qM|`@?Xmh&C2t@!?n+$_?zNe`Fqc+_k z|D!e$qxo5E8~zEQDC_+nwW+jmtlF1-7w6Hr50ck4iU7y}T67$69sK;veb#$2)oKvP z3U>DDfCylOZ6^iuKL{ZDKM0^5`(7lx6+#mX0DUrK`dn^dHMuE393L)0*Dca-Td&w4 zUI;cCl}lpKm!C3BwHlo={(eNah(w9mYV@`HrkQ(BU<4UjC9qZ-wk93uHc4`ddijFl z#lzj!-<keJNzcf46X1jA1cL%rYw=V;e;G?5}SMt`4 zIm`o_oMswydUUXja!Ci2cZuEIo-qut*z%ztZ>X;UvuHfY+GdMYhxErBA_Tvq;t|#6 zT58qOGX^1pF5K151cztb|JnVMBY4vMC};b-`ZpDYdHB2f&%URXl#y0HY8aSE!E{F` zXMIXpY3X^6F>4CHXE6^3Tn7{P0vp&MpIL+jesZ^SF)F(5n^E!d$wzxxZuR@)yNBv8 z)J#M(>ssd5A7X}tMM+q~qL_kiQA(?PgP3(zV?ou`lrRwuHK+%Hk>RPsbNy!l_ zj`P?DkCi1pd|sMRewZnCsIu5_p-sEErYb#|iUdj3Bj07658#!A5mz)BX zDr7=jW$s91%%gFmnaLHOZ<-RZMD%4GqPrJmo8>Q)u4ztuPn>LgHs2Tm>!~s^&LJ=C z&p?D`w(Mv=dvqQ!Kv8~+QU}#9V<-X^2kVP)&@o3-c=5+ z{K1@v{P9fS?O-+|xnRd{=yI^{GCKR#CJ8W%i7Ha$OVo_1KwWAq@D;@#B17y^6)X%# zIDs$Z%#0rD4evPQ;iQ^P33L2_5A#z=;7hO;+9iSOL!LhGaTj zksJ$DIzDQpJ3kp#7ynBpv}&b}%|r-pr5$>^@N>N1np3l3*qx z_YjZ!Fs~4OhlR&!v!IpF0<2OD8_oVyw_D&xIuIk2FPWl2(DW;p94tlR>kNpS(=r;X zoJX8Ztes+bxFgl0Bx0$Sb50j=^o7}O-ikm0Z^<+#S-7}^bk z3*+IZ*AL&#o_hdYW>d(G$0k;K-zI1eeN5pcy(eYvuQ$j~cA_ZT17t><;9Wec- zpi9qxIDmi6t2s4HUn1GW{xt4_8P|5NQL|j;QKPdIf`|Fue7PWUk5F8%BMDc&v=yl+ z)?w=Ql(`Y>_Rf|WAaP^p${N6SwBbSm$kT6Loiv4i>)|sJ#Vbp*w(~CAy>r|cBTs)0 zhS|lhZb~?MiU#Y5(6ht+$?EbAxx-bIY_00MzQ{YZ63FhArjRfi3qSFBxSal%0PYbI zdRdjU;ev^YG8pxOf7kqUia7kGN!p_h6EV3`jCFf`mMEAzx&qSIc_x!vB7pi{i>1iZ z;SYULnc=coOyaKQBw{h^055>*18DNc{-}_v|#HZQal0aEs^cysxO9i8J^{a{@X(F5ro$KDE zx<*SLo%cM-PJSxl$a*SmlBS(u&suUyCmb#y%4Ai>^^8`uyo3{B>Z%#BvNaETBejC? z4(lO_=u>Y0Peo*c9%C@~HdmIBy3`I0zGY*N(Zm54Z-30Qh5*rA4Zst+$$CNEi=s%F zt_PB4f1$%#@nl)n$B8YC6%XIp2b4_E>BVp0mVfGxq`0}KbqNv@X0q)s)APeY`@8#< z@yUvUiBk3=^y=TTJ{CfR>gC#iaAASOjxNK<-c=<(bPb{OhY0`JP!=bG8$Xmn3BgE} z1NQ)?vy0QjJlXu7SHRTVum0vMEUR{O9m3Mjcd7Yb5v-3N#8&CI+M3yM9Jr33B>MwiIJ5Exhht>YCP&Fz6FjsDS~{*%u3c3E%xTYW9!YT02%xkg@O%?W#slF;%~nwWF0yK(Wv z><5ETb$vO5NZW?blXnccAPdB;RVSOVo38Ex_p9{r@2)Ds9xi*}>0ZOEIOMH6Hs_n0 z-{(!zQ4QuFt?PiMs)Nh=)3vX38%20ZOoxGQgsu!{Mdm1`)c;3)s?P9ZuIor$QHt8s zpM3a;OOJ7kdL7w|bWU$tyAMRdrb*2Q9Ysm?3d-o`!)G!3t3I*CLjF~sEDqtjOJW=n z7g}Ccs`M@{?9g_|w)TF!OY=80O49aTX+Avy+;uP4qoei*Js zm0ZCdg*&@*SU}Y;>rSJbOGp8y9l`}-vx3L^x0-iM7Fb3-4Tp|IrMf(R3&JNTs#PHg z8L}O`XLATmH!#0xFqNq&iJtl^0~mv5%OtNiSNvpmEx8fE zei~+Y%6u=5#TW%t>Z=eh0wODdRa`A);v z=umT`0WhV~3>eDuR(X}m_}fQ|2z&sLzxCy$=Rqc-3j7YPVZb^dw(#zZe}`Q=Hx7ps zX1}@!G0#WRU-b8f2<<^nzZEyZ zJ5;B)Qp|rIk@Ht~vX$ffO1uF!sKT@Ra#J{1dj=SoaZ4h+j^pAJBZZDVoXUkLf@T)M zObf+Cf)b!{=38(6Ey=SrVxHQx6L0?(*n|rp_{vyl;OZanS5*tiv-xZjuN59H7(ARm zBSe(5ij9I-7Q>uY2{H7P160J!%G$E3BJ8_>U-W%uAQ#o3@g+Lq!vXuSt-|lprUZ~h zKzWrR?Dr*reb`ZAaRLYbj{rE(xL>R9bjn>>*Q4;KF=~it~Ub>ugT0-d*M5=Fe z*xUH?!QZCmit-5N^Tzeu-xB&Szt(%gTB0(S{B+xM0*&#&LBfNc0!Y9cx*0>W|8m;& z!s>1!Hb3pixW(AHBE@BO*Mq_ z$3`GzMZ*zcE!vB7ROFa|-GR&#Q;}a7(pIhTLybiqE09pyL3@Lz)-hcW3XEKOrKpo!1)8 z_iOXq>8dp02l@O_NU5r~`f3GRoA!1gSO@U{)Sd3Rd%+5LrfvgB75KQQGXPO2~_(WDj zfud*bKTpBJ1fCfcVIP(Kn}t47!Bh#2AMBD9q($CL_mE0Wm#x0A`xmOP)tE7pU8uJi zd25(2+%69sr7`HB?ICgTttL;?cd6u0B_q|sX=X+-dixPkE%<#A*;#7Al&k&jQLG0> zIj^S#uozzXW#x97gz29;8uj$>QoWqV&`_bhQZiL62V*(Pn4Ld<7NGk^iw?z?wSZP7 z@%x1^@AsUm`L<2>S1YQMYMt=?ZQQp(P;aiB}{X%w6w;)G#4oSrf>=084L-KP+szxoOxT! zGz_wq)QHuAfY24k(m9$FQs@r734Ta6W#~&p?LKqDtX9U342V)bcHgk%U9)_eox>vA%voVs!L$?1$%hwf6=n5AN6Y zZVvb-+G_n_oY29f^f_1~*3u^N@fR9fLMW}$enH~!idZWC)QzH9W4a|rm2)`j*u57T zF#3-@DEqQwkQc>NWgXTw;GtX^7kz+3U#A}2&9Y8df>c$J^Q1TjBg~6cRB&v-b~F<7 z-sLE00GTY2Liaa~z2SJ=+*A`~qmt=^j=-t49~Pa(6jmJ^*@k&%l4XtQOJ3$rnW>{~Fr088adZENnLAEjUJ z^hhEU$M#>uN z4{%N)AQO+_Aw{4l8mu8AW9> z*L0cNPM(^I^)1e~*#OKg6(v;z#FrR4EmGtg^-}w@l9l0ygvv&e5Ouqu5&;pDOeD;E zbj;LMzuTph=5Oe4>5(0g^UGaOkJ3Is)bv!+UeqkgpZX5+|D7WI(It8{&Y3vSOuj0uUm5HmA%G$v)e5#)8${2P#( z!j8i8_gb4Mf8X=Wk!DbZ9K8fSS)PHYVhBQD4n>{;yRoUDIE(eFg5XF0z(^UDK=snn zgE%2uIbqc0^|W-!6i)Q*4OX!KWSzc|Zgui{TvN{|Gw`*HmsnnDPL1N)V*6$2=1Bon zWl}xtI=%(ip8#ztl}(1_N#T5fcB|HyKRC7Y~46%+iLp%|>8GW1I(ZMp=m`O4Bt2Uo*7yoEvb z98R6i$OO$pr~rGF&!pcP23{QH^1m83WvL<*Bj5d`3y|P6>Ovtw2O47AA&D%H1&=6q zoMYFw?BDp_UfeHD?PswDh`ww)s_P?n9#(kr-STS=KfF|&-Knpdode&VFaCWvuB=g+ z)zr_e?f9gt>7aC4>Ah>I9Qot3_wX`sW@_l6pA?8uEUlcPmh||$YjojHn%ZaP#_Pzx z;Npfzjl>_A%?{xEFL044DEdEN>mBUujP3t-+tPos48XRf|`eJ}$3g z@5pW~JiJ6^b_jFu-NVg0F9EHcH5+)3_kbXR(suEXKnd7Xz8I_D9g>!q^H-m6AH2xM8vhwAM72ry7U8tpoKjr z&+w6Hc?mCO-{l1s=uSrot!=q$vyMWsm^h^H=6aaTB>ZqU@3;9wB>80&RJD6(aGoh#by4GX|mv=V5Jh1*VFa31zG} zThCYE@ktKnsYtcfTF^WR8pw_0bO2(3VG^uN()4IB9QL{~2d4l}O-X)@pq6S-4zk4| zbRXKtzgA3~fn7^4XV6jnV37Qy}H1*B}Lby??qnS z9-lsMFPFTs9M$q?#0cZ%M@HQ{w#F{-8L@?83uC6imbKSEk@&y|?;#R{EiFKBC+zV@ zz@X|EY-9z|Zuq>D40O}A03>(|r~)#z(`2X8N^^B{`I}%{a1toPKZ|E;d3pmwpx046 zM0|3H<6~z$2xcL00k!G|6c3trU%etw>W-Xc86q$d*6v_&K;C0Z{1&f9sa^Qzx`w zc_^Mm?bu=x6`YhQEvLjuh0$FHrU%qGh`IK{ry#f{q2|-#CbM3w5kh>2e{L#R7`^YW z3y(GM`2N$j#QKutl?&obCwAP?ET)Qb5f{M-KUfV91Q#YiaG}C%v4*tg9FG5!-G}4L zl&Ed1=$wE4Il#QSb)F8U-WnTs!nCV5n%Zb@2?~XU-C?&yXn$s);n$opUm_Jsh6S^* zRvanm7Fh7F9xD)VsBCZv6>@S=d9VSpw-tR3uT@!Cy@o)MxZiXB)Ge=vy*dlFV2HFeGXNz|N{`^Jro zGUN3Z2s*+QdMqP}&TAxXd1j3G=VxYBn(3A;3ant=_3WQMjC+UOn@e9;C^5nBC5_}( zU5&fAE6#lsypPrLCKtAL4!yQL?;z8<4fs_l&QWyCQ+`& zKaoV0#{xc<%$VWKSNwE&~?>-1$&VSGO zL7gF3gAO5jj*ZkCMVlr1Kp8t=Vkl|(o}R76Vgn+|_o1|J^Nb%}ODV5-L8Dpp+Vui5 z&Ey7u0FTH79W8{Zs4yvY-SywLgnW@4s~hSLxtNwHT+q1*qJKVOpv*Wm9De4&E5Fvj z(o6v*Va$_BeUG11a%{z$5mGM@G)H~T&WMs2XJ@CG3DXoh!`6|U7crABi3==^$Bly5 zd<8%hkpIB$ukj0$82>&CfpWgyj#y@MNLS=l+Nk6lThN6}dVtf`FN5Q1*4F8z?x<4m z(d9*1{;cL-+fo4tz1vz4v4UpAUJ|0R?$k+cN6lhk_B3q$ z)c1YPXmtG9$afcfioURrPG!26riY@!yBucYO4nTz?yRC;URBo+JpPbJe6%;PxdOo2 z(TwU5drfiaM~Z$jE}V zAwfVug{+YyBMolD5(ZXT>Mj6TfxRs}l2fT?16{0x-46WOP@WG|+RvcCD zhyP>)>s83Yz9qe;_#qn%IpteU*arAMp&l9OEoKk6kN3oV_N%ccR2u+U8p4M_H-%f~ z7=kd{Cq}PK)aS`C#Iezo?ak9Kttu)YSx)^Tuoz}k(dEMo$=hDJ#PJr9etyq|A(QZq zIeZs}U_l1%-&rS6q42aCUQydmkk)H4XILcu)jr|t2!YV=1VbLjc#n^G%N)RH+Mi+5 z)Gvd9=(h;9*GYDq-7Z2OQxb(MK7c z?R=3V9+vp|I0q|z?@pz>Vx1CqF=H548yS^)`#S~z0|KI680MWigzA8~Qq4AMzZ8#D zzMz;G(w);H;VpX42?&dDd&(d_>|o!qeyROo)#6cl(K%q8p&Q@-NgpSV^($8V#d}d^ z)!M11hx?s`-V z@_`=PR(9umA#N{uWxG9wq$4x0CS4*d6_zT71me3!W%ld-B8HKkJR%ZF^}P4aW5S6R*F z%;b(hpTL%pdT8%YR`OVwXEVeXSuWKDr(=iQ(3}{Zn1slXMg>E_yAdyn@P5>}fWCE!P9j z(H&z&GfftWIqYw`dInQM^NCtdyk%&}O6+B}XJ%XR^3_Zh*elh<{mYr4zV46UUyAXo zl@{~z6i~&alQK`wt*_O+SU%gC@OJS%rIp89axmy1F?9Px4*AG_>-SP<7^Qz{7NO6R z?K0<6L;3G0=W@89>e<;YlJL*zDv4uGFyCMbQUQwaUos{`nKYAg-7XGzp2-4s10 zBY*t%bMVC`M1J27J$k*r99`@r^4uwP7i{PRzU6Fxcz8V>oNUDcA9`-w1#c0~c3xgX z#+7mk5xyeEnGZ|q2PCaXxjNo7i0FTf zE2;lGhW)?hmH#J(jc@I+(RSA+~h04 zF`%~^e3bi~pdyCB+c)Um1ea3pnz|_906$xM=r$PJfp_LRPje{)Z$zlV)xga#^_p`a zwM^Ot?CfdPd5;yxI8LTtk*Gw5Jg_I0Ja4bgt{z45Im*jxmx|LrvU-X->0`QozMZ=0&ypVHvO}_6*Nq8G?+GTKG2Od=|FX zRu@{CT8lcP`;4VAtTJak#Yj^`rAt&VcLWywLb3a4+FdGfm((ab$cnun-~Bu6fg&(s z!YB_BDQ$`oJXjVE!O@*&D55&K-M~4%J$kULF9~WRBEn;0HyI@Ut3<*C`1hu#0i0ag zeS;3<7Q!1cL#};jxh%%0piAFKx5(?mh#G}A8tf!LCPUVNIAXn}V=YPwo%6^vel+l~ zLL-vAK68{p_d*b@vayl~B&ZN)F}CY$1H~=QmkvUJw1*NfZuq>pue|Yc- z6Cmi^pd5Qgz?O9@<{DessexR$}0xpm63% zgWY09&;F(e%T}(7Gk648+lqFw@Q8tOH^HR)9MF`hl&7wl9itR=KwS8LCLkBTqb;cd z`+qI6M(LeWD82g*#QGG}P&r`{>_8j`(Bsh@QxpoO#3WoQI#6MrDJ&N)SV4WmYVFvq zG>-K+=^8*9U<67oIhn^O@?tBRK@!RAaz~))VK^AE&$mH2X8Qs3CL`?Ygzr`PWcnea zBP=fSx18W>popGnE!$8`)iQ}t0U>-N#~c1Wm{FNVn(R~19#a8aiFwrAO+@lTuv|5; z^eET~oGPtaqx)JI{)|EW0%RjxXt|UEd-;C_tXSc&qO`++$Rl-Mgc#(o0(qrv)=YRi z-r^gpBp{WT2P{bli#OVstLgx;1nC6UoI~<7s~>y9fSHgGVH@9*{N9U1xL8x$*O!-@zU*h0WPXp*~qZwgX7y{^v^PKrQ|A-Crz$$Rz-vsr4^Y@aB_#AF+h@ z183^gt23R|AzN9IsC;nyxKOOEW~yurnn*Ub1>ECN+fay^GQ;ZAkVMlKEE;6!gqt1w?oKMF~P@Z<<_QnbruF9m zk949eJy2ZQHdIv`i<6Mj8`TPVH?C9vbELCJJMyvQlLWYFXc+uq)>X(4jdZbT zk#7U*t;h|56Dzrm6ZWZho5b1nmLd~MF8${Dd3j`_*@%W4RMAvj%bFJdNL&81OdKU! z{96DU%vp*=8?*uwj2WA3Ple-AB~m@DW_GlF$UF$uLeH0hoy|uLxmv*CvjR7iTtPkY zRRzP;=R^H!8Hqs!E|C?1eQW--)(Yu2-6JiIA591T28BP*f^6O>6JgYptPwAvuq8-j z_tfm;XPZf2B zAUqpTJzeR#CK6bck{bb2@eS$21R^a{LFvs53O!V)TcKXy+M+%*T}-8jZ28@w)Fs@K zmZ8hiG14x#gN;SMcg<=yC_=rv`4?&?BbbdX>%ShLcv<09&qPVHL%e2=_{fk@ezh2u zu`3p%WvzU|bQ-2CqkY{Q zFwl73N2}AoQUu5#pq-9tc@F#`hU^N)#|?>(!;##_kCi~z-l9%OM5I|v1aIN_qtI{u zO(5qU{4xO)I$haYrot3v-7-L3lX0nk2u{ZEH)sSvFOQAIU{3K&^Es0BFfpw?l*umyVB3*9NK_g{GlG?@~_zl zzQQQT*V#i=@At+vaR;FrgoMjqj!FXM0&!{86)SwlI()hypqLeLK z7`I?i8f=>jL9FG=z(p=D!Lvt30fPG(CaI^zlauY?D~i&3nA@d2^%0oH2m0P({aSqK z?{i?EdBK2SS2aeq@v!Ju`W0~cg;*0uLpvJ+d_?#_mLfa+SXiA?9FCRb*}2-%)aH*{ zxr&8$%JkX@s1uYi()hbRF*nG3?X;B@J=$U^CoV<53^Pr zjaK`bGt>qv-zQ8u`BC}mlua^R=t;hHZB~!)R};_dXQiR-b=wjb)bWIgj)VlPy-?Bb zROYWK-yUG{CaTAgADSnt%N0YJr)3TX(Lig9dUGB!=VJIY`HvWtXfRjf!Z0N>Nq&ICiNa}C*_pT@G^HS=-zf#D5doWB^nx(QG8dW_!?h$I1q}X~XKBAZS zMmVb%A@Rh1`|QtV?sUVYmAMYK37ZY73g!%mOdq+}<=$RRw-Ha}SW88HYU;6RrjJT) z^1<4;Jc75GUT>n%^st$TVzsGix>Qt~$PAvo_2D+lLH(N2f})NDvP^El(^1us6f%rQ z6S;`KLKHEqFKo&ZJL)AAKHl+=qc?M)mp1LW8+yyF+$M*~5<8zM*v9BiRWq5!nYs+H zkV^kq^3ik7xT~MF2YDUZfZs!+I+-RAdt42f?2R)r&^0T36e^cACYwP#`(@fQK8H%S zmpQ)d;Mo~p-}>u<&@1S?qsbW@>D{?70zw>$TRR9hr0vF6au;A)r9EHD>Gzsa9 zs6erG;b8%>ATB^`GhG1I|FD{0d-xJS@#Z2DRHS`$1*S%epeR>D?|=J;p~)BOC|p|f zLqY|UWV(-!#rm0J3UutAvI}`RBT<72xi3ySD7> zg5qc6WJs`X18vW|)h@?(rN5R03~{g6NB625+Jy+X`jsKw0zWF33sWIaJRwgyR69n? zC4p6T(bjU3ueKLtpCJg03Kqy~YMWXm+H|zmGCTv+wjqhcWmM*fqhl_E<+J*Rxj?8` zA=pz{oo4y9n}{-_w^^ z&)N))XnLU7!z4ZY@?SD|ll{v_H;X>Y{WDfiBe)*}odG*w&cD2g06a0Q&RR&xm&yax z7=SJ!beCAy(Wzke{;tZuac)bkW96PFM)l;M6eJO@d{b>N*i$}hy1W_Q3z&RUPG?xC zciZb-nI4>?F0rIfWVo4C3VxCwu=)YWJw!S zWg2)X-j2JsU#xF%C#H%M{K&=FE4u7zI|$wO3=TXFd7t3UZr49<*L^u2hi})rJ#`E^ z4gc5ck8#bGW&KL5=bgb~Zh>WqCMu0n0xOh&ytcE%U~1N!Q42kN}){hzBJ zliQ@{I>0zL&HoeU-W&ce&?I4OZTo*6_xS(ofEWGsp~J|J=l@R~F!@aM@_*`pt&=HY z3l5I#UoM~U6TBv4vLzkhht_n$54qpt`5dJApZD5!Tt3_QNUpMg_SnlO&>oXSSZw*z zxY&3BFg@0CJ=eKl*muOG2!PoS3u*CnHbxo5GU>3~xO>^mxYA-F+L%ech?H)#33bY1 zo~=Kouy=A$+Eb#4Zi=Gy|qaidL5*^%vF~ zwzYuY6%Fj-xJY9J$$IC*YE>Rr~1bJ zdbAQ3HghPaW&Kf<^T@ccr|>h?9Oik?tFEs*#FVIEajxDsW+G%)42U8}*?Qn#tmXHu z@H4}v?>!u+xqjBWRogjxcy>4$(eXr+6riuL@M$R;YYbVpv`$@Uaw%eq<-%GTk4gcC zfK$i1{rfU;lTv^9maNU;Q;+%O#^Gi)L$`c`rt@oeNSR_{=lK3r!gZf zETQ_0d^QX75SZB8VT|2y7UKgRr@%h~@bn87pJoV(E>Zu=8qb^B@ zS~W!mSQFWVH$6gY4feSKa%QR{W){ozO28x}SA)5S?L>Oy;}!zoA9rj8=#H@yQzDAW zdqzCDqrT8*Wf+ODPxH1h#H}^f(Q|*to*lwzE5)HlK`OF}y<`SvEU1CBDacnsg;&Za z8PI{Es{~!3UJbl!_AL_Vg#` z658t((cptMyn-XvOmfX4MIdK@xJjZfzlA_<X#YP0|*_WkrT#91Fx-cf)_+1fZ(; z;?tCm&1fG7Nx*Q>2B4PDjdL#V9uP7X%i zo%0n<8u!F5J)VE3wAundCStL-%`IId0tsOrLSk3`G)h}FI8A%Roi;UC>cEPVIgRQQ zd3)hBn3wFLZUSMK4QsFxAK+ny*vMnua+jum+R^Ppm0hmnZ9RNtvW zOHZHxMY}rs3T(-UM&K8Y#*V>B7I~K;W=#P~LkWC7K6?qUYLg|JU3WZCUMGH3yedWg zpxH{8{JQTVIN#P{oa)P*&w{YVfzI8$1xBnR>4iQC2&3({!F!nmO@Iuw5!y7QV%5(P z{H-jnYRKK<21v5%;cTR);+E#A^#s^tNZ||iB2KI4kljsz$tF;Bwe_H7m_jZS9N?xk z!dks#v^Ypf3F}I!_Dm|AeLg7sI*c`SkQl| z6hA<+1$54{obW(*=;MmPnK2>=AF>gS>9u{+{mu{jov+>`EEOPBI~OI>*>}F$Fj%rE z)Uu`}*zh(em|hvR%e0&zGVCi{qj&pdY)FJsg0r&;qqpHfAN3g9gH@n~Xu?cAk`evc^b$+fi67`x33qi?)?ujr@EB1z(e z!6+mD6FlGN7&zdRiZ}5Ub{9+ruMl7IiJ3GZ#Bs_Fy=|ZiDzOI@B-cq|A2t6F|AmMM zH5QHsf@M_NDWocDf7}=A7Z)Wgr7Hbe)I$ma7}t3>z5k8b_{iC%magN0G($Ckji^vL z;%i5#c7sXx=Wt)U*N)38Fv#-x{(gNL8}UUq)YBpWFB_oIJ+yyiWk?KE&BXiFE{w#n z;5APECRtc(ps~%cUFu2+3K5TDgZD64!$Hm#c~1#}gVfXCK}!7Bsa(Z#i*#K}{_UDA z3^|8m&9$JhA+bhSgLABGF=jbB&R*WlN78mdVGUFJ7deiTz2YQsmt8F?hOpT3bVVN z+O6F3Ifued?5#&TYBEc4!+Ykq5_+;9asXVJAbpV)t6CoNbF`djL{cRKoR=W5k(Ck6 zNU|xXTmoU+BB&Jzy*<-?_`V0@6#B%I+O31|OUQq_rAnVEfP}qY{L!_>*d=FUXB|X) z)Ps@cHue&JR|C*vn?r7#UmnVv=d1L83ukcgOsG&^L3Yz<7-eO{yr8G9;bWSY=mcEP zSt4fYV^drHq_)I@M;=VQ5AH4%^MFm#+CTCONR!#+&-Bv?ypp4asOt;`iR3slU ziE5Jce|nxn7W&f&hA6r>gVW7t&*P?}#qnkl*-I*My@@L*?Jd}&*d?r(R;Lu#qfM%M z%V`sgBNRBhu%Z6={dE&3HCCIKn`4FR@gTKr~K}g`^o2Ju}B>j>KCA+=vDx_D}G&;=r4W_FM-cxw|&m zabw8bgn?uQ_Pc_i;zqF&&0t%b@;o8lPt`7YZI3Is1orZDsg2wn+Yl!q6*QlfD4iX{0{PeU{B9>v7n>u}|2~ctJ zFiC4L!+LkGzL2%f!N#TK7tsbl>&V;<&0SxF6OI9eITfHVhdE4&y;TJ+r|k1ZE6%(+ z79lJLJ1fjp+8WW8W*S{IQ#I^r)gM?x3`MT(^Cn?zZ0+Q0CI9KS=URPVlOsWiOxK-i zb2Umevv=~-GYW_M zLZG4(G?10~AVJ)b+#Z*R&OmLYEHFEjCOHmWDH$#&rtrC@GmYdPuuMbJs-@ei)Tk!- z(=>^xH*w7-d@il$=gM`W-bYFAdrogr@4@}-R2|5&-tVuY!ox|US2?OHLjs-)d;~95 zl)zx#P}vDm-fhDyp@6A7@WT&yzJK3aybDtR9(*MT1&-#IpI$DKM*qCOEZ&_c#C^Oh z7K#>AYf3wpl+qnamx&JRCEkL6~}PGdXYcLH3EJ{^6fx3ki)4qu0W4tkh^OvCpsUn6W^KocXc+ru#; zv&gZ8-8rPd9sGgIHyGD_4=)4ks1afP<_Dr~*6FW95tQ4tdqB{zD{rgi)6%@P94T0D zyP12o1uokz_CE8US`nZN5pTwZ{aPL9LLAwoC?bDJ`jLUJQQT0}x0u!T_NGmC9dSB6 zZa+;~y z&hBbRMNp|hd^q;-t%i)8R0`v@oF%L;4#;xP02IVeJZzC^1aWwP8DnXqcx4!KF%)w7 z@iF|$v(Wd6(BFmHvg-vRHsYlT7@dn;vk)UGHOZm{DJSGw4}zrY{K|~|1B$RX5RbRa zp}MLYw4ixhI*ENFXnvc_mL35kb0#i20hg~FeSNr`er}`)>DS1z6=-3spLdw2F5#_B zDWt$~UP!$;k48VhCJ@Q0;Ol8HK`9-fo@t*D!<6MUlkBmNhbguNuQMjVBMwxN$EU}2Zzw{`&Ek#b6VF5C#6^V-dK){TyAHyU={ApA zd#ty0NtVd{cumLUG71AdAJl&)#KVlqS|*KR-3eB?5x{Nxg!pO-Ull_-xZBt?0#$2& zeKyLo(5pq)-KBkfkBB9-ov00`Fv-^sN1SP47Eopqg5MI5z@`ni)BTzJEwM_$a0a$RWxp3KdR-Icv0TED^{+Bh_|Z5c<#c#( zz&Kjki62$Bpky~WbUTRfrHE^p--ThUp|9HqZ+NPktIY3Ik%=@$lOMQeYC)17Q$2m3 z5Hj)qR4KQx;pabrJON9e;%oR$yiR7pwo{IRF5ZjBjpGgd$6sYNV^SlNOdzlL*)6Gs z%(*YA_3`34bC!%zslBde5YwZMM$7>0kOgeZ5Inrop9jy&`I9Vdh*HHx^O5C>EZXO2 zHuL2~cn7>DFkC;GHYaqOYMlF8%CrZD9S}5rOgziywF{Ubgb4?}b%VR}sVz#3$s}zd zd_&0~BFxG|oakW?dHZtzHXabEjt8S1r|BfFXDFuDasOHn1H2J7!fM1TS`MKsuYYK% zvZd(108@Dpe^YsCAjC9^htiMZyHxE3$`!1~!gN^H2}Bv96a(0Mu#&D~m2k??)${0y z*JO%8wgrWZM3Tb6FfZ?b7{SQWFd9GLh-A#wquec;m&VHIMi0rj$BE+nCAMBo7Uyej z?*IuO%>3ugFQY_^dStv(5qmLdQbk&=1|zFD*%e4Qy1(>2od zR_Yls%kKu!XcgnI6ZUqz)}?7`@5N4_6iPaZ>JQIO-F$6dX@juGQ zEew;?_^9g@W2w+yq|i2bVq5-~)b+cT!G61U$?~aaFNHJ@dx0dyq$kr>R7ovh9Vr?3 z@La#PQfu@lbIci@)E+=Ug_S!CS!Lo(mx`)%65LF=8%Kj_5}yiwyY@ux?#Od!%hoG5 zE9>daJkfG{3M*Cv6y%{kUVoESC;-=3R>y~hoOp?Tv*!sjl}?aTRs;*MiCNIb&DuhB zqTk9=h_<-Fn;fR|6X^;-|ym=SG~HwCVn zX?p;op@lwAq2The6-pN(n0Hk4T)!wsI4y3I@r2huRL|7|0zooIIbQTf%9i+&Bi4nr z+XLjo%~_t|ewSRjaNO#^wNpga#<|!G_e|1RmWzl(u*+PZJ%*>@)qT?obt2_PVUeh~ zp{l{8h}HQ?cj#+%TyUoSPL#u>fJMgwD#s zP`h{yU@r9n1g7|3D5&+O&eKR%saxaA1#ea}mvxK+y1XhE_RkkMhU4j5GF*T8D24qn zHeiSIgefYaiLBg``ks}G{|C7eU$_RXZm|YeQMuO2x76*9k5kP)_u2a4tCXH}-zyJ9 zo1fwi{tR7|vv*Bo60s>c<;CoG=YXr@NQQU-pr&%~t5dn`nrkPAXflntymb?mrhu4! z7O=Ff`se3)j()s-h8Q{db|;ziat2M9^sl@Kl(SFyyW|>2H(DkzITjI#wnQ^UyxW}q z*~(1-+IKk+aQO=)Up}f}j zfL!?3SY%7mi#pKat8X7!N8Sp`-O=s}ihhY4waeXjH@YTCU#YtVGTs5@Zwc3}m(X>` zlC@sJX*s+2`WeSdrZ;nSPQje8`&{Wi^`zr<_1zhTfO>6pG_sYn4H(8Yw8jSDXQAys z2R%E=?oD}*j-2bDP5E(_8p1oFz`(>mN3nxb_#sx8`cgAzR@ueF6;+z5^G4+xZ~KIJ zopqmJe*;tEpDfUiFkil0GXK{tGK~@+?7!aK|K}R{|I1A2_}Xu9paJXKf!_mWK#Zsx z7Mo>^>}Ot^HsZ1hT+b0t#=N%jAcRo5uE7WD&-V^z#kMk{T65aU{-TS%@ zsCj%`om@9xK3R{Mm>*iXHk&(5|sDW5o(Y?PNJz`dkxoXwwh z{hf^+Uj_LMeC3U8PfAK`MLQs|O8O68!$zpvxp%f#_j(7Ra*W2Uw#dPKEL;Rq_))r$ zr00RkiO2*0rA<=rYFyzH!iIkCh5gE)hEDvUm;GS0K!PF-R2cV2_GIn@>S2V6_t zJX-?XM7@dq46yY%8x3_UfLn4~XOBwF#hwqtU2lSaCj$N969WRibcZ+>boF8LpdzXK zH*W;F6@(W?oXRLWW=j!kV^$V~8h-@OOt?r|ZFW>hwahe&r9aRu#|5vTc<`UH!uK=I8~h;7A0@s^>T(UYg_k$MzFpfR@UMRKx=7tApEml3Kv0n zYfU!cV0I4PVAe$u7^@I04`J})TNj%CFeH5;6m8CiMF_Nb4MQ0E7SqWN1`2ih>?VnO zXdh#1{nph&A9GQ@!~W0}+ee594#L@Gbicg;#A&|evG>;4TGFqOV(%`Q06S^{om}*F6>5jdp>)Akl);wWtU2b?^*itK`@&)|Z!YHs@yT@= zDPZ03li?y=_dHUdieYiTJ}&2{zYQF`jAiV}7@@7(#ybXLA$?0&$gmkP>YByu(? zE;4CxfS<)KP`*tfp<^K`SiEJqflI#<9iOhFO>&nkoCXUtr|*157;T!uZo3<+#^r#^&)qBWZ^6%GRB+gkg@ zvR-iz#9=v9sCI|qjUXUaK6L%2d=cP@qQ|T4zH@)H#mAN$z%kJ_&%(X5?xfje8vI#g z1lVfq{nxnxh1P4C1yT`iCXi!4UES@d&bOI46!xaUq%k%SedrQM^+NHjy_Z7p6_X-NP*`KGmC^VDX>Mt2!j8Gt^$kQUs458;^F|~g+jn)w`yo>(56T51@n2j;Ifhu zN_vZlbWFErlIaWVYYU&lL7Y)y20XYV+R2IExDOzHToyUg7yKk_BImUvggNpd#?#lK z;qfpPonC_U&$~$J-(q)ouztnc3BUm67Fg_lC+`C#;eFVna-qp%e}*?-Gt16hTgRMt z1GxWwaNoG{^QrP(%a)^23kCUUZvbp|r)-Zm1&69e2FH5;xZZB+?d-KY;A+5jQEo7X zPyh>c`K|n}HlO_0W1%Qff}uxT2J~300zDQ;V^_#pyNW{wL7#5AWqKDib}wK-IQ5wa zdisP+NFp&{!~?oofdWTXuh+kNjUO2Sdqk*00`>rIBKOW{D2Bak;?ysF1929!NEYOq zB<@7#L&K28@;l8Ji`x0Ig`slF3rh3ywG67iJP>)sZw?a?Hc9vw5iAD`6)k3_$2%;! z1Kn9P7u4o`kZ{b}vFd$Ss}HrD-H>^Aip4xtUT80N#C7+!Bj2TQkoQ3%%O@`Zxabg^ zPB&?y=K8F=T9oNOP12Tb8FuyLo)_p}pN(LJ! z_@VhtmqtG;3&aDeVNDZfBLmDJv8)0&j_pEl&5vRE@0ae&S%oM&m=C&k59DZ&5E9NvJC3 z;8McK$2WCml3<@glvyi^9@z?1<%|K@`NoKmoNsPFHX~YoF!s`8)06m$YLfUctj;uhGb%)?RDV^ZCIcfG-zQ!uf^*ANd}v;I->6SXA$?nXrY0yaJYdN8B);uH8a}`WKcr;*U8Cr_zAd7lI2XnvBQ0% zAUfj`ATw-188EXAAhCg$&`s044VQAHqFOS`REqrA{uaT0M%2GKVuPS!79I`d^z3)Tx$f2Mn~yQ|w2PS^Wd}1$2$q1(c8jg|+`ErErnrOD zK}Gx9#D$6~Xz6G&nn&<3y|F~tbsx3~f5c8UMKHF72e5Eq+;t9cxSy_J@lmXF$V*2+ zrMQewm>+u&p#1ltdE&~7_Wt#eoFX6DCMqRTnB*1F;Nw1=$`ra5nF1HRU-pV=_0D;& zSL<^0zOd^d3YrG_KDB#d`bbY8Q*LmoAo?3NREDxc@+sNPbQq+&11otNQLk$BHkmQdOLN!z%hj`ws_7T$j1Inc)uIwJ;88RM0tJPVWu^#jH{=>w(?af$ z*vL1H@Lf>xS}u=JQmnBtXRq{jqYBO#7FpsZY6&GKNGzqC8H`+<=z=v~UjtpZ3Y9Hj zg)4j4t-3vwX$WuMlqD0ggX_YlnwY=@q9?UmA8y~GqHv|@J+ zW!HhP+#kFQJB=TCS9r?OhzfLOaRU;7#}%Cota%_pD;$ezlCKb0pr^wXKyioX;g7RG z0W!IcU$P%APf%o)`Jy!FS91P#R*Zl-mSd2+*Sm4dzkf7Ny73$yyqN{IRxJLMM2>WO z8gQV}$L31Y+$}~4-Bu(zbQmeN;<`AkTju1{bz-CQf3h@Tk`XQ`A@c15*c7A;*GX?0 zl3AGOxA4u~txQ2XP3d*i085MJCE#bTBh9a3ngLIysf@5^-6E_^P}23*@9=A8$nuz8 zrr$Dmz(T$h(;Qy=)cuapY12uj$0Pl{VjQL!TPcY~M#D&&hN+Q=Dl>Dfu4Is5_3&Gu zV{TW*sY7Dz(WQ$)777jl;APvAu!MQ8d4xm%gktGjpb42A2dW_FP1=i&P0m8#38sXG zGSU;DD*Ua%k^IxHfOi*z%JmbsLox4Wk~L`1>KU%X%8$Wz@&>L(kEx$TW15M@l^=kdck@{h;4}t(m_VfO#k}&nmb76%7!f zdwi4YofcV1BaH0nGA$$Tj1ktc31;{E9=w$fOQZaxc5z+-OU=bTKI5%HkwT&`JWT8}1)3wT zv>LZ7GB4iKaJ=OnaHnY9pXo=h;xNy9VgC;MX=Z8G3L z3{ZTgL0@ax+)zZ1!{|d6bJFcYGyRZHHaV|);8iNLKXWgv-ic`Rqnv!rp#mO!%C1C# z>iVm@7Aon_hb*OKdvQ(R&tzg^;V|`NRwOEM3JlKg3-XeE-MSw!|3LvvjE35c0TWs; zYX3DV{=bB;|12C-TnwFD{#Qf`&)R;Y^$}RBDFev@8&=lyrHkM{Tw)h7IvKrW01k*2 z5v^;Ji4yaUK5g$$-iT5?N9su~^zr$UWQix&@h84ikH5m29xb0{&zx^ty4E;BAy+uGbE)#r%z6T?6r@K3r;QLL$sp8FkvW<&n1CJ|DQ+mnt z%#pX?zqRyy+#F5Gp+Xk(X23jDilEE- z$y)HP98og;i=&k!v!S4UqIl3xcMjIwXVy{x=;Jgbb$aym0G*3%uSOWm`diFB=iD)( zwQRV@_8Y>O5Kd=F;1{T{0;~kcmyP|6<$;;U)DidVtB(R)B1?sbUY{GItC0b389Qz5 z<%X*yS_Dhq)%B5MU5j355-G4W(^oy?9fA7*kIuje*}M$@*ITxG5s)N}o2HU3Q7$<^ z=e{{D@szpl`cUojnv0V9;HV2L*eyL19VwVlI-l2j>kIF>jl>j4T=*C%_^l$j`JQMz z(7nNINXX5FeQnaO)bbUmGjxfw?=1cZb=g=cc6}e4xRKke!oWsGUMW)oZ^Vq%zQ+`$ zQ!Dk~ek`vq;OAfv1>mVQWgjAa3$qsC^n=(^?#i#5R^_zHJi7y_t!s|SO; zrL)w9tfQ06dF>78?te1$Vr8R5h?y+q53~c1C@Ng=Bl?!QIX4aLI7kmzUQBsg zbXB$nHJ%bNzgOzGTc}@cfJh2#0DR&mut|g2&h_Mb`JtDk71+ulYVEDRU9l6(JnbNO zXYgfaf!1DX$%*cER?uVsw@NK2^_ukV&npt0&>slAD?xPiZ!Ts0xuQes-f+1AY4{9l zA?CIy)&O(+tEI;(eLW3AjG-UdI23|P%$ zc7PdO$$X6m>9`A4gYm>}-MX56QM>1Acb}x4* zODeHtr-es0MD&JOfBT_T(31a;WE{=8^p|A3pmJF=SvSoZJpK)X!jnIYcrP}hcpsrF z^Et5#T`!m;wINIyEq@IZy;aDN7Jb*ChT3Lb=7dI7}>0UQb&r`K3bIzdS7bjtC|qQqBo!I ztA!y&`xB0qIIE3pkpJ4Rw=PrjUTKV-P_FuW$GVFPKlB?{f@32xlzD55kr(|OEjcED zDPkayuZn}6vI(w^Bg~`3x!XRuW8S}Yb@*6mgQlU8xE24+CG@clO5n0-l0Z=w*FHtx~uuWi5P& z?Vw2bqbljG6?M0KoU&q0H(h+=!aiVzNbK0p()KLrids}(*cYBV>{&Qlf0|I5*$+N` z)_q3Xd}&QS`^qG&Y;FGZ$gxahCbny=n3<7(kS+(N>JX>X0WTKw`$BZ9ya>66#fd5=_pF29Xb&W#GHAPBTMkGq@JP8Zo$hz9zszI>ppr zhIR=EVN<6^Oij#oyFznr!Fg}d(4lIFmdxZvrg%kPaJgW%&!AzrCjNM#3Z?4 z-h%hx!(;1tkL6VpQ!J9#?K6;!NCa?=C(I053x@)xprr2iD+*&)Hk;gcM^t`m8kvhp zTH3sH>P+L*FS=DN_ISFl+wR2AbX8RyWC_AS+Tb5X+|=BwACXKs0A|}k*b}j#U^%Ri zsya0qf$H`Kr8pSYev%$Ve`;He4TIEjCOw>XHmWu4>%syFM0<8M3!Hw%6A7ZJd+dcw zwlIT!TmdI(g0rtmel=uhbAVF5&5^!Uua~8U9ob`vWn*&!RCQvhd_d@F+MkK^G>#@N zTq-Goq@$Uh@e;3TJRPBzJ?JqzD5B?7Q_UmETkqs<@*BMAV1l@-0;JNCx%}c5NGlchzd9S?rgC`zf)RdQ3Y;p6WV_tex&ves? zH=+e@jCqt4U^0^od=SbAuu9dX1&bfblhn`jCKMfV(AwDI8%Fj1{6%B@(i|pVm%N*E2{`X&oW~r|%Tcx)|m;Ck3f5pxlV$v{+KrbY%ZxN2*njTTIvX ztq)}7mcIU+?jQWHF zg+Q(;KtBD=|HW>fYI{1N`y{!xar8yQNR3X^x51z!{PW|tR%@vmu~VGvN?a`=Brtci zSoQ_B@orT#fJ#ZQ66>W4G6i=CEvbUW;T>RYs}FxSTwJg~N_`fOIrO&>qd80s%v}|a zFe%7tAxm%P)rh2rKGT>8`85grE5uC90g^+O^XWr9jTTCir(DMeZ}fx6>hpu_Q|PL( zY8A9n`tsg%D$CFAMt&J$Jord`oOgTsIKHf6JUkP*SPJP9uH!-x7{8`XHAM-u$YR#2 z6uv+yy)Av$vzX15%dp3tBvq#e1?-IM+P4jMHdDP{B=%Nwy|+XS-_0;%t%TFY0fi^3 za|zsq-J|A^+NdeB)UGr{3!*YTNu86Qa;$r~+*7h&XdpO|vJr{(+++z7(yBB~_L2fc z^E)H&%$+vht2-fqk5IV&;=w>rZC6Ti-ErQ|Oif=I#&ckkNA&BPu!13MUW$BSp;mL^ zo}Nv!3`Ci9(8mR}Z@}d`XpgrCz_D7H6Cw!>1^cL5i4h}{TLEhFHhs^zH2zJpms=Z2 zZ+efCIrj9Pmbp?jkV1D;{4R9Ge6T++A)-?l%qB_1nHb2o;Zue=o*dJbomS!Rq>&sK z%X4^f76pC4r#lTAH*}dA#%#8ap9hCGMMCNt{L*R9?b|u$bpaaH3V-y$aL`;JoJ93-a&yc>$l~?rsw* zv#I4XDxHXuz`2hp`f!x~e3fxN`15zGR`8gVH4n^YW&L+HE6uWVXwX_?4Kg|MXe#9sl-OlFYPw-}u9dw-b%aq}o7X zT181b5dmbg+R9J8ynI(kfG#c)`!FDcV1H|1!ZA;y_3YEW3UJjKHYBpua8Yd^Uy!df zNFGOu+j%*kAy)lu@-+5rdvlYEQ(K;{c5|=f>$p_=MJTY)GM3i6q`mew(>j6E)se3r zy~+U$XrV6rs}_HQSw~GYXVGPMW8G$?}b-mkq4`lJ*SrsG~89xMe3g6Wmwgz46fp*9^)@Xs6upErD_1{->h0VP5X4&URHgHs z?Xmi>ur}dciAe3+w9Y{wLoEl$P=k#PqW#BEJ2{w%<7)_jK_gPsr8YYs`@V32>TTQt z_!cXuLSrzC7az0+&NwYh=)kgUH~MTx{s-Y#cm7bYqu~qN9yX~;E#q1)Cn0qOCIjlv_W;^)!fGUCQR-@pG z{n1v0Fua^Ho$fvZ#)9h25gRUjSh|iLutmO~RZZK|%A)ZXpypPxQX1uj%3-Df+-n9H zLQsbTm-8npJ^BXbP+F+}2cTx<`4tFI1BniXF`pe7=r8*g`+G|cFmBKe;3hkJRS(E`v?7Ou9EJmSTAD`|S-lX1Q!7m*dU=5led3nO%Zofd$=O|&ZQ+|%kI zI<`sXKOnL`wIz9ZN|< z>}E{K8t>OhY;=!C=&x#ojiCo^-JN{sX)I2|v*j{V72960B6wdQpf(rDY?BO^qu7$^`Za zVrlu^N0^xFZnOvU;5+@XBb|1)ksxONx*pt@1FK=r^TEvijSN) z2k@U#3+a_HwhH0Dd1*5H-@H@=?6iyl=cP^=RH(o6(%(*t5pZ7m1a?|v`wM^wHT5%X z#3&AZE)q z4@mP=8JD#%j*s%nuyN`*BA#v}TOU+ziv6d+LjyT-17{6V3@ihSO zR?GtRQ`r<1lQeoi+|-4qfQmvrgC-48_{>>o7?Q_qV_rK$1_&THI6hnMtIDzGg4=k# z{f6DB6s~NZ8y#XSEE0aNN}9XWbI-#*DdoD)A~9(d#R~`q&j@R2p+^GJ(+C0uN^C&% zBW|iXMCf}JU?w|e=GP3JOOuXyM)o|-ehRJ;!jJELI^?-*D3ealXVhEi8HT&f|6ZCl zgk@Tll`BIvTCh;9p0={Ga}K@i7%(deV_`?S?@N}zwPHa1OHZSruGPX;(F2uJ$i@bx zoMT|C08H{QJ*E71I8Cm?#F~=2eEH?>fVTdwHU)>F4kE=0Wnd&rj1ScpAd6>W^w20H zaYviA2Qj~MWt(tuJ^ehg$0%xrzndoF z1iaRJ&6BUP)C$FrjaCHySRa&TOs!v#qOf5x8icPOr@}PQ>ssbX7sd=#8K>u3u4%jH zx2Z0>EZC8)i~O;a;lgbfW6&aE-nxb?>AI@}1SboK{6aQ`Ac~{WU7*wn&I_p^PsuMT z8gKKe7-E&kWdV`_oF<4kr}nsqDamg30Tt_G)81CQ;ipV1zxdT5+cPqw#v{or`BAk$ zV6V0bD6UP@y}a+f_+*?H6I}W2teOTHwncgUHa!hWGDi&=S?d@flmt039^0S9A!qvh z;)kE9v4|Luw`FCgc(YXNZs6w&ANau>#C5T%Uqv3kQ;@OuZ_(n19@U|IfFvwQ-uh{Ie#dOS zF0qHEdyp;dLfI@{3UNp<7P>J2XTEd1%f@i9uhxo&!$4e07#992*ah#*(Xn&KsSXn7BgVZNqiKe=o~70?&O%;>tZKS# zHKS1B{mm2xmAj}}Kd6ZPxg}deg^i6#V*^bl6Tp4_w5>wI{LKs@$PI);k+k4(>Ur)GNP_Wo** z{tv!-7IPho0nKHCR88w`xd9Iz8JXr+h&$cVJr9bScWWk9pd`E7u_gn`e zmDc;2Q(wQ?#@9>%*zwY(jRXe8CekoQroP_{743cAOc-O0ES_XNEe}65X&eBnEq^3^ zUAFx#cj@)M=?; zS~f+}L@byhvb#<8`_?s!E4Uh!(X-owE1(A!ea{1uHZa;6elP<323=5O;An!&muG4{ zFS9ju>u%6{q*qXU&9~N(^I=B3tJkE&fjEk92Uk5RCdQ0QJ@59~zJ+M5^aiO$LLiVn z9%sAItNdjt`O7}VuAaXUz;s&+*lby<1r`3wcN21~u)`&4W~w?<5t5I>7?p?wz)Ocr ziVOK@nJcIFHH9btj4Cq0K6HO3md6WeGbt4qCFazD6i;o=@t2_)kPUn0N4MiA2&#-m zapI%U`Am1q-}BgMR}L_Gf67e7nFZL?O#_o?x-pXZ-I5 z!D6c^vCP{NHeIVpfGp@?CZJ9fcn9f8`SUO7xEcCt!3kVn9g8FV*ZwN)S_0z#4rO+B zrp7Lo_I5%h|9d9W_Ey;dI%@J13cj0n8iua!DXl{!dW+=K^Ts$IPK8ynkOfDKQH*e?FY?;Ac<6xdD!(1TUC_QvkYWi|a+ zn^;TRHpA2nKecmU{Yc67eT}&3qT9;>zkBL>MPvst2<*QU%+l+)Ew*;}@`3Ou<3N6X zR}^#k&g(+SN47B<+aQ*CLU{&NTKJR7hvU%IYABNBj%2~gwyCoviq*3gASZme1h6DC z0~TjyAjm=Ut%B9imG*;u6w5*lD}no~P#|Mq*%IrojWgs@(&R5=Kw1i2OB2W#c*dO{ z4e$d&EEP!cGnlFYN4fOl0Vv}Xrvn7@vwnjg6#?2fbw3P#`3*j~(SM-zYs!a&8S>p+WLg%Y z%V|jNLg)0yO6I(aZQ*WhRNE@Lqy6dKN&^Ewo7&#uv~S%x_bn|H=d@V78_y^#*5_!g z_k_z-c$Z|_+0W>8Uu^^Pt;eH1Bv~w@G|07p&_f<1WAiJmq=he)QU|=tqG=FZH3+zk z%yvc%l*(Q6l09!LS zPO6t)@1$FLcZCu>S5kG(^6NhY5woxy>y!N?T9I0aP#Q=W@Br#*q65B)gSr*MZ>~l) zfDBZ8jR60~n<2UujP6`m1_FIQe6(oAMu4cv#X9FQFD~&8ntR2@`?~#$L?e7woUmO%Oq~~?9%$mE`fK9MjHkKdlk*I` za!29b{Q7+$+#)mXI+K`rOi#~ALl8Sk#X-qfg9uM@nPkfl_Rd)8OD7&AZ}xC%JQtl) z_}P>=_udE`G&e(pBNr8-hMKZz~ao) zmB|F|)Zgt@qW8`x*gwL+tbXKQ!T@#*Y1wVYAZxbi3dZ|z>DS;(8$0{Hnx2mfgpWo) z&I%nIaUpLy`V`ddOQf2=)5CAqV2 zo+#vB3>*Xy12+N0z-M zE}B&l`cX z6jUHcA@s823NaD9Spkq4`OZ|XlXgvn1w1dFispOWh`E{_(<&H5u%W!^!?ag61#a>X zO}?@jQcE7;UG@zv2ufM}(P~X*vx`X^5LV3M=}8WVY1W+&?CIo8bIVWV7_*%(47Uz? z`m5qBlEGNf`K?jq(sTN&k`Nw<7ce14oUyT)xR=hqO3~~m17yPGYIRg_XXmV@0PzAd z9bh%n4?N8y6dbeb@fj%~4Hx6atjz%5YsVE9?{9J`W_x~r`!m7vHF^w%%5>Dux!$Ob)G9AA09LS5Edy`nd2S!mtUyS5bv5eqF~KO~S=^sJSmx-BXc& zpO`|W&eGllpd60Za<;WD?QJB^i_DEB!}VkBzZ-orVI7QtzxbTA`>N(%48O>`d1T_Z z$Y*Uaa9cfQ7WY!|53=Qixy-QM&(SQ5W-~{F@Mt&eB@4?=+Q7=mmKwEs90r`)q`Xq; z-hV@y*3k!%gBX0kC+K9MXIRJ5)dS^^i~b@^IY-Y1C|lrgxT`s5S{qNHr$|kjmj6S$ zt6bWqp-~NPgJ|aNYg4B}@y{{WVFV@elE#~&eB&>!fq>-~JwTp1N zJk1ZKO5u_p^5G$0-@y_qd3EUSKE91(3$P#wVcp8JU(kCk!{gh&f2B5!F&`+b9^`8X zEkQKt{k>;n-9-oF2+a4J*ccaJSWDiJi3ptE0Thw)iwT1bHhwolhK74@OWIoJ*j2eB zqsjFC^Rk7TIw+XNYO2$iHxAdj;XJ%;>&=>zGzpv1tAlG;*9Fvj#lB|a|Be2DYS z;xMu=G9FI{uBuX$xGKKi^C08JkHd;P5u&Y>_>-0v{RG8J9~}6hsxw$Dje-T=u z;#Ea@ls-ZR0NY|+Q8=-8@$X2}l{@ai8-v7FmR+x!64&e$tE$`q^G=FY4VPw|S9HYuQqs%k7 zD;z%Or^5zzFws@wAk{H&&&(64Q$*) z+aIhc=c~VOqL16`M_A|hRpifREsc_k~`yZ8!dh8_e^ zdpSM#{;fS|jiw)cWCs*(e{2ajnXm?Bv8Y!E0xdQ8@%^&8AJz3=hQad54f_Lmwr&$+ zDybymXx9#{IV8q!MLzXz<1q=PrZwqpWTxZE*SQSwEW z_`g#t0|IGqUhhXty^%f>9v%x05p<~397*(lEC`ZswL|&3dOqDn=G|*u56H;13_@t2E zw(_mfVzkFcIsUSa=!yq0lJBdHHtCe^H%%T3DVQ)UxLCcwe1LnF3!{V0;AyU*?Dq7} zwRpM@(?g5iYr43c2_FGCuClm0y&3uQew(rAtjw0i%|^W&Rumy(TpE(f42GKON6GYl z&H(7;1u+TTyn1FdKi_UQSN8pgM49M%6skH2+)LE%JodF)BF`+QM%L4!T25DipNWnC z92l{z^%<6Xb*ev3bgSipY5~VvS}}i)ye_65*2{YJx~K@Lr!w}FE9jsWq~a_75LdlJ z^~JRO=eqx!T!bS9D6aYZZ*fhUf!P1Eg884@zKDgXv9+m*l->WbQvSQ~11&cHedGVu zPPWC%n}b-i3hU;0{!W^b_SA#*3_=-|!%J(*m1)D^`D^Re92QbDQ%*7#s{imhezH;~_ zKlpYm_DcDsIU5&g$m2E(t2APP&6GI6*aeiAMDCW;^{b0_O@s6n`}>=j1R}Bxk$2m6 z_nJr3M@A&1Zi($I=~!fsn(+65gP(#9BqWP#<+c3);oVRf+!Y^oBPDB8 z;x->3BLnkCxtUvK2ZF^W;)@bF4+u{mHq3n&d=*}|RGbz*o$GutpJ=`VmoT>)=mGr@ z2WT7++)?b4=8GV32o`Za;FUxvrT{A9X?DVuF2681aBv_aZh;n?yiP1-0~i{LU!s<* zGiZ#C1WC*;Lz4aS$pKj&%s`8c6KTR1E-4D7|Bte_>Z(IsmvwP>cbDMq5G=Sua0w2< z-J#>|?gY2s4#C|$xVyU(IGv0!*I9e+i_=andQ0aAz*F_rTjfI9pLu8j0w&=6q$&WM zC!x>8HSaMmFVDcF|1p*jljaOd)hy&xrsc?vYwk&ZYB#CPw^Qv&XjQpMFEYWg@|mBp zD~=w}yT22wZGLh>bn08Qs-R_?pJG}t!LOh~wEbcYyp|tuW~NBrC;w$CITn_ZLcj?_ zwGE>)4}k>(9p50`l-m0WtbZm7=|-Zi;h;c@AlQDcRg!=F3;}Ewi>I7eQMrq7_xge* z2W%F@(==b9iIkx8g5<-}!3AQ!*lyW|KdSbs#Dn_-EMZ;NjW0El+}T$QI)51yXN`SG(5qhYHr#U~0dHzGvc zPM`kty9JvW|8K9D^y}X@81R@K?I??3oh8yZKM}fi5n-zug<7#(u$0IP6q-%NStkkX zD8zu56I%p2oU}^V@*@PM$hZ@u-D+}F9WzuNyWHZKdsA;0dobuYu&32WVEZ%T-nznO zCMi1*`|lr_VcZ$CC>H=A_on}FzxMM-u^4Y9uvmEQ;=t(%)Ye>Vo8^i%dp~FV%h%-SF-ViouUa~{Q zReyxp*QbdfLK>^dC_u%4F^|o7?v_bi;dOTkTJ`gxgLykEynvJ2|Z(2Xn`{G@>AzaW)%! zP%gTTu<8Ro+Qh0>cTdNW&X&P0l^<4f)s9Wkmkm`i%&dp#M}2WzPit_OyFnjYWzxic z3`pPDaft|Cx{DOYM_5%Rl{lZ1B-)rkR1|MFSvMq=3T4_cJN<9m#}IXZLp|yHzvLBC;y$Hw^m04VlI_DvLCYt(p2QE_7rmY4o%x-q1jPN58qg#WS*#_@^i+lZ zYLDB>qn|0y^tv#@F(0@u583+{_vILuadln5ygzWCW{L&CUNs~B5AH91;C|ZJ`6ivd zN>Q_h11FVaTHG5T@8r)98U46^7L{lW%3`m z4@vk6j#i=l%J_l%&7WBxgqW_QIf1yp0>u44K-^#E%SPZ|0B)aielq}&?;)ijHqWd< zYE$Um!1GINKoJS*ve$z7wWaeh>@jIs=L`Xtt5(q9u>+S7FAX#>=HP?A$eRZ2kX+7O z5C3`^E^TaV9EB5^=yPhNZhu=Umhbcw_sEHkSuq1(%8s#)q2Fj6EA5YxP6Tt#IZ#Y9 zB3TVWsTtNZV<@n0=Ys-}??9xXgkc6MrSSEWnh&B#k6mjjf90+V%hNw0{qgX?WyUm9 z4ysl4cZNxF1SZp94LT6t(R~o3R~4k$uoB=(L`LXeDV)Z_IPnP{Ij#H8C7@GSfR{fO z1$N3eht8y0BypILd!MN~WI-ilUrKQoIf4Q*N}B_vp2#XO49fw!n`_JcbG*nZ*0y*U z8+7!OP(P}$?ta(Zld1Yf>hjm0sB(fh%bgom;2Dpsj9qt#PQ)sk+7m2)XE!j>Qr~2^ z7aVmG^`A-~(gi!H(J_MYePkuk@#c053O*$@t3(M9JxJkg^ zP*LB$C`e>=MU4Vb=+j^{H|(31-O7BjG5wKgl4T0x@QQvUTbFt^1Y2owLdU03KL$V; z8oKk=w_-%zA?*3&d|$-S6NeVHGV4JH&v6($qVi z`G-uV#IC>bl3D}JnzJ5v$RNS;oy8Qdc0Y3ua#q`XL~9j5tNq{?A*otFTQblv8ma3g zZ8=OsnNxM{BK;8h;6Vl)n4WS|uzzxvSAc*+CDMM?anY+;PIk|PZjKt7!bNV1GJtVl zqKP!@`FfAh+0z8|DS)@WKj31qsR-4pH?=s)*c(?%)w z+s}^`ssyT|e|f*lL1NZaZmJY6zf7&PQ=I|l?c^&F7A7GbJaQvF zU4)k%uPG`15!flsXHhjA@fE3Pvr#_%#%Rk50`8?R$3ch0o>sVa%c`_-RSpHt(f$~M z;z{|+fzBS9wC$9dGg%b1T6hO&70RTq?zL)N>gBOb$GcTuH$@n!a;qrM0kR#5q1w2U z4r$?&v>E6E@k^2_<;UpHkk`sVpP({%YHP{6;Dd54Z`M<_Q4$a94v&8ajl3IYb2~b@ z>Un%V8#ivN%#owa!Fu{LBT2})+AW?Oh@zU4BJ&x05}+sF$#~)X^5@+CE#P+bU{4r` z`?T$$K-_o1RtFBypEQR9PHv)B5Aa)#7J(nbEB}0%*pbrqiHT-3YkRJg9(!gOi2EErUsHN3u-~CS5?7FsCU5aT+?NpeFLPf8 zT0A6!c^#B{72r$ps7k(G|ZxLV+f_4nUvd%ePUQV}T(F@Z9Uk5PdHQcpM|JU}{ zW^(!V`=p?^N`48F`i}RXvaCF*f6B51F2Nt%haj4U^~F1CY3jfu=6*-Iitl(?S_VOU zKH@{ahQ1ko#`+F;?EnTv+Ml8c?w^g@Ywp$Ln792=1Jw^UsLt!9R{WTnnU4P~rK%W~ zHc?@|YDxC-^*LzZ*iXOC0loo3QUmGu*TF<`w3|;Gdn;sYT&cJ1;Q9(U;a($tM5COz z9Ll>(az@G-Wu0abRh*`W>xf=0g>sc5j*iGi+nq!;JU;`lB;W;?zR85(eT=~r2>er-WfZpu+@`0aR5CYlA6DD3{G#3V49T7P zY!2lo&=zF?k9-N~mjh$AYx@)^=qhQUr_Zt~2ClB(+%aC&*1K$L^A(zkA0pQx+^z?p zO*#&sDy^z82KEb^lAfl4)-vO61?U|LD1@9-jM?fH0Kh~>ORtzC%{tu;(myGvV4-nK zP*;=BPyke#gqs%d%I9=@J8fNdLAs%8T~Ed{qPSLaO3kNKTY-&PUzBE;%1;)5A&pD; zP^8*k$!_qSt^|J8NWgT6JDNpjR;UMOf-wM~;R&kDV?wD*ssH2s*Ma`y{ZGhU{p5smO8P%or#`HJNQ0A?$sGJw6)%hl>BAZD{uiJjOXe)z89+d z3qe3#dKcK1P_5|^mS-w)1lZIL^Wqi-XGotxoT$#Xk7@c4k}t}#wSDdZWk8&Y8OoDV zTvw(8j=%(6nFm+t5Bk%ALt-K_$Q2g=cJEI3M^mO0B7$)M=~6bVAhDE;6W$4)ok|~3 zEX1kh^|6b&5CH_9pE3)bASvG`ZKakRK0UoWad_ zB8P^*SMy${JI1P2`fz`FU|?lnWn*KCiLU9RU6}ut`jaJ%m^JrRA;5^dfptoXDZ;eF z`TV0c%Yo%E2u%XE5(49BYUfccUyD`UMbh}klysFMiuP%Ol~PF;^$uSk9QPdi+O(Ka z@8;VxelMJOk!6p?axc8m?lTVWsU*aLCIq(5;Zgn{%^Y2)O%i329QJ^>QxU^*Mp-BDbcHqcyke}1o)wtH zVwJ6hrjpp)*Wq{G9mS+k!F{0~CW^vhW@ZN$Wd(V_14NOs#;kEj;t)NsG)rHyk>+&V zLr=R&c%l+4w~lM6``?m`RudxwtEY3(avhLdHw=z)DCz-g26a1|9D4BZ!mjDJI^tY2 zzGCn$mON@%LJSVkdwF}P3s8cG?zL$W2edsr3rgxoBeT=af;ih>me)kSWG-#TA0?S@ z&`kSE0obwmJ00@t1o>($;k#tc97D7!GUUu7qO7wUfT#T6d8;*prslBFn`ewBM1H(< zh<$4?f4UA}v!t17kJR!OTLKi9vrrqd!#5k})r!!jxAc##=AYXapVs%*^E%k+gI_TW ze}_@}Pfhue^|RyPUH!BvR1Z^@E}Kb(`|J3F7L0v3{(B#ezxO|mKiQih6$|zm(D5HT zsCHD$e&|d4kO0&TF%KRB4%G`A@5RBBqVHXTWX zRQPSR{e6ZBON3sKb|VDX@W_x0pr!TjT|J}$6ojuZtSqsx)|4^9+bLYb^M?obYbA>{ zKYt|^Q*o*Xi<*TWjm_{D;;Am525S5U&eE^6_Fu7XAO|9xlRFZBCBLwqUC$dGpPK&N z8K=D8u`}G|$iV7k@PNq)P(Dvu@};}et(TY)?(9mqwbs9$4I-yQYp!V7QU09YaDeW9 z4?(75xE0Pk*qsO4yZu9t7B{$CvMA_71@Mmi!W{YD%-K2$Cps}x-XOP*^54BOfXNkPrH=3gD~)s(_3S74Yg> z)AykQzW%EMxPdAFvrg3?5;n;Tr~>f+RRM3S3Kr~G3DPBoqd*l9JQl`0eX@W zX@6Bfp`9}Rku$0Jzbb%H4yXd4OKJW`1rU-m;sOlI|Ed52zP~DfaD&co2r{n<%VnWX zja=0~(w)EdBq-<##LiRGF^g<49pQI}*A*t~g zPj_!+X(AvSCLvMf92^$k7X?yP=0c7vSVHMkRWJzzYJ&HvX=sZpM>eFGOt1jtcv8E{ zpIj{W#=oAXOs$Ox@r?40qwGFX&!p|Mt;C`0%>Pz*srF5KXO4|K0Z!BF5DoAJD!oG4 zGvOpboe8K7+)$lSRIlZZCJFQ+J1@uX9Y!w^0NZ`FBS~yRGI(CZ1{Al#$F~%!DVD9w z*78TK>W@F3d}#N|2?+u-92;sIU%BKagA$OiEn#hU8f zT#({OpNiOT9$nC*#+a4r$=Hts(RUM%6rerY-nFlXnD3khdS98cFVFy=Fhi(=Y0%{# z05aC!KG1)vnJm%d$6q}lc+ntSl=ATcz``zwa&Fg%z$|tpsxM5@!vAq&Z>K(nIl9?% zB?yL=S{m^U6U(<5x}E|{Lvgsga<2r<>9$%+z9ZGqZgGQ;*XLAAUWcx;Au<2>d0A#4 zlSm7#q*Wt<1fZU~u&sP(s%ir2p&IoyiQ#Sm*ai;By6(+;HZr;EPNp=CLslH5HzwDO z6zDgTMC>)^le)EXry2WQQ;`HtogvvC3#uQ(U?krrO?O=wUB9S=vOD<6`Kxrz1d9x0 zGlfcPf~?x;j!vyAZIGbCZ@5Pb%xkqQkYqTWp?-?n20&lda0;3|-Hs-s%9Wq3%MLs7kU{F zEQn&f1TECx@l$&uqTi{(E*|=8GWmAp&&%TLk={XBYp&`&PD& z|Hs*dwx{h1H`;q=j=zatC3s)_jrp>i;RdDrvT596%i>yZ-X}1vJaUfOUFmwl4bF`} zrjp0smuhaz+k_(5)W~>xiHF@I)&TBvHZJeHf>gw9X2rX&vs*_}2~%a?-&_IZ-_s@5 z$meUU=Qt&~jD2?DxGvMo(gzu&OUV1|7TBp1!dRAA{VzvO^-`m8+*XRPAyB!j3}y!+ z{-n&)e!m*#Y1=N)3W6dK<=_7{PxD|O*qc@X?X&qAIc<~kNN!l2)6_*jZY20>qD1%n z^k-ZbwXWHhH~r5`tE3GZu1zigm!^%l9r+Zi-<<1ZuuwY8{+DI1D?@|}-`Or9AH*8? z2py#9@6?L@H((r1vOW=FiV5C>OiYh@RJkMaB|fw@#n`0Ge;c%SfV)qs^rO8?%a0m z7(b!W#^r-QU8*(v04Hr>jnd+ zioF&3-Y96EH^8;+04}<#O8DC6faB17R2&yRMpWJr+lkxe@RpXBS zzcW6F-ql3^lktK2e=|N*fd6oQEzv)mUm5iu&Zqgy`GZkF&gYXx`w!>uvEu|4K!0%l z%fFm|0nGShop+0+)Ndr%ykyoRz47xmhk7QV{mc2w{ss|I!b676*GtWVADj;kgvAkcayN z^KpQf5Ad4*;CuH$(h1QyM3YdsvVn22j~(y#+Jf;cmgX6$wj#PzMWlI<@yIS7b=D^rT=_G%r;D z6v}Wf)%fY_X3P~~4+Mcl`uS#Aqlq2hCdvR3e3rw2WBe_N#m*Z6|DM7>gWjKx@%DCl ztA4an%MOJmcCvxVb9X?oqaE^}gA4ni7vUkgY2Fsl>Lxb)SRR14DP2wsCq}>k2WxS@ zNX)VsFBpFi;f|Zb5maTu=NmFT2ONTQM>e=_dWma!YMB+PuP`}2I>D?sMm9; z0!;p_lu)l}r+rH^gSi4RNi}|ujqVzkrQfqVNnbgOi8-UWH% zz!Q-q0=!tFu<&1~TqbRri+uJud&t|$b|L@B__XK+DjV|QyZ1EUWZFM|V%GkF3~xY- zUGw@`hKVxwkL6Z!@s{N;BrN~?xue2J+XC2#eXE6QD=j~*RfIP8QL;)zy{Q{xwirfL zFUL}&${Eb!{BobE!La(eAUE#12Fh8wZavz5fUgvg_?sLO9JvK*=p4Ib)*N57N>7~4 zBji4aUxgmra5Z{xSVmd1)s-wtrFc@sG!+7ei+u@$eoJ#XkRHhrMwon!!b$7HgBl zXWM6nI$(l`UCFG;^+;@feE|d>UKB+(PD1kR0_*3 zzzPPFCj@AlDv&crvr_%sh)KL?XWlFwqC`j{>uyzy~f zopOi5!EC;tmn6oR6X@3{FhRB2aeRRlMjIPXPtIJnkZC>selR9cw|4Br^qHgW41VUx z$;HL)O1;|)nCW5hE?hTkoZGVcPX3YU>FDCMGVsQPm$;$;|9p7$5$VAW)E@#ydc;FK z0qZDa9@ypm+Q)>u-SHP6;~;U0_Ef46+SD3GiciL@5NHVdE0=;>T$=@d3Qi4KN=;}L z$9fdNdNN;Y*K2HN#ZR@IhH%(`*A&aJ)EvHg_++4Hn%#=$M%%?0c70BX$Il%!1go0IxXa>Ke~lPg z(HOCfx`jcI6ps0G*UW-+kJMLolWub+m%2FUqk;x)qNhrwI0tmlA7b3e zKDGIQ`BZ-~|2n;hwk-}_mNvuEQzLCm{go}=hZtw2yw@#+Ih+{#9MULP(=&$h;+Fv* zyj9bMgUS5mXa=VlPpb;2Xc5FNl1k{xmg$5~w$#^V!~92ds|ZetWrW@8;f8k*Pegb7 z3Ag}UMs^d#OS0Jqzkq2`0Q$jlmu{8~@oTc(>L>Ke#O031Db9FNna`RGuI517pO*}x z{2$w23`qq74k_CZX#0EBz@@n7KsUz@O@$#fMft$+k^pW0?E0zRA8+QsVyzNQ%+18< zD$E0!Z;$%!I)Nvc#;~75jCApGD1_Wj6p}I8w>QMcBFg%20J@-s+n0UJCc#Hy-MboYr|9uzV7EoD|pkW!!^ z6Lw%YojKek9dvyV_6_u#i62a5I%e_+K!2$J(`^Ha-cSk}td8Eu_U!1sOpLMWOugk* z+8;33^1neJLtxP7tOsSHnr#;gg8rF)xz)K+z>SqDi>I|PC0ikkEv@>*Y<8?z%%>AW zB?Lo8V?6%SaJp$f-gdBVBYjq3Jmk!#$vgR-SKy|i1setxLE3h&tTIG*Y#sny!mz2_ ze)bZ0c=E8}y$60=-~at`esi~aaMCil;P~FM;5fT^lH)F_z60nec=3{Ys9`#q7?l}u zDCTyi9Sw3~H9iJl)4hY*@AUsuOGPsK6Cnc#{qp|}{r`va53Dy%;UWY_{J%{9zgGYM z-Dv#oxZI5PE&vFc$U2HkTa+jH?kTm|9$2ujN@$kc~b0a?C;u^>HC@o zvTCRJZJq@?DqNeS4?4%G`%ewx^};yONOCvl=M&B4xY-+Ad`%a^x`N0`d>G^qk5+Q=7By4zbo#3FC@*F?0k2}Qs1G@+Ot2C7b z|I2lQZr>V3a?+1RV}BuX@SMBjbc59E&Vo|XGO=Rkim3h}_G+)saI-p!I+|s1T}?B; zzLZ{ZOyLb4gL0>iaOzHW6QyTyDZn9M5?2ba*dTQJ?wZXcQC zpYnsf=?0V^=L(t%+9r5p9eS?NIK1L35j&asvPFhGiXq`zA zYVE-`JdJXkgd=^Q25Q2h{1n0o{C*JqiE}yFZ4}kIkScZ-tyJ(46ljUE*mHu0>T@th z@de0u3QiXgq7D# zo)$^;5P-t2M6tRUW(@8xLljs8vS3e*#)Fo&vvlg$tH9kh8*pVO`NtF7 zK;E+cYYhhcr@CEo3vck$3DmWr83Z}$dKJJiSK7|$8tarEdV~yj$Y-N)Yv_)NSaPD^ zaq-V}b^=p`Q@(lp5i$qU@IR(YcRr24du2rY5Rmng9lZ?cFPMrZvzn5yJLVlv>t z?*-{5`M#PCp1Ra{2x1Kt1s(atO$v$~2jx6mWO~b!I8(A&DxEu``I>3_3KVz-@T?60 z>s53~w2a~QhQ_-&M{xT3#gO4hnY`+ondTeBofc8)l>*DK6BJlM*p0WKaW*jp26~?% z^7NyDmP%)~zM`S`jt%keubx_zV!hKJbMWyjSW!@Mm++2nugD0(K438lIXC1awKF(T z0m6F;P#fLJ)V;q)0NC^$Gc{BKJhI`~mWVt(9 zc&lx{u?O=x8_@&0RX^!T8PNEJIh`|mm6?yQHN{Bk|CkL|B|T`=0G1i6bmv7)qR8m0 z%y>&^Lo2(qDs7(44%{q+BH35MB(Sfh_o`V67bp9h!@yXOn=7iFx+ZxzMm*W(r4i zloD>0RNxrmXBQ4aIGaE)X#x`zd+B84*zh%aiyV8y~Bzj&6XbtHjF}Kg0=iz%5 z=DKN+f#yP};!C;-xtqX0f_5B)Fjs}o6!PK`37b)&kaNL#oDdv8E4pF89?UDC9z?Xi z_3*+*L{3swt=Ta1D$BrdT8{-Bv%->>oA&SM>vl?z)@y0?S*Ai4l8qD^*#8NimkNET zs`cA7S}_-z3n^7u=m^~u-&AK7{U&qWdcVtD>^6Z%vc>r`AeuZJpm`}K&i(D{oGSNy zLBqL+z^Nod6AEf^qRv#i(^(KJ>fslAVR)>7iK9P3x@n}pQoVl_7df{hnV>G3YT}cj zvyqGt^4t=|Rl}FBamAT!W@3WW;N+gP&=(~fN$?U!P`eDEIJgvNRxpq^ih zH4Gnh#scEcp$@^9Eun%rQnF$%sKT5#Je{BECOq@TsMq+16Vg+t&p3JbjxuAPe|~|T z_1L#mvHSw9q--e*YDBU50}r&+&X5)VpFU&vvzT$=27uk3GCox^qsqB-F8aadx$lz> z#i;vFCH$|<2jIN{zHs}vJwLl(O*=3#sR-?r47Y<5myUfPk0>Y(9;h7X2q*`{zyFt%$# z3CCHN3FApwKO1b>7&B>ZpCc)67VlkLx+aSm&y~<7jwpmhN;_d&F~lV;Kgr6gtlA77 zb9cGhNVRj|C|S0afr#h3bS3e5^dOZM7aP0@`xJniw091Rl7hJz|0g#}H=879Ur|Z| z!q@V7$0eF9P1f{^6PJT~qq^Bv%Ci`Cb?PR-ZgQka>forZK_GK`H%Ccnka|4@t+Ai; zkKmV!W?dX-R^wjA8&&WqCjnxts@6t$O9aPE)LnZ51$2vR+}ByONyVyGY*M=p>Xy3} zQ9Ix;#yMG^97#n%B`{BPPYA}wwQf~c;;WoSRnQ+Z>o-=Ax8}I;8&8Ql7cDpxHWICd zgn&XOYu5iT1|pdY%_GtXorZhFDH-Is1{X;&Ek1(SR#MEfQ^VrGjVs!|j)Jb}t8M%t zJ(n|_O1OI6iE}%Fo*fvhm};Z2>L;s$jwwL2geBa{UXc`)M_EGo%|yuWr9`8u{gtP~ zhN%jZuaA91S!Wa%W5>;gq=HyS+RgY9RxP?dd#9!O;gnti^NP31^U4soZ#4^)VXFqr zm*=$eXXL9bG__$Lmil(x96HM6kxBnE~VR|qO{uL!{I zku0(VBvxp4MM8d)7tKx5J>^T5tL6%-;`HRSMv-LVAa-W;+u9Nyt#nYAAK&r5y|thS zw+3;jVw36_T$tLSR4ix?qv?m^mM<4&@f};_|HiI0W=-lfM6Qt2yxOy%USHm+ufUB*d|h z$y|bxHiLm9@66Xrcis7-%)bi*iCo$rIPJLH^py|7fs8*+r;6m*F|Cq`F^5FsJHWd` z@pO{K8BD--gR&rzAX`JW#(Dzq-jw)EmQIaTF)3nS-x&F~ML77OBYksrH1uy_a3%Kj z`X5$*sc>Sl-(frSOt>flHFmiRNZ#l7DRB&W?uOInpO8~f;aA>a;y{F7CRORr8Nut~ z%CMtuJ?rBMDtGHUqw|xL=gS4oL@JnSP=Ce3 zj?6RN$HU)6YR0@mS!bKAGvD|=A3dbz^HHV++J5oo{i=>^bIBI~y0eGotdF+Ag1X5j zKoKPUCFNnaxPL+i&@0L3vdceO7-D&u^Qkv;N2GRX^g53?$?LOM2y>1>_1Mv@+Th{d}+ZH*E+)-8oX}CGGWZ zFNlU)BES|!cTULDs_7YO9f_-=M}mUR>!Zu>z^9OURWFJJKr3O-THi0r+Vhcxu0$G0 zou5!D$4EAKX?d0{5r)$<)ITiy^A1s*4d~+`CJ#&QAPuHxihRK6X$35Ol2hx8=)mx0 z(?g`_2nQ=blWM6w98qZ29@Da)1U!wkhBp;L8uTlM~+L`9JC%){Ui5&l~rdAXV=cFcCo{=$`HWd_%^)%s9E{o1cMYM)e?pxm!0z+3474MzZsEOF!W&AH|lg zr_!x6tu8+QT{V2e?!3?jUTIrv{#TAG;eXG-|K|ngKZ`Vs=1$gDXZV&1JCfIYoq0{_ z>4<2JqCL!YLJrtOb-hGYUL_Y>4O7j!&@WTX6Y%21I4p*1Me~(W&i>L zTo&~|LD~Z~Y|iAtyTT^A4DDYf?bW`9&S0Ugmol35vgNF5Y+8`QiS^^7?5y>zZ(ySL6?P=eaW_^gw}PK{hn9)dJv~F*693?;eUmP%c_Wvs|DL)e|$2&@WTd}QgK%p}$Le|O)j*F6`CB$cY zCz-c+^~Wpmf~^qF-ZM6P$Rcd+*L|2yq!!YlcI+_UN0xdE?5aQlhM9lc}b;FdG)C;tzaYf2W~ubCxq%XNbqv zWmU<~7QG8=m0zNl6b)@Uy;pqNZqf$iT7^A36y!0npH1?EHnDtTz)|bE_FHNg2rS8m z75h-@cC2I-x?UeiZhK*EU}fp!nO04izE#Xp05HNVzbe^_e^n z1|COlb>~&pquwTH*(A}_u|wUx?)dWLtPm^^F=GPoaefNX1jz2xPqA-5TzNw=u5sJ*4&tz^jTlrfyEZL zeZl&xY%!CFEQB$dPL_G_`D>1dYKEXDab7*ARh#}YU$Eh{ehh~-PUeB1zhtBkxLkmA z%Ww~(9;BavFk%nIG4^gHgsvQ(AQHO(gj9%%rd|#U*;rC9EJuufb;b{wy|X&})a6BUF;!113!BzTp(3Lcg5{ddox7mPzqBu35IZ51v9%{*e@nJl-^( zn$ZJjg1G@tH3|c>FT%^1?-b#>mZ2dvTH4)h6Fh6I{va$v`#x|`;uy2&q|v(hBZi`%}xt5 z=7#(PmZz1>)nU^pM^wL_?!w*353lCP+{!tq=lj%KnYc;C)XfodcWe0W(p5S6F>RQW z@y%s8s?`4#_YfBiA{77XGjR~AZ78Axc+a}($F$)-w*(vDhy1m#bFKalVdO~#XCgN+ zz5yl2B`BL%)Eh|Pv>~*e!2q{uBb~chf=M+LBDk@}re5#8O}mnR@`Ny+7h7m_(J>wI zMv*A)`tkM%nM5dDB25BYJvW?mB4;oFPS8&uHjZk$j;mWy*2S4Xc<$W$%_A)}%)%2XgFhwF%#J8ox>Tg^_=P?{ z5#x-w{3oR*M8xKy(_xaVO~E@Fe4~XJky);mTF^osB4_t0e}HF48Y8Rkg`ob+m-N7Jn2lK1%YndcPIqoA&&vD+d;qJH}~^x>F!({?W! z=$hL0MKo!x7&(-Q$vo-Q+yafus9o;0?K~9jT4xu^$gdw{KYNn|PI@TWpxn(_wM!uR zW}y2HsU-otTX89ppIn46G+lUs2fhceNFB_gfT5zz>Rj8T34iU2UEhAH>_Cm##hVHd z#viNpEznAEgo=vA%K8MtdQ{hWYhY~FOwp_Co%N{z$Sr=7!JV*cnbb)O38kjWcY8a% zG4O?I;Wve8SJH?P`BqeyAD75;fe%*b@czunl%du4-S`-L!{VbNdxz!^Ig&JVx5G|{ z08f_*uwzFk&Rw6iaHsX^U??nZ|6j(l{p}0{CYbxJ0^8K%9Fl`IfKu%5Ush8Xv`Q7@ z8r;i>nl{Is9^FbDKXGp%@d)5~@e5M?Q7A5MAKh>yUoQU~=#GavLRz_8W52@Nj6xXP zt<+ef5LrgBF6LHjP0WbO( zhjoTr@L6xrR#5)wXDE)^AVQUByz4^&vq7zW)aagSr^!e1z`aCV7&Jmt7WG*zi+xF( zkd#^P8P)-%Vls7C%|qdH3MRhwC4-P?N6S8At7Cq|aOXHl zFor~liUkU6%rdk+j#^gyvIPVifWf{70-li{KgA3yPR=TBny_&k0%bHN=6n3G!H6@L z;tQ{v(|VJ5X^*|w=G~v^H~D6so*;gVI#()|@v2`Ap70Mou<%aC3926C8aMb?YHw^k z{f6=$wnmyZZz)rVXbzi@p(m=k=6#Eq_9o0Z;C+lUZT07=@9fR5N}+i!0W4!$36muw z2=`=LLE;`zrwR@1rrk1yf*ezh0E>fECOT3~x63riveU!NS{}Eif4F*yWV4|w;PH;4 z+0U!axVwqG2Wr%wvYgSb?AXi)l7p08V=82@hO*AU!+njg=$_yCI`ij~TO@46q6YRT zw%d3vZ$DP(MCPn~C_i~?FMzTtj5H^jO0McBS1i|6**S40-{hbbIcidX<6ce zmqPcWjql(JaGxgiA^TIm8iBe8V&jz(8NoLA9Yf;usGyA}jR_Y@(WQP#u3~Hqhd2=ij5PD~bfDRoa)@xD(GcwQ1DMwn2DP>7(N^a(Z~2m$OYtFO#W&92+b z@@GFma`oTc5jHKjuClHIKW5s1A9@@1p5B9J|NOXP&~>%8{^Z4LTyFIJxoG7i!)9LO zM||l5Ccjj>ih9=}+`!B`9@V>FW!wF?k0S-|hty(-P48aj&h|AovGv#JV=XpIUm_L2Bca~mvWt#k5`g+c+nV5m9Q%vqTTjqJpH@4=S#_6A$mGiE&QEX%_iRQvXk&t0i@1S{;Vy$c-jtsZxeN~Sh2l@5Ct~KUY7yIZfB|XICCt0 z?EJ)9sAfU&#&NRoMnT@A?=3$bEY%4y??sty9My2)BpwJ(H4)=WCVW^uVT%)m<`>#t zW}HA(ikf5bSEzKCGXc*K0^KZYB3``JShOk9a&1O>IyRno?FwskfUDk)(`V$4_|PY3 znIXO$*cg`YsIa$qtezqoeGwX+HcO59?}eh)^A%JT+SXR$1$o$4abt$U4$kFbU*<-) zl`HPC4LFd-;q~nz&0BLlxsVOOA%RdC1cKyvpp#ZpL02fmzzW$423*CRgbVow_TvkBv|3EE{c)-hdw<6lZ1ARo~i|y&K-A<2fux zd9S@4a#=KU8eOX0q0=Y9NWV`RrFAqdHbHw=59sw77fs3nguIs!{xJJX{d`=S(N%KG zaO$5_6G@%~zFFvA)g9$^4dZ($K<#SlYlyS?GrK!I$?b4$I%!)%WB2WW`RS}yx^8ik z>5_<64}EsBW8NJ0-D#{EB%V1Z&~=qOAv~(D9NL?{7?fDBuUcRA^}Y3?g)rCWZY|*Y z;dX@ue<+s%5a+BP3=T0T3E3y@SI_o6mb(MXI7RR`<`U-n(YXa)*bU)IYZX5O++Nh% zrT{K)NQi(@kA&jCuvmlm9%rK1rOD>B!F16B$OjOXk@)3v$u)yV#Zgak@2Z}= zK*8PP>n8%#T?(bWH-xgcUie93p7Lomu)uGK^w>xy7AGx{&Vr5HktQq=;352s$L9!M zfT@U0E5Zi+>3iCn z8g7<={Jgxah8Y@$>uVFDJ%uS-Ohh)H{~F%V^Kaz(a^fjCT>34B8RE!$uNy?Cgl{;$ zc28sXqH{QsBe?>KVasg){fSA#{|$r@4x`e$Ef04I)*^^L1m6dW@R9oF{WmqFLaseSswPf07; zJ8f)DtU+!Ku8HjUg~(Xsp5-&#dNXtX%K5!A*;n#E=%Fe1mz7fbIV>MGU@+{$qAD z;rf*0 zm}7va7n#tuc+NYG43^gnIKSZlD8u8w)aX+k(5YuHqJrepTO|FWT0J_|M@!e8$yL^y zOJ1o(@Kczl;vAbqK4ZsFAa9eGB!8lX|BE3xT6rA*GTyg!ipe4$|BHKsXp_4Neo^~0 zP68?eSu?fYG;2zQ?1?hxJsC|r#IfBq$5j{TG1Op3uqndoqe@n+O5t0XJjoikRP&p3ovX9?HA|tcFcD z1?-DvLAbO*f(j+A@4g6ny^?Q^FDb@=5hcxb>^CDwGDeRcgm5|(@dC_WQiCauv;&h& zmH>x|iltU7*GfTlz6#5kH#>WKr#}+iEerwt_G5)LW5!|=D;%W$cmOF`JIK$L*fG%6 z9k>b~j~@|ZAQ4WzFsoK;Wqy3d9fJOS2|EUZl|CUAb1D~8wngeS9`;na@SLnKP^8AOU!gs}E_r877!NDVB(L5Vug!Kf;Ms2)p=Ermd?2RWDmR@rk;qf# zVMk*SCw!7d2abFI3f2#%;)qyPjKbpKv~+$Bs5SYv*@w<&@u#J?e;2v0*3BOG){{M} zR5ME#UOfz#Ns`+{SH`=MZyi=9q-^dX8isUtcCcS|-{4J~I-bX9!!b@du1C@%*39}i zkzQI%0v^Dbq}3*WNe*Iz%|A*DNTS3LU{f5gH8KHlcti&z$=r;4Zv{0aWsQUXWILF& zW%am5VZBeL-eHJW;-~dM!DVxO=i~1hx_FP6+Vh^c-5 zOL+^TRAN;t#Ej1f>mi|^!8^(hMT0Cr<1SvC+q_e&geDW+G#l`~d=t8|8?I7A%!xA7 zH6>w{#GVRYBVIsBoe$@fb^}dP1c!hAv8<*RjBx`8NRK7cOu&O71Mvt(qS(5HW2vc@ zTZ(FN5%f2qg=y1h$iQVKk3c~3=f3@!4o;I-{1uO-yIt)@BJTu}`^Hyzxt`e@PQQ?B z-79Y~$LKi1La9SWv6O|MHO(6-=2cLphAG(Hcm_(g?D!8WaBw3=7VoXA0G78M;XBJ1 zc>-1-ApYSZnN(KP3%iy?N-vug#KU;ocrh6j8ESM2IM%`Xy(w|j1h~Jk@ppftSQ-mC znWc{9yHqvjo|mOdize|{`25KDlgG{Q_k+VzueH7XM+kSD2F)B7eBc5{x@JS>UBXNt zJ>jFgNk|h{`6F!mGmcCSeHyWqEPf28vNwQ=RWAA|-dqcVq1uO#ayre6tD!_Wxhi&m zi6VBXC-o;p;s{6`;h(P%ZX$R7-w%vhUg0MzU;ZDu?lP+Ce_QxA9U|S*jdXW60@B?L z(%me&ySqVBQjqR$kZz<)X^?t;=-&T*_PNjVhB21Iw>s8je&_X>MmY}KlVwpR2pX2; zL+U^eM0+76C)#BIfqnbXZ?>GCS8G{P$79%-!jRVY`I0-QU()py_1M3c!+X|FN4IE6 zUOG(v>?L)T22^cl`cc_EF2YT2M)%%*Axw$j6q|yn0F~ffhyE68Aa@_zm(1MxQgbC$ z*sAkto0$znlhd6ddaag>HZ^Sw>>}(&@pqf>$yFd??S_U@qHe75$`wKB%!ZO5Ddw4M zlay5|YdV3dBiK^=8bv3YR9YfF7b%t${(?C+G*zU6B%s-bJ!L=h-iACwtz9NtIo#{M z^mQXO8p4+%_z3_>6?uccHEhm#V(zS_RN$~CQyf6Zj2A`qmBR1hZpaS=lhPQ zOCQ;Xm%xV`ON<+1y=KlU!HpJBhfC*~_U$ZMQXM(XME*zuX(A@~UiD^~AnxMg9pmd< zwaA;Gb`In?gcSeRT$O5g{eM_ca;8pBhUTV9rpBh0uK#r)qT}VX!hr^a?jcOgJTIce zM-nbeZ4N*B7C8(ydSlIIexywFml`q=ji&)$n*REH)`Z|Eub8wWnYpf!C`Rt5ONSM? zAwa#i+4`e9{%Ld<-oq|8Hy$*K9BTeqvd=gP=;$lry5u;oGRrDk+WEI;NW2UR_ zBg0!GcM;iJy5pOh`L@$EMQ@uW^%N?~?k|{PsOBZKI)%5}o2_PvIyEaYp5s#W@Q7R? zP;6~y@96qa2@Agv-jN|_%0fF0TYU5_=KLOwKeNcZkx?~St#21kP2LFNBomyDYtT=e zNA}8I@M^Ui9-g8+ou9yC?+$|hpwLG7V6(U399>9_L5CsdC148U@LhKS<)k7G?I-$R zA+veGLpSj2(?}M0eW*&%`~X!+HN=cMA^@9z$JFZ}8V$a-sChs%*0d_6gj(Eo`*X zrRrO+Z;^~}-eP=Ioujmmcg8btq@e{gaytHpp$rc^IGoR0my{qTLuL&%^*+{{So)dM zguMy17<@tHcYzbKOkqHu16VlJi4XYl^sYso=%dV@zoUymM?KTiz|xvWjE1)^!EVlS z9{w4!!E)oOwGz@<*tzn%HE_f2Awg&=9{=h0T*X91du)gW?uvvU+)(qjiTARtu@hc~ zyeNakL5gy=Xx{*>c}1CBX8grU!*N6RnQq( z7NKkcMj+uDr+y(X$wi%B&AuqhMh+c@crx9P(Gq5-DP%UtDZdiFkJ{?fGWM1;#8XM1 z-8&Tb zseYh*ju_3?tlRD-grd}L^ZZ=d16s@_V;1-J9TDQUkaqmv0og4B9L%n6JlUL8oPupE zAOV{y%4FJJsY7$F%4Ce_bGoGU7`F1Dk6!O{Lnro$3m9S&BZV20Jmu{v?BhN{gt#G! zYVXYpY*D@gSXhesR~9z<4L~|dZZ+h10sfn8& zzN<2W8BvEMYnw<*_Hq$s9pjw8WgD>HXMwg&WJctwSbPgJ9*i5D7en>Bb+ADsdlPTy z?*+ZmS|w5T)fq`?Kl7`FU3tgFvkgbWYt)bqQe;&Km!p|1GJjJI%Y=gGxE195MmV!) zq)%A-IZUgo`#ZkuF!&>FuEQC0!gApUwOCPT7S)Wr0dkZ^EodxMKQDK1~ zv$Efk@s|)tVpUlql9kmKhb2W8FFMBT!Cf4hDA8N^F42=LGw}uksnlnLj|`+=SD`yb zu|9ZX;~S$4nGFb5#O>E3^@35WBqJi2W%WJD5{%?%=rkR#xJm&Png zb~g9HGg;cSh^D%%wl27zK-B0I7Qt#o$6KAHCH4w_7i~-Cy%6_T4Y(Iz4?*MX=%AAg zM^UEW>z=|zkbNC0>bTnUP}EB2)U%q?KM*imgZe&t9YTl_!t)eLwiq?h)0tUGNY#2F zpSz~bwOD3$4&8b2J2EKwS9<(i{-BY**|h1{G$t+A!)g@qOu%JG4efb=rkzQs_~#Dm z+8Pm4M2XITpf?4h!4V0({&Xv_-P_E;j|AQbEX?uY(=v>5{ncSp*E5VKe$5|jJT5Cf z>gtr(ijC^lKpWfQa$5w^A)}Bt&3dR(XOFm7GDnns!Ur`v+0$opDNg z1G7uizX(`v3=xv7iTX`8W=gMfDKrK1EBh8LAcr?V^gJC; z5lu29q7h;SC4_5{m&BO#X-FBh>(F&5(D8h-G3iegFQUowgV~d#FY=R+42;b8x!xKg z)QR5;y}W#$W26AFEeCl-6eUlX*QRZ|u$7F)i+PFqr6A3_*RmzcvKS_!MqYyjMit=L z*IG4zwP>Kol9>OhHCj`=HQKP>zSGg?hNvQ&Lt`d zCI}r#EF+z6yR+=mtnuLCf!8feb*CXnq?9#Cc2@~b%{K=z`E>=@Q)PVMFR_(}k6|G& zzq2=hM@}yL)@ON6R>lfcE4J5oyZYLwOO))eWHxAX^rJNN=VLARgely>Sjv@~;0G0- zbrEsgnTmb!uD8uuHSg2sr9@ap+SoqZVkK}j&z}Z=uT6Rz%A+5So7+Rk%Bz(b^zdS; zZ6NtAQB??(wEPy<8h(jh;b_@~Ek%`fw^FGT)%KG_3Lgf=<9jhaT}NM|P9l6p;(=bF zLVO3c?cj)=92}a6#3V%#L1PUBVv`XHEz2NPnmH?sVSc+sFfm8ST{;^wNrlbaoKU*^ zGUZAwohg?JU2@rh>l*fxm#?$;f#WRrhug z;pPz;W&eb5`#Ns?E5GN`!?Z0KvfJd=b!JV5Xlm{(CpP9FQ)y52NT-3OKEwsnG7yQC zC|Uh8$d!_(v1-o5tJmq*sih;Ffch~CBPWOG)l&Gt%qECn&V_@mCv@k7C~9D=m&KQ& zZ{Ai@q@)zswnmP+Un9fK%icr~qAb}fFCeE`#TfgUNgJk&B7gNq?rHhU(86ai|87h$ z#Vz1pWIEpQJcLpVGk3DNCkKycdNN54P6eGb;Uc=%w{_x4m2vUarq$^c=GoYEqXCb! z5D5e$>cTDHfzo@3{A6rb2`4IjKJWso2d?eX8@(H&KbI7%h$mA9MogY=mHxV)(sAof zP?X%S?AT6~PBVE)qk)ZBLkX_B+Or&%=h0Ag(rD@OuJ0^2hu?LM)#IX}?w~9u0c6RT zZtwZMMRP57amKXN!1~@ecrAIC6Q_WXr*t3e_n|%g^hS}wtzW=eUC&w_EF9kasm}d@ z6h`m<`{+Y4L6hb_D;TPTpT!ht>d!de=i-}`6=JPP<*s`h8(?Qph@CD?9DrXEp!cKH zGcovy@ZZG^yI!31rs5^Xp`j)>JA!bPckbsX<9rw*jbn6+zPsw9 zk<~f2-V$;f5^N(s7vnRf^%e+QuTUz?Lh0T!>d12uk0oP}tdqR(n?NVklTceZR?+@WCeCwCsZ_PqK-!>S6pu zEZtMC=FrPCFdTqhry!@I74Ljt3VJL4-%}7cWNPda`2QQg_}3WZqzouo{{zJO&kQ8~ zKW3nbYPPe*lu0Ge*vE|ObXjjKa@_coJ6~&)dnNBY2&{`pp2DDe67_JHHX7v_-{+IP zr}Ap#&m6DR9DP%W*9x+U-C5lD`ox5>>R2qp%ZSubu`o=Lt6Pir@yNxZi@DFdTQ2hg zOfrhgX}pWbql=8PSq8@Gg0|Jv_8@LK=6e22Rpwt2Vw*E&e!tn(x~eXq-}Km8<2Mr@Ho_Q}<;_;@wzik_J{<&6b53=seU;~qp@4WUEK9*(svFZC0J`_wx3%ZqDJyh zZM!wXT*>>JT_rU_i*a-cRYF6L8f>pXF4;#TKXNiki9Uqath+9hM9~S~*z;S_s-jA;@iWV|&dA}W4Re3+Ev{o<3e>juzRQ&B{{$BjT)#Y;AH+$MF)I3 zd)|ab;%h9%7ehv`oE>w9HA-i<&vTx$?w7r^zb&oU%d~Jo15$#$hV;dyh@br(U5eBw zoo7b-`0NE9NSqw9wBCB=_qhbn`Ug56Iki3?VLe~~udaU0xFdH% zB7L>7^PaWPgJx5@O!*AL^wY{K97& zaM)J@1|X74XvU>KG*+?6gw*-#&HN{}w{d@N=3A?Ps=GbXzm`j{H}lSUtH8~?CQQ&b ze;R8?SPseV(_pyc3|@Rvh$>0MG*E4-QX;W4INoSYEe4)_oe>1H*GWV7g#GMfw_!k2 z_}%Gkw~*{jG-G#uwrZL##V0q2%!e>Ey&jL!B!$+n>+8z4B(&39t5QD1Pe0~r;3gC@ zebp3WAXsX}^fOsn-(HJgr!i=gp6mPy1A6Ywca_H3la$Xix;{KDgh8TNLm)1_uxQp# z4C#7!_gd0$vPR!F2~&C}rys|v=u!2uMeQt*+*=WCm{0aJwQ1n%iPy95tYgx+z&dZm zO>x{kF;yxhae~0*51hB-<@yuIa#rAcCRq38XKPn;)J#92r{W7u&Q*ahcsD#&_2*Mz zhT>X9u6SHba5O1RiqgnM$w05ePqs*L5l?O^7=oH_aaE}U8sPzb;R(La{`nZD^UVyxh&zn zzIp%cNy25(dbXTxTVH0p0CQkDEDbnjTCmb!C^(Gk+8J~~=j`g$0A zN%0lFRV$vTQ&Z0=|EAL$I*dQtj44sPU*6z>VYmeg61w@?16@xHSN!HC*ar%h{HGhB zV_gC|)LPHDF%@v!R_pXEyEMTNm(?B0ngwxss!+Ta8xcNNDv+UJN6>g6mgT0Y){C(%nS)6 zpP1Iv_UG%+AHKI4R{}aZ_suF%EFXxd!XU|6V`90hlOE2Z(Dl6 zn{P87S7?|x3Ji9o0oNy|RzkQ_P$QaeT=Jwql*g?l@Iw6O(xJsWbY>(c1cb&29-`%I*W`|mm9ieSqMuMFrPD`-Q8JQQ!>XQrV?GO+d4Vw>9EuqJ>Elgm_H8a>m z<9_7g2eCCTqZit%S=pW%>$1PJkvawaGx|itN&uq|MM6h!fDfSzqsRgt$WsUMy?`FrnN6BNzw`N1a_v+;*NRmhy zCj#3;s?c?;aQgi$ZfLZi`sOX}yMd%7$WW`RuvEMX6av>uKFnP_M75*Jule8t0)CNqR5x z8bg-}RrvrD0kxc(u;_8tMB27Jdx(BLB{+vUH*Q^YGhXiYQc9(T4H+3v;(ag{P8qD? z_r@udA%}EirJsI@LHS20F&_u&e0my_$K3e^~35d{=6*gI6#a z{8HR2C&P@avezSB{oO=|+ykHDh-dV}(^kz_m8LqVOCepGDCgR}I?M>ki&e|~!grh< z{vz=y)L0;{`b5)KfBooKFiB7JGoc8B#$qe2)Rs=F$VgW0rkj~d@lx5-VT8Ki?9a)M zzTyPvebrmdG7!JZ86}gwmn_dm6%XACV_KekZ%JQV%7Ymt5k=njIvmncv>Y4SCF2mr zJ{pDZ{eH9^zHFrc++R1DgjV23&IY}QZ`02GnnD8b=~-}{UK+BtbN`q^;(4D_HfMv$ zm%L2dht=$E{`sqKI5 zbpC~Y0j>4_iGFeaFZAo{f1_XF|BZg}yE}ZhyncQ~zdT>juO9&V75NwaYBkM}YzNRU zHuY+lhXi%GW6vt`U{9Ixn?E`WY{^8SNWAtAi1 zK1zDv>e(8bhum<=4VAUeyfWWG$YkQJkusfixBAZD=C&ZcnV7>0Y&3GMPZO4ZdabmA zym;+~9hxK?KV{l|hZ1GL5q4L7wmJED)PQ*x@KCUv8O=qJ;#r~GT^%geCQla{jEa37 z+wL~k6ej(x=LaJ3Rdev@Srk}0(Df7fSJ%(||LOXX&N2P%`X#WSlYRf&^;7ov@{%01 z3aXfu8sj76&O-PAWiW?QMP1Mbf1mdeu~!9nB!{>}PgOO`z(F=U^kyx7$Wi!Pd2#}E zLtUFm#W_VmG~^QmzN`=3Q&-N~K#hNBlf))f5AMCTz}6%|Tm-hpTeqn$Oq?%vm&X%% z7nyjf{_x1cc}Jx9mmBla?H|iCk8vFzqd^*QUS@vyz!z13U<;hKw znFEE7^~Ih&dJBQ`e-%EAHju8mJ^v|uVE!q5{0V%dQG#^OS>+5o+6I3wVhSEJz_fC7 z-ZfNZXScwW6Xem8R4i;3o)lg}Gbcr*YxjnG7kmAD_oM zdyPjD9=4ISPjFjuzVKP=^|gNp_Xn@#!xAU9=`J0oBsQt#xwoD%&j&xP^#`s-Ogu&o zDgg5f8Uze5ueR^2`9<}=%rC(9UHxnO4*X+&E&mVmi;5vvt?=A_s3-l^{NnkS`4y(A z-+c!>%Kc;ep2h{!pLt|r1GaDQxC~choYQzCY%GF3`Do2O^$wQSJ*XU(H}8FH!u-lX zF=83Z=n2y~CXiQEi*BaeCgGO@Do;j)L~-KTd2Pi&XZ;2N=&Z{d4hEF@2SiAu zlqf4*9I58)A{=}c2LYM&abSP}8$!e0?-*|1pjMWdnuoElvD)%?fyo#t|+$)yHtUsv63dFvM8gNePHo6P0R4gJ~4<3F}9 z{$JbIlCKZZC|ZGTH}M?I2?VWN*sge8LsT_&8N+~4pHobSvat`bA;iMQ=Aak1^2VFYN#>|}pT zX;ih?BKFh@S&$Og-87PF? zVLcM5*GZ~Nsf|ov&0B*Y4B0c3BHT1AM1|S~)egdt^r8zw+rfXK+(}gT6?}JUB^e-! z*Mxgw$~76-W#tiPvKSj$hxn!zqxb^VZ39^10Lm}DwhX0j^a9ZJ%LTfA;4uw`(*bKO zyqT_fSe%2l({(`C5AW)4*KbqjD6hh~|KD9d8xrCPYa5{JSNAi?xC=xMbp5oO$N$~+ zy8ya=bFW>$#@DVNcM7=h8PN4(3-Ymd)i-_TPeXg!`!D5pgrP27tzZFAen+xVYrnkN zy!ozHGBdSjaQIjGo%o~t(u91+5Sg!iRel{v`%kd{D!(3p@>`cip~TSy`bIXCqHAYs zQ_ zyvT=Hkq7y@MbX?&IFQbbMzimO(~{m{W@yOu+YC=Z&MwiosJDOxOr$k;1Y|@69rN-z zn}+B#FtyA>Wf0C>~HvB65l>}ux~>@nknTfyk? znTE!@?TFDK)2AdZEU0}wSljTQR(hTA&-zc$@BB6Br{10Pihl(b=NNaK0YSgOSNvvaPf_`v4Uf42&D@Oz-y?^m9MMVJrLR}%&uvZv1Wr3Sx?rpy-DJ6#eM_6#c|j z2UytUk>2(X&RwsGRRm{erM=&+&O2%z`djqlk#rilXL_QOFe@%EBh8_j9|4Mf!QYc_ zcn=F?<;3XWrQbkXSJi;hX&&GF{;#4R`9DR!$b@?%py>A#^0nw^hbnR2+S6`8$8Pkq zW;vVF_;1nA8pqdpcHp0)pV8glq92PNQ1pWU1^lPzM`VyqLN>9a!_*R7QrWC)cChY* zTIL9H5qV3cXm+?wwk#V%eb3?2MAjmyvw%sm7#BL=5;4l?=uE0$|7&b}zpgg|vvF*J zugg#@7UipUN)D=R1&@bO|D}UK)h}WUQ z!k2ip+Zxj#Vmq`e0M60HMCht-vt$gj;@`G!#lLM|Bn^cEZM`PN>zxBbmrU=iy@PKH zeB3@KEpj?{9bc^rBd-3~zDf`puELbURU%*dug9~+lR;1iisJIBq2F`!Mh2dFibKSq z`-_udwC5wm1&9f1;}Bg;ukmw95Z@NIlb6-+7BgrM)~O+7S(DC*^u_WwMzNlnX2daC z6$M8J{1TARG%njY@~%^{kYOq09o}~2&XW1^f#TQxuol34g}2em-+h2)*fGNYt+mat zBNP5D`5Z)-T6R}iS2jh48^uMPG4W0tW;mR39vYzql{>zi{8ybaDXq z#r=c(-jo&wzv8|_hD-a~36q_dxskKg{h`@<)lMldU3|CA--rO{OU7>g75e%z2RL88 zRe-a+U#m1PnD)k}FR$y13Ux8j7{K{L|KHA6qQ(9HySz}av$Gcc|Mz`I zA#`EGDE6ltGW$AYvKsz5i-BqoTlr)f$%|4|f|EeIfzQWs)jx|1;m(g9 zeq=CN&1Rckg!bL!Zqm0Q-iGLVAxLG`8g^C7a}yKq;2~#lqlSOd5ohuifo@jL<|oc> zv>jK^;>MQ;@c6sqWPqSwG6>Hrk;f*)f5*Sl)m9=4O|o;YY-d47^1_%ezrZ_N9H4!KkUw%>Q#L-)=ER(}xQ&~MUQgSLl z02%M2o;sF9vei#Eg)PmXz}b7fU&(N13zp<|-h_x;sYy~@Rt7wZV#7ke^s=>5s$OJ5 zwaT^Sv_1njF(vV2ZSiBk*Zr2{1Su{}z4E!=Xww579^gog+!?k9>vYD8U69_wn^gUX z_cHujlgIH9L_BZZrh70o^foV!)v7Nluz|1p*u*L>?*|?i*p;e5iAMukK+unj(qNJ< z?(a>^PY)hvMnm5R(kFBjp1?QQq&ZJF!8V0_a%sf&F@aOjuNm+5cWY~;`vKZ|#a!BlQ)ny^oT%mw1}c0`>;Ix|%#C&n!SG ziQ@;~Ihr}MCcnHG+MkSf>}$pwdl;(AgC(5f?fX43O;MDC@WIb>7JT?D4#xSYh0!UN z^EG}f@&ZN^>P$V*1qf>yg~LL;CI!PjpdSgnXY92e;O6hSIIVeqaluN~f!?OZLb**X ztNSd1i+UtAFchl07L9msDCBHDuoQsbN~+e7hwMQDJ-?IM+*JH|#K8-UtT~+5o*%o6 z%!#2d-5a6I-c4|-T5fVkEW|MEQVI4gUT~43K44wJS^69M^3IR$2x^!9Yu!|%I!>$^ z@Ff=OBRz%+TLW8mLV`M|`hpJR@2kbucgOlq&u?Y*p^D?R=NC4A%TMJ-G4LQ5f85!?X_5^NW zR;+$|*l+{;iUHBT8E?-YLfk;h;7`ZCBYWIs}Z2mB41?^1iq zgyD1;TDzEUj3Rv^=-*)8nRtgPfQK$Oa-J+S(h*vBG-lab0Q-uPrDJVT#;z$td6I7v zqz6uxC9z0$Je44%*PfrsL!0Cm`qPa`Amhye^!$)L7%|$=suHb0U|ziS;OVpGUvBO# zM48=n$eeg+u1a0ZNV}C6nPaF@Z8v!inFY5gLc8<1ISZ4hI- z4d2Ziv7Y<<=S`~aVK@N~Oy|Ps90wrbT|1`2C=!O6+vCP@Q@qc_WqeMpFeyxgB{Ijb zef9t>Edp+;O%XIW@%gURO_+%iE)2b>QqFe(NssIWfw5Cb`t@jJP4jT&$|<$2Z;f zJ+8D6(!4=Q}WDaC@uo=q-zqJvPSX- z^etVQ&o}aTt24JC|4ws6x)WK|AEPoedQKzGeZkKqN;VgCcupk9F_Rge4Rp=KCvZlR z^3iJvYUagu9#D3k5||l?(u@K};xI-p4@w(jr(>(l%lMJ7^>AZQ|J^G+1Mauk9`rj$ zns<6kn?1_#PSZ1KXc!hCZNULRcQ!N4R*I&vA%vql z1B72E`tvS2IFT}u#~}fzxgoC=;M>0A-*5XWxW6n`uR;8wSA2^;(ZIKT)A?O3pZ(K# z$0^2N#E{7rj#u4*tszXa`0Bk%sjgT=I_0E_sna@JE1tnw2_Bpk>y4!ntWi^ zAAG3?G($I^u`M0qy|~-+Hm?ZpO^t_(7UW8w4+u)yFEn_M{t2mIyVUJ~bGD+Zj4Sa= zW)(V}%mD@)E(A9`g3ev;FRNes!b)WhX-Xml+Gbl+%qAb(G;g`=Ey->~C`Y2wyJ!?? zcZt8o`yvFupmA?Wof>b?u)UhU838`pNcOBCcIC_}^OO3p2G5KlWCQtq46TGCPbGDMXo*8c$PuIZ?90a@)xLmg0A z!O^dSa2GZ~X+?fHm*iI?c2k&Fw}!>cx?wP%-S-KRg<}sLZMH`Pb6L%pv!wAj zOK?pi7zf_Av874Y(0A(AD4;xkW*AUkDF`W1>k_$cI*x}*4SURXkKM`wJH7Q5|1CiV zyA7V<{wSTcH#y#LJoyGt`6IuDyI5B88+W&e``r8}CP^uZ2tP^d%fMTyAwBvy3YjHl zk}ezCswVGO1S}KMsOhgrN-08Mg$X^?5V=gRoS^SUR`@k2v9~ znrbve@50V_PjYVi{)?ZI6Hxi1X}@}In)zG#iz=r{tNi=L|4zCZo~8Y-{R^ERA2zZ`+gCMjDsfC6xR<=U_W%VGy>8fT#uEW{Md6kayq#B zTHmHsy?;;`e?)!{M%N;hm^W{@@K~^aQ@{gpb@Zu}K_TO(%H_aIdw+<>TtB82;uo6t zquyaWMgfR&=hqOqB&ZnEwh8miM>J_x1uNA4WqQ)=L=S=L_Nr}%3^QTg(q#0XFoN!w zKfFVrSlme{?$I8KIwOybG-XcJ0VRLfh)u11TQUN{ote9n9Fer?NC!ctoO)C&mKX6j zvP&rtYrT9aH9#_+gOxiVALsQ+jCpfRG1*3N{T)VLceoB&ECOT z+m*LjrnE&naVEV0{l$Z61SQM2KmxjOG%O!phI=f&hf}U6XYa)$XD##lYS1|AMoepd z(pJq?W7V1GVz74akNBUfpT0~k*ydKRl^6p*DDD1!5YTV+>2Q7UKE25WopK=dJg0No zAwKVqHch755j|X-wmlZng+?fs)@2Qmi#OgkRUZ+(;naI1dL07#WGIbGfgyn7e+>b^ z8>avBl;d>__`ii;T^m67#d^-s&-XNU9hR-RTxWw{&5U!-%qBNMZvo=o9|sME|@be7Oe%P<&@6|k>z}uoLY*6 zOt`@<^r6@7r5GyeMKpabT8f%{s!vBWbIKmzXl&eqax3l=Xd3;RtHi(dxhHq*o)KR( zGLvLmi+?DTFG413!uWv7n`Anfn%;_(LJpO?Pxw98Nz-5|tuIBX40d*$b)}Vog$W~f z4#iBcijPQ7^^8i~F_tbJrIh}-qiM6Yct>hg$_qtVZ-vKD7T1Z{ScU)7+U~uzr0?0t zB>#OgqagCme*U93tzhiVKJTM9_ZFhNXQGTCAJ-x;*K?8k%18>x(JW&}qM_1zeYt-} zSE{2UyIV_KyK`! zbCixC1QfO)?C<^tBeH9_F0dK~PYo29?tv0##K4>unfzAgVDhGmL{6c%IL5Qw&@c|Y zEG9_t{AEb=$4LiB_~@r}p|7Ov#Y+sy&u>Ni^~G^;_{QW51hsILUA#2W=o++ zi@c_o%FLC!+$|nLc|`IZI%OFucsE**Gm4-I0g_k1D4v?yCzi$^ZVoC`U&rwm0^_BW zZ4G|62nSp3dHO>%36llriev|3+VuwDu>96=g>BC{8r!+p{x_t$jevZv!9R2`XoQ9uMSZ8>q=n_KnZE#BU zM@}p>$0hHr^tN2oiW%4+O!LSz_aSv8$}J#SWANK8k=v{mZ(yc`)8eR`OyfSa(Lrqb zi)=Aa2z*ZX0y=YruXiW4`_&Ffyv-D@7E@n$cWLS^go+v9j!^b)<|Eo}{3wxO--#rq ze}r{akQ~jS5u<2-i0P5xMt!3N#(;8o$FI@WPb@r2ojLjEGrtEa zkxp6%4&sVjBuQQ#MJcbCt2l>(^h@ub+ztZnpm1{qs6bvqVkOH&-_~ZRpgVeX1ejv= za7VBdZ`^Kf)&YIYEzf&>?8}H(NXi^hjfS#S(lTV^&zPd566d&z)=9PFNXuiGlpopM zy3~s{hP3{{&X!7TH1E;UGpYJiQ5(F~rMj>#ziB{WTA#Qh-oRkZvCSV_|1A5y%&(yB zDsTMmssuEDR?2Ud|K!la?jG@JDnG}1ogZX-kgc5-rVuZ`k}E%yND~#Loo3F&WU%pT z!g9scVt9>IKJR372u#dOpYyG)0C8vmZj1DQNm5ee@92j2)rNi46FOXe+C^2F407pj z-wfAc@ypw}G@sPeGF25VV!erymPdW4)BI3GIWG*Vxes~o$cafb{bVz>v!cD+!4d=K z0MVRo%ElfMVdYR*X%@gs9HL-f+$rpEKcq!0oQ$Tz0Dhz1ge=j~sSnv_-%)K?9TYu~ z-;frbR;E&``BS8B8IfDMdCQ{%x|*s22o#h9PZG@A#DODA09eq=+B(jYONZsQ3D z2YHizO&nQZ_Dq}KZoxr0`~*r6{}v#-AAXH zzgby~(Oo<3R)K4pF?i#ah!mUYyc~P=0s$RR&6F`ZiJBLbGjdM>FP127&vr^rB_8Q@ zuF0O4#JGb;e)`*wjEgmaDdxQ8Z1|YYH6*C}H1!?!Z9U~ZRq1|p@e{g!L=$829lPoq zn*nCi>($&6_d&36S9B7UpiYrh^p>`EsoOwrd1@`btISUe=E%r9+m#LyG(YgE+AxJc z1g0jF7R1^#bEpAVm?vkygGPj9DeEKAP|8tw<+7ElT7iH3!`n<#@Mr#$X5NH5@2 zoW`5Zqjmge%FV!|Rt4{xp4A--@uT;1FGg~{qxpgs8I|J8Z-0~TWff%#dnRTKgSrW! zi8&)V?BnQqvt8~GbbPl8Rty9T$UL8{rugRUON?oiH4x@lXChZGph97PGReFzLNXofj zZsvLkQmrr?;rwmQv9~x+5}pkUMW7hEyttCnE+louMnm+1k|o&v*e%8WoNq8Sjd$!j zqkGL&S=Q34jBBLsydPFQ;UfGP%e7%1GJpU(mAmA{|eDle0E7X@_J-zmTk@&=lxc2mzT_8xTxR&qUI+%Xdc*St~D{*Qwv_z z;Sl)FC?O<3G?BPxOVbyO+ic)Gh$ju9of9e>Ylnzr^}~^*v?cv zTqSH683o7FchGjhm+sUyXA@MlaTosqimJY}HdjBIOohzDlQr=j`tT-y&ilT@%>fRL zOvP?!cMTe8Vzr-IL}ip<3Btr&_;f6{Kf=TgD9TJMSVb8=Hq#lKHZxQY^VH}87F}bf zIV803IrZe@14odbG%fpvdAABeFWBtcNi3ckgDTX^o+Q#R^GIX(ZfQs07mLti2h*134AY9F+amkKX)*dC#`gs14x?dC`pN_*&_motz60biYEg? zz6BMaOrt5?Gw-R?EIxn?rG$|zd^Y6*5vVz^aN;;QS-kI^gnF?R**H$XH#ADX2A`38 zakp@_N={L^KSlbJjb%;}rXNzjp^7o>$NUzj- z&7R=csb>+2fiCYp7YxL16}*9x+bwn!q8pIs*K!c>_?~|I;D>ZT@o^JlWi&VZjX)DQ z^f+uCVC1dYDg|RUoZOrP+Q*gzk{gCZeHC+U2@Ru#Uc=w6r$Y47jGA1L5WHD(Jr4aRvR!O~% z2N!8dU%=IGcyE-*l+oGaLE14)x40^dCxI!srmU_{P23J5XTPndVK9IO6fsMIBau;GPsF=@Hw&fw+kX%8mZ!^4x3pYrh77ZpVOyi5g?7LVd zcw<>KR*<4t&~Tq+oa93pYuqKBcllu&ALb($zf0RR5!y!H*u_R44&Kmh#^8ysiS3y1 z$#KkjqJO5_U3L$OLD-ilYIsr?Zt-F_g$wNWk)Kfqok_9A-}QIIRzEh?zwt{0Nzy@@ z7Azh?oL<|d(DN?8;nIE&=6g8EifbTS(GUd7{R32kBMK#8HRbAw<4x&+3jZDw`uAAp z50pyW7yq1ZR)Q-LblYJzN>EK~C*JNi|xSn(+31vdPDd12*u?wCJpjp z(*arr`eu4!Bo{eb)T_`gJeZ7q(?(jWL(&=b#Q6(|&15Nhb|KIbcU6rf!+a12 zeLg0ZtQuHt^gy9$jaFSx1n~PhsA)`?C~;m;NqV=p%z!5X(uR(*zVA^cEpeT~b|Q1K z@+Bc-Cz^jMt%RqOu+elvP-@~2f77c!R^Pao_T z$I#miCY@Jf;puR-$N9X;i1jaLtsmKXl@p-*QDY9`0?SOIi#;iw`tLr4gzGbz%X#vF zTr52*zI~2bI7#l;!(|3y+z*_)P2Q5A2hPXCjZ4o$#m?{-tzScSFB~?L^e6Jq(;FT>)2^k+Z972kb zkZ@x8xMqh9w(-5U?#oxZN@-HGMO`{Sq8oAM2gXD z+r@af6~-GNcfXS*&#=V)n!6`PJWm6y6|73W31!tre;)H8tO;8w0-g_=7@HwPe&>kh z92iK=&Sod|o^g@b;lGqN4z+%4SXo_K^AwG#ZYip*z1Koy+C(KQ)yoFqHUGfk#{l{E zJ(aGvzcw&k779>1!;1#IfZjdIMd@|zL*p}yOT_BX4;usEJ=|;uMh~w`FWfcRSN~tt z;sn)?ZCc2=i0+ZgOrOVwO09g1>(>{%Yxx#lK0us(wZK{P zRTqJT=KInwpNh%fR#wt2 zeR{;5x#{Qthc8)A&8e~5hqwN5)=vB@JV5&*wXG+1g^FEX<8A6x7w+qWxXei3Q%TOs zKoml-0xdIKx7`k@siVDV7qW0oK5h!aL%cV`moO}r2Jl1)8{=pX7^q@l@>-lmVVE> zvNC?UCeOB`Wr{=|w@hA|4lOx!Y;(9dH!|Cbn8 z;M844`4=JCgfDj)l%G7>Mm<4`nEJ;II8azMnIuC^V45%t9a0Q7ZmYh?y!OS!KSKIk zMNR6?!8Rfkg*@{lh9HeM#Ejw+4JAdVA_RBJSMH}Mu10PT#(6{>l#OtR{bAw}&mtZwDlM>IKoj$OFVMsc(1skx zx6wZ^E5@?lTM8Zf{l=`N%ehR;i4S)UNyC1K-|iAJbdI-g4>zIE&xyVfAyxTG>i=Wx zoT4jhxCI;Awox%FsEVCbP_gY)Y@gV+jf!nnY}>YtO429ackj5}fA>Sb>@oI!I&T>> zYppqp^l$aM8SbE+kW~a6h$t(7f20d*O4uf6GpJqpqlbY}Or!&`+jjp|gmCVgn<0H( zmN3~rnUQ*a)uigHUkA+&%uzv92|@^E4bmkEu)g)(8|M>TS%HwmF%PpIR#d+9v2Nss zU4SRrT;?}qc1{E<=d|3!4X-Rr-~*v1zeDS`Q1f9)2% zhC>U(73>uR0`^zTvHO*5tHCyN&8OC-5OU~@ukL)8#deUT2M>@sBcCshZTd}xClGVD z+2I)MvxzCBQ-cd^Vv>uY))CNrC#1J3li$wo&bWiCarxCC^lO`dVuI6ZdPB+UznYkd zx~V2GcHqWb#=s_KSo(9$57`6DJ<-a3JxFk4W3qlrbSR{zc^Lr0?0xo-Fb zbruZ#7EZ$vHtvyxCYG#vt;Y~IwuL*T+bors7XIJd!(kI5Z~52>Y(g*P3GTwm*Su(O z^CtLMI}CHXeNEmq(tr8ENB$DG8~p%{_SBp zwQyD-Z-JwpCQPt9tEk84f=jNbw2UCYB(n4S?JeI+g;mLNY9cW!HwaDXNJB}1dW->L z;xz z=g(fZ@@1;;f+qI%=uxIv{@BxT9bB8v;Vo{4L$!GURt65v%~e5KiDPvJOT>(6Xx?lH zoO6M74N}?Yn?-S3Rhfz&h>);A0wf?9$*O`KZ_Sh8yEKQRaX5FF*5p_}%m@$mFKkFv zuu$hb$QMjt9h`n;0(Q2!W|c&MB#l(2C&^Ta$tsX~AFRpYY~d9f3s<;C;;)bojaHh;a_ zD}b7@{3w2ulDfF0gLK*s0IqgNh1FZ*j2%vNB^V8z<`b6%(~a101my~U;U+9mszra! zInTS*7xy?-C2l?am!uS;g|P{|BBQcd$bN72D)|aOB=m2=hB3=AjiXT%s%d?!YpIa0 z0%`-B@&cFCq+r&4lvjG=Zj9jIHLei1l)nj%{SEq4am}IiQHW#(pr$d{noW01xmrsj z^5AWLN$6{s({AA$^X@$K&z$S9jJZJ%o0>G(RZCcefm~2OI{h{;>?oWINT(mLT5r`zX4!O_Q=$y8Y< zj`Lm*?$F`PhxU5))N(8$!U~5{piTK=aeZyEPrhmEOg(eI;o1#7f647-Pzyr`986Fv z?XSzVCW#B^ys&;5`k{u2Mo+1{(1GnIygQ5!+7W}DZ-&YP0$5fO5ZLrbMI8lzP#B<= z4Fuqbiris?irx;d!km4-6X6=QG5pGN{%#$X^fpv(~fkuZ{IVau()-#Z6? z&_>8L<-@>G|B9is*_#s++eMGTN~Qt_NxDA~(DM-A1V{WN5OKIAFq7cOBp2V}pk;5k zj-kVD(&qM~XLn2^j>)6WV1EY&>bG zhYP_7&62oj$mmK<_uxf3;`ySgL1XLK`W2ls?m%)+f7I7R7Vm+}bDB4Mt8xzdIJleb zExN#sT`oBJhI^I>i604sUOrA62BK7{9tS0EmWubgpHax|T zL*bh)bBnHjt!cSUcuCj5SzEo-f3kz11oZ#T4p_+-3ZO9m0))1g%_;{v(2(Xg?=uc+ zKy!H>w=}uSb(}^TTGzMEj3Fwh={TmGq!sF%X7zkANhsN&;T^d)NJD^7Cw&toe)H7! z{iZyt{oAj(bihVNyvz7!HuL@NCQmk^*7&VPwW+-BAhmRfv<bw%EEG5?IYtTX=2| zjHm>lypfN(ySg$HKS)n@0slv=qI#F%HG19dliFAvc``6uW}m867mV*dDba!exfH}T z*HMKt){mtvX0?8WeZZOxXA-|a{v3`}a^4_mKImy^4fw{hMv?U+Z5{MEvDN4?#`43n z-o>^4BPe6@>+r?H#IJe5=ubf!>nrP4Zx}%SQR|PEyfxoLs^H3rX8%8iG~#&Yj3LF=;2xQwamn;wKj0!xLf^p%=sS2ACcQHT zs>8y8{%N_V=sn`+06@F2RMcV-S3Ffz_g>|AC&#zKY}cPqRAbQnr7(bQ?-hzfIGRgK zs-f#DIjfu+lju}5LpEDn13dkYCKuwTpfXFf_p z{7{=5QO=D`2%Y)-F87C7?`wQDsHnCj}?N- zyvb8j&2l9fL(Zer!*9P>zRn@J%V5r7J>+!$IJ;t{Rwe*~6VoW{4^lsOsyj>i#k3hw z`Mht_zcsm(1`|zP!W4g0AAS*(^3h9DWEcL zSc$Uv$xDhwQTa4XSFh}Oj1Dix0>m=6NS#y?<-YL?1S>aCJ7^JWAW$&yaRIe7IBC}5 zaJGXvcFD0QLXyc)+CAFpU%q>u`lCsHl|(BRRC^2L*&q#v6Z8s?#T|)aJ4bCL)*EPt zM#sebvmDaKJ`~Mg1W@nvb0>%2cq&dU_y!Id*SFl6t+1Jm!H(W%f;|0f?pWkql3Oo(CWcs_fd0`M{OS<6xnxGa^oU=&VtCl16U0B!=JEX=Qt8u_`28fr2L z5Hxa!n*C^eBY^?UzbdTtCe}pp-6DmFDx~?qfaY?Zf-m9V<(7_~;^

    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) z{+LU{=*HZW$ljDfh2&T=jotFC924z|Ai0f`a#u%u2qeUOa7Tvn_f z`S8&+kQ|cBljIg>GB9^AGmBRmqPppKO3GDSwi8#OmS5SJJG3@|1HeGz60T^~1d0wy znZ#LscB?JeGS$(Y0JmjxK@Zl?(=;%EUlOMuGr9(E|GY{ah|2TFjj&_^A`$uC3wW{G z!XR;ulr|FtXWlB_vUeOT|C_5hvn>^lZ`3F(c~^*@kxbdmQ^3XJcVEZ zJ2DABA_5ED@NmA&vA=$PMWAOnY086by~-e58IEOctQGNy5&8?g;TIvGxMpE#_jL^C zB%)9LeqlFA7Hph2jQ?gv>-mdW+%mZ@vx%7KBq#h4t zj39~=+&^>5Qx%fM#O7SaW?VGD!L#J>?@ z$-mi_wvp~*kCV#5Ne0P2yVGVplchg7-ij<}AA{(UuCKExhvNEkb=@@lZ~52B_&%Dx z52pX;;m;v$F3)EV-$xR+Hs`*b{_po;iGFg9ujWIEzStmzsbeBNe8Jcr(QgdSGvms= z{w4_OZ;=0hHhe3DR}x4-Ku7NX4cd_7{uB-N|2MkkKcJ0>p^KrBp|k0KLpC};kWCBn zcXv*Jsz2K=BTDrcStI^~GqwmEpV~Hrh2&Bu_1iR zm^d*I=o&aEixq1vngKK)F`vyFb+o!v=%a+G->+iyrTCsEmXp5b)xJLWW@#dXj_<^G z*l?qOH|)B%9~;?>%E{(~n#=gd#l~hUzh5Yc1m18@$6@*`m7f%-G^lXTRwFcfW$neJ zD@Cz5_9)fz`$6GHV5Yk5%8Qz0W*VSY4l`8DXQvE3o~_b_M) zaNhHJi0-1sq(z{wAoC}>DM z6-Tqu$Po|5OSW1~m!;oz#Z48-fozp*XvDJv5w8jdKXA>z1tQ6dL(5U6cWt9aw+FbN z5MAd}k*`IX0NOuZ(~ut`e?-6H)nE2?>rh3qQ8S{LYdlZt$Lp`=sIyu8AR`0|(uwc@ zwd&)At0Ym4hdS;baF(!4^@2!ZARRL(oudV{P0C}-({%uU-s zDM_w0dZBv-3`i^w8dX=gOSVF|6qV=z=D6~CkQspsaY596g5=gF6;+(5c`9eyA{(%Y zBHRk5<+i_Gz@UdmSg6vunsTrB&RqUY?fF4|?_@?p~`7Y7A-dZGoXE`Cu#gHO?c zQT}pO+*p6+KP1*SdEG}>z4x+xNJ`qfuP?JRv`m)-{5*ciA}e%Tcu3I;oJaZqf*GMf^zq zrDB7Hu%Gy8WidIV!{;jy?Q=G6K%#yG)H@Pm!hy4N)get)ETz$@*$7S>Jrh25f#9TY z`KS~H^KmXcS#(SX7+hxhKRnd}JfKaHn2Sf-95nmIx!`i(jE@Mf*nwmHt~_Itr_SgF ziv$A&o_YG-HM8DmFxY_9TyhW`GS2rR1M-h%pwo*@8#C zM`GBJ_@qBTA(-aj-1xvskt~vIw}w@nnOpo3K$Z=7OBSR{v`twfCW{dS7|pJTiHa^X z))CU)-I>N6IF~k$l}7T*7BXNk#9r&*y|+04Dsxi^p2WhsmJ{ONT+ss&uDKDsclbXg z<5Xmai2&cS#S^twY+*tAnm5PYhR|p9GcO-SJRtd0m%9|F^gc~HSlOl-Fm4Ch)B|fe z>nk4ZZ%--9ODTt|x`z`02BtUM$i}*1C3jS>v3ga;tfjdFs)sIcq{rHAd+7$^Vie){5`@92iD+`VfJU8(%PKw${teyL<+xcMDGghK^sa< z!jzti#~>gl`JA_}U9bl+*g*!Tv;`F!O$c*xE;1hQaK=AQX+Y`{Dd14$9vHBHVThpx zJG%+qxwb1rypJe1m|yR@dL*}0VwqmDTd^j zcGmU*vfA|u?b(`8Zx?tNykPyQW2JY$?_qS>s7JTD&q|mvH`1YIF>J~#eUfIQK^qFi ztYBt1qZUxfPZnjP9q==a5J!xX|ETUxspAHyPH|grLKe^g;0t}|gN8YOsl!%3{Ha0( z1)o*9IaMW|*;v{A^kp#!85s7%^ z3Q-)H^QC$oAvY>ZLdOeYdd$pkROM(c5=krTrv%x!S3TW69DB|Lb9L2>giWIcts#~d zsjVy!g9J7O5b~9$eX61*xvFwbqS9uhZu}yd=SfXn-@AB^pOI~0=e16y5B@%EFd}+j z$Ng(LvwJG&ifl5M`{$mwt2L-s$DwWRTJgto~DTmCnN&WvXRPvmSI(&U4ZI$ znhJ455^yOIXXWL%fK5BSH!#VTe)WT?S1Twl>tWs=fM*^N?@4pQ^i2mGr;`ONBxeOF zNW;J;tR9&r^`z^W*v zDPKM4@N`4{?{+q2dk3%@IUS#}ME?CqBm|UtTKJE8Ek2c^O+0MwWGB@Pqu3pT*LMII zoJq0?pmcpQ{u{WvF;LNaeADqje=e3Xy4NK9aAqk58u0*p;CDhnufi_t{b(E#Cw$yo zHZ#x4;LSPCLN^%)1Tz+jH#!25TY4aTfU-fH_pbisK4=ML9{jD44Bukd{pL_=ZU& zd_sP(+e;RhYQBLX#ng<)lQuAIhg|vzCZ5|jzhoz&gatID5^IQ~>)?PAgeTK_$W7B-|$9mr2n5{%d%I+x1FyizIICd@h@9fDNJq zz;PLWio z4|&Jtl1QQrhrcG&S?htL(lKWbgk8z)H`?qW%AyDnsJ5&W;u#7sknqXbcUuo>gXs0T z!#jJtaf+$niC<&ZAZ#HiPu`v*8->mT* zH$|&M+fdz_!2m~8NG%j@)BiiiQrxKLhGG$->nXrt=m^7h{gM<-RkD-*y$<3Cm=?5( z&OfrSQjRTV;iKytr;FHIdq{#{tRS}n|f`CDR&tE}d)^Y6Ex z2q89zW8-|Xtq2sqDx5f#7nCxzrDj4VP8JIHXY9;k=^0niBZCDC<+;n>;WsQsJ8>wR5%yp`qi!wA5h@m15&-2B3 ztlF(<&6B@T5yTKvlpa<%^j_TFw_dXzbL zl!KGWnU8Z*S#-J0x=F3Xx`fkDc$7LI<>Wpnk`oAiWsL&9mzbbRb+{^QJbX1QiSVL# z%jMXx!IyUN?crchrLsG$<$FX$;7BFOE7r_Q43mtB3A^t}uV+e=3Ag~F*RAxKcOFyH zz;Tc=roHqj@m;=jM#`}SU>n`gXq6pNRHcfF$LHvKGC~)1#X}o!xl}m?1ukNZj``dQ z@dZ;cu;SqX=7z9@phnl~Sh9Nc7Jx?`rjUdedij*fk(WY;&)|7B2|fcu;Dtb#kOFaB zbEG^1wqmr@Fo%q;J=*7(X@fHy>3nZmiF}-klWtQ}lP=)pyg(&b>Lv9WE zwJBNH!)wTx4L>jleM(rz`fQnAS4%LqU8Fj>)>k!+i0|*ikLHYNp)H7#ZOITQY2E89 zh3;y4Cg{t?ZM7YWTU7Q$dv`dn)NVe}+|IZXaABCjzFk~AZy}xzE{J8NLYf&lW2|+s z91cKIy-KY{$17zAShE}*%ex6Ysa@HMAAr3(iv$)b`gXxMlu>LjXXwJGe00NvPd~Jp zFZJAxSH6g9F#BAkvGTCAA#im+I*diGR zv;f)v=LTEx&OEvS%=$NEvI)tZ#40eEU5^&l`67;7S{J~zBwCZSdA*JLY7-Zy?MFD~ z-sx&S^)q;HRW@I40AWu=+X6~|I+Gat_qWJebYZ(<5;>O&U?dbQv>5e`@1B0)qtvwR&_zIXSC^DYz(U#8&3G>btSjDm1_^83YT+)mRW)42tk!mSnNoz+o?( z&I-plH@!xIUdbjPr9g_ZBKo>ICx|AlRI5^X7<(}B;$T+OSF5LM^1xPZ?d>*@R4G@^ z7$pS?PDTS3@?y*i+!<;hEkUlxAYz#hJ1|S0S55`1ugxoNzfza}4>iQcge-4`gynqC z8xR1f>xo14F$5J7$o64O>-3uN(d|_dCmi*4%LkDZuGhv#?!7DmV8k$q!m#R8c*e^| zy7;TLq#A#%?(W?t$)Y<|{S2di^c}MRxA~4-MGjn6g7%ZtDF?5V`n`;$l2VKn{a}0e zG?`l~ff6si%mvLur_?XA?slI?Oc|GzFAGrSiE3_jhNIW}_cp87j;CioZ!OU|lur;? z*zQSIdDdnV^uu~fsBId=a*>|4sK(OoUk8=Xd!RVN!2`a)K!W+#6@%W3roN6hsK#x9 z5rmE_Gq_2YXVA5mzLAK+lv^k2(8ug_MsA!>kI zX>n(z{_WG}!TQ_k_?x$RmA9MHpKidO?WY`x2utb5MB2Z$&6FvYDDJP7wEVY+&iaz; zEK}PYexK`!4PKw?i&JlN`E73Rx2?20vY*X6RF`}5pwah)e75CRPM6oy!(x5=*O{hn zx>AxlVF;}ouTnv0`{KIPy?k9xmfB>s8vaPV@Hhy?sI{cQHN&=h})^Qy63 zVhhJr;@=B^;CrMwf7u`qlMm~SHr3VF&scV4hHOvvv3wNSUT^9k2unSMUbd*Z#jV+5#uG`HQy=*e1ahQ zZHWQ29VvcackjUhgK_r7qPx6HG#eBh&pP`~BJ+i=-Eejg2s03hAjx;fJ&?*t-Bs9k zP)Lcrd6Ks7d)LHgT8Wkwo$s655ram~#29KiZ?;P{OVmA1@4#CWH%U@U_n z0#u$ZO#T;k4o0)YFtxbot58+;Rl{xVhi4lpLQH-D5?2&(@lPpGBrl4DDd2!6)AQwOy+!@YKTIN%D-2J( zF`1NOL&s6HG+P0CDE!C^?ixp{+JBnhrUm@6Vgcb3%$vU+2Ml+>2wjW@a^M~*V5<_u zZ_SAf$Bo%+_X}R?eMNA8p_rRf9Z2VDiAj7Ayq?^ZA6+xt(~?r~5Yffd#6?JPLx&Jr zf?y-TO!EHZzh=oet9*%l5Yc*n&yk^Dhxy$4XI_6h)&Ma1RjJ@X!}ez>fDK{6j~}2- z7ywIbIeLwj7DAq|{35J%7G0(fQRK2ozP!Uk%)$hUG!zhb>K)}Ga7kznMGYA5;h`K; z39Gw?BnD(-sn}kO_A@}HJcc_wry_=8W6t@*zaT$;n=da~tX$7Km=HB!PQvI`tOO*# z9)XHCLb*^uuE!YlERip$u%!ePQnxAOBLXFHRiT=tyB0k?jKUz>(J zJb0yok#KL~kJpelY_}>bZQ6M|36r8lkt)TH*U(R!UfQFx?|ws6^Uw6ww^@xnt^0Az zC7^5YC-&8_#QLcJU$AzKJ@)-w>$n-$@@}91hG3k^a5b6rv{Oclw z!yt>mB*`Lh1E{{)7$sKI=d5j5eFlpWRd>vlX;*NNqm5(!YnO5Yqd!TS+#%4V6umZn z&_E&cToLl@f#kBGzM;Yhln;4Ak)F`IU5_#m?SX)?%QC#F_>9(iJH*yM`5%iP!Y5}C@ZPOq)I@TChsph<#wYU#WFWEM5ChCGTN|Dl&yAu*+kNi^=fRk2 zc+6yi|9Z|!5)F{m0V*29j)x2 zcjC67Qrzb-1@xu^P<@lX-Q}L@kepUx#}v}MF$|3cYMhHEe(|qET(&av{;g3YtE#~) zIyMCE4m!*FJT%nA@m@vZf_}B1jFL((0yH>cH1QsTeL$SIe_wFNK@lBPw>aN&dgIc) zNF@IL#Ahi3oypK+p2uj$Y$GC3pb7n#F`=^(L!yWvfk}rEfPA6?O1}JOH(d8!RK3UM zxk*YkZ7M4_uXsaUr(~}86Az{}GCRVcpk5{SAr8|o6zp%v3zdI>ru_j(1bhokEd#Zw zZbLVd_#kdK+B_pzR4f4!N;t;kK|$Hc;V)0F=OShMsnphrlO%CkI%SOfz>!1{ zD3vm&B((N;KPw0Zg1t6tL59#D5PJP5}gqgO2KqBn(F6PSp>>`$(Z8)ZDm5rZRE{0#0fbD0enPRvfLPaMcbK1)^fyrcV z&84IGCySkBjZ}EiisBC z2_pC|z+ul1WGBM#1mrhfWgMN@{)S|Hf6)_Jyp!#GmD&s%L;O!DVr(&N;t-)BbveV-uHE?m@I2ud;Ti+q240bz^(UNswO3_&Xe zU_`=l?YMh>GGiYqBtuwJhhK_FLFgi5e+>9`Fnvh#0pYj?8w zcPd+t8BypjRSz*eo~=?(K#S{C(j!UFF}fHYmgX8k7-MLHfJK&$ZQ~S#T=) z@)=#+_{4?ZkLn0ps#bFF76DfJRqk(CA$#UAFmaj#N+Zb_-Nn4sz?cmiJ&;Bk;BQ?D zE%7{oIDgzM%VQJDW5D^?(i`1X=ize$^WQ({Y)$C@!>ZWe>qfy=R{X%VJ3DgxpmFdF zWd_^Bz_EUqYUD05o=o(c5b(`}&(?gGL=(9Ez3x}EJ6fUhO@at8QJLo`W~5|SbRz7E zskA9b*xLIxR;>XyxQ)NoWQG95B%+eZm*hD_Sh{cG6E&Y$4a?CcLafb`^+3cuNX>Gh zl~0OP#2XV!BbA$qvweFB1`wH3XiQC8348oX9vHxQ5byyanW6>4>5#i$0Z)F29N&j-f#&>QQBPay zA0vLXwV2<}&hDDD4)AYPlEnlxE~7e5vnA{u{1?`pDNrUBa=@-$j7EgneOEx#xgUz@ zX4zEa)p#SnbO%`x{*m}p5|%bGFBbAw5wFNe=K7|#{Nm4eYQPf$c*h^C@iLjjl_3x_ zEMElWg46|T@{BXE`iHy~SRxkYd8sBOAbUx*7jZ4R+lw1v=}+S#+Ozy8Dv~`?UVE?L2LFj zSo#pSnX*6{QUOF<_bqiD(@tTsco`gt%penry~5o5&y_05l?SkuzPIf_($jDr#U_(0 zcf%!QdHX)g?$c1nh494_-%!ZA63FQ2%g=;)Q+%SZn58Km;oRt7)*yJwT3coh4f-df z#tL*#1Fh$_@{rg&f=@i@cd=vt_>y?90jFEfg~rMN=H@PQytFJIttEMMN^h&B#qPnl z^`O&R>Ufo9L6GrbSi9r~YajNXr^ozA4lqK-S zixhSW^n$Ew_h*CMtikFl7xdfTIfZHNTVMJC!DAIROR=a)Pg8Hx1xZT)^h$k$7-P;R zrd2XZ(I6J=OtnwNW<@ith4v$VsM@0WrMweBQE$Oo$d)Ir$4fiK9>l=D51o^Y#s-QFlKlB`?E-BxN=GL^vNCdQHc%@Q(|c_jL-n8)v0cDeez=+6tLXf zXDnuV+l<&avP&bss-k)^ce^>ODZ2I2IXOskk*yQ$uS{g9DI*kADY?J?x3DA;NKNtp zaiHpehS|%$i|d%nBO0iTBmRUIPy?xG)-9M+-+bpXs~s;byw9*>5|fc|wl9iKl&4$2 zj-~jCTK5yTo_(K#pq!Vb&|r8#N|Bp(b`$XpMruOW&^5ru>nmV+%$FTN@?h+P5 zsJqzhG{GS|o&97csQX|oleOu#RGQG06dvxR@e=YTjX{2)2K9L)GzQzBVZ(-%~(@}8Ks_uWrwJKICv%;R3>a~rixw@hhB(rIJ!mDKhUU+)dJ)z3Vv zcExTlti**xdXT1XQH!~9A8stJJ+Q9&y|^g5T%J)i-!`qrt~211nww-#p z&Oc7O%)6dNf2OABT7RiO>+)1zwd+0kEGG~p)mc!%7mwu=f~(iL}%e*Yjde( zYroEc{FSZWYwBMGA`*{Ma%zYCzQbXeA-YAU_FO~p*Du*Z8(Z`4Zv)CT+xMrL#Mxy0 zy;g3EaAbax#FWDbCf_~m;%5&0wD%Q0y7)nYx0etd9{@iS=NYmQ=a|1TdmpDQw9RiLQJlslvw&IZL}To9WW%kG18w7}NS@pJonI4; zbDtgEW+2>D5G0zAFhb0Bj2MUUXo4Mt|1OMN#wiCD?LeN*-1j1GsQ5Etvtw;lliX2c z<2LeR2tZWVD4gDX)#T>Zyq!?c^^>=fas3F2LWe1MPxG}*liF-aA59Wdct}^Ai7emU zSa#5?q}d_f!6*%yayfkkagN>~3C?torOeiO@HMfoTN~B^Le}YMpB%mA`jAHDpHOKT?+z7o`2hA>Vg1BgD-nv}J+hA4pvJV__vu~8;OCqy@% zA|*w>U^Vj+QecvMsgbo^p9S3IHJzy?G+E+jD3;yC8&E}P&FE}Og-dkg(=A$kQ(BmB zcld!1x0oTmM}(rf&G=h``Z8(80v1rd0thXGYKIv-Y;^o_MfkdT@!5RggTSObfCU$m z0i%)M9dc{7Mz&Sx1Gns^P#0-%wG0_Mftn}Gox;ydhwj#|+jwK_9`S|s+m)Q~L-U!W zpdTF3K7wlp_*g8bS5uqWRw*{QSngY$)}8C0LZ%6JGjTvtIs)sZ)v)~O=kPE3CS#%lT_gysb zL~R2NLZEyO?}tFoWA>GqF8BZeM1DkygZ(m{f%+iW9@t(K@9o~++!BK5lJ=}GiS0|h zwu284$7%Wz&FAO9E7P^|X$A@cy^$b4frt`w8~EF#?82}~2%6eF-a+*IU>vn%0P3&Jos|?3%mvGgL3&U7H=KTz=eKSKVY{*PdAv5qy z(*z5i5!5!b}L;E9YgUZ0Bnvt$`#>=HsOU|9M6One!TjPVJ!no{P4?H>`ZE? zG7Qkb$e)1afG}p5@wk5QTbXQu==5ITUP4h8FCg%7V@9Ai9Pk)UNyXU6G>ilSr6{XD z1Srrr=!AR+Oz}th#ak%V2B;xz_^O$vW){5JXK*)~u3AO~Bz;RhQd0YEK(gu==%))N z;MP1bkqiXnZ{N7{cGA{0OCNI33WnfQRhu$?`v^*=qLTj%blwyn27t@d>RIOmx2el{u9V(j8B{3$&*?6W7q4~virmNTYtWl zsYIY}XulTqEXEX(yr@J0VCtkI#jvX#+W2UnqY-05=!aN^3=eTiaqzN~OUAVP99F|< zp{k|}W`!F~sn4v9I09)>k&(XWMbF3Jw z=v0fGnhVRx?rRyLA9;;24sVM64mf6=!VQ+Wg9Y6r1?l~elslj1)>5ux5VZ7~^}<#q zd$Lx_lwk6od$a`ENB+SNHtf;|wG?%=UxZu=wZwp(0cDbPL`C?&6gY=_Jhlr8X-DKm zc!DsfD`NgxlzynxfMS8M`9wIy5ITN;7pPXU-TUTQ0hwnRvfjL`P{j7FnaKO!Cwi+h zKss5lm^T&XnBL$J`+CN%RURK9Y5r~Ib2k0<&Mn8!s;V^{H2Jlr3 z=LHVdZfh8JaK-k{WIniIuPJ@dmN%)6nu6SBh1mG-aQK0GR8m3n3_&yFkz))ZO&_@A zDbjS*)$2J0@!bSFoLeh3mp3!TgfYXP9G@@Qk7wZn<5iu36oTHhe4}1Y4N5~s4|Y8fwr7Ves?1={2tbB zEF0Z$HrO*2RM8Bbb}h|tB9B3F&AwwOvwix_Gs5&21dwKsfWo$;5lk@J+5-+Rjns}A z_Wm#Sk^5bOj{B;s;EOcbXzwr9pl}~yQ9@9JCI$P5%)|}}eOQ>kM&B4|^vDhv%bV4! zVJ{8M_dBzLWODdSfX$gVN>)Dn6xD+-K`*7Dz!Irt_2tZmOJa2g34fzgpq|48Vfk;7W*Ok7v z9Il8_b&x0rD2ZKt$^nQlVIPb#r(U88iBPaQ)*phnRzyCZBtURmA5?s z3);vM-c_W7iil&TkhFWE$43Pp) zg^eT1cUfrC7bIYqn{FC`1}gPdADCW02he4Vw*ODCN~+{Idl!~UwyoItshLdy=6K5Z zG*iE%JAMGLqC)h&3cha-wY)<;Ix%MahCfSjKB|-ZNFjg`O}#y^|J|^y(1;pJ)%! zbbOFDM;*ikZVuF{ZIHy&Lk%DPcMMH9dsyv3NjOS5x*NC7%SX7K5L-z4=JQ8n8zq%M z{*d~`bvvbL0w}7E8l7)TFGSE{*5zBg1U`y`^c*owz4qZ4*qK&Wj>F+&1mJKe{ivj@ zm{OuGn|U3x{eGokbtUu9o#yrTcyH@@c22UrDU~}-pvIVo(z~msd*=m6{p@X4H=}iB zbxxW-Kl8Ei&th)>e-7QgX1<>jA8%=|-xtizQzKvO-7MJe`uuF&zBW}$kiU`j)nST? z6m)Hk|6&h+sM|h%6RmMue}ny}P9A6#9vOxP0y?Ds?>hOvCVl_6PX2#NV8V0uZ}a3| zb#t|GJot9=kl}aMD?7cO?mQgC0yLV=zY1JW+Qhfw@K)T?GY0lqkm4fef`+QR|JWf> zCpvYUx3ROcPsxr;zRo;WZ74+V*|N(i_ht%!tC`z=C)p-AyE#jSMy{|SI>3ipGTCU; z^kNbg_@}-2lSV3!0?*~d@t-7um&s#gOijz(dzqVO6+-<)S-vKbnOKLi0067Dmlt;3 z#KXKXHmvO1r(j|-N&#o97t@j~w%VbVM4Cjl_H1Tow~yNE@fT`TQO{xcN_43< zISm-Bb7u%KUTk!bQ*56Mu?=7^#4nfn7h9Ne7DaZw6DHQX`o)?K4%IX#oJEL9BVJCkLtJH`XmA%=#bF`RLPndA3xWE7cT zO{#Ik6oK4T9m=K<^U1OoexSt|=oqaGMV5tLF7Rm>Cha zIT!j_7*+0519p5e&@J&1o$*9zNX-^r=ZA3>Y=AK;IV7W2oG^4lQhuGdmm6kbKPUC>oPFU@zSv`g?{&z(E-Nc2ufXUVJqb(`sTdCDC?#80MjgBcP+lt1va3qx zS`GY?L)fy}x;ur{{!Sow#c6lgA+Vs$E>H$ZfK}6z4w)rsN?|iRwoC^eNGT&pT?g(= zl>&PCSlSgU`UiqWs0?Q3xMEF#Jc2?MwMO-DCH$Rb9!N^{t z_e5Y>|H=m%&sgfgs51?~M zKSr~9zesO%*@dYDG|KTB{h@mSv5MAt-+_MtG82?&IA@|~2mXX*y&Okprr(yY9}Mo9 z>og8>@^VPBBV?-TprRIq?OB-^V<`O`z!1D3`Zb)dGoUjSas1;QRiz)dcE~sAw@fbh zIJRb;ifEYJyVfqmOTwJ!a8hS^#m7Cw4@B|Q-%_}v>j{z}r**MHyV^yF@RhV8p8-k> zeGZSb*&8LkOd7YmZRG-tsKu9E&rCsd+<}XTe#ETXXQmKkgf$LwYQ72$SKbM_Bg{Jy zT+D{!EWVT)Z$+pX#1G?YEroM-8 zKImXkxR3;Rj9b#s!HKAZtNQl8zo5TmAjbWRFQ_-LHu#|b97M^?z0xBHN9t)ZAt30m z=d|K1A!f1dARA~E_V7@>V&&8=3nGoY{#IkrNU-CXS~^%E%toQ*F^ZavS!>E0qO;P^ z3BPPl)skOSPZk67)rVK+aS_zT2D)dDTThPoP}wgx?aXMqgn?ND-_u$y|95QWpIm zot|dIFEXLOc@lJ8^u2c_bxlB57>{^UPjyo1rDoy1E5{#|m}kQmkMeDcQe?$|7V18- zxrj~EFzoTOQtd1dP-7;<0uhL2Jo|{};V$|xR(j;g`O{>-PqS2*-=%_Wf@YPRFCpWuSV_f|l#webM~)057ot8!qCNI6E2A!0 zks?I7U`P~(bDHISYA6Brx_VKk6M6;|)qqZR3_Bt%jC369k&^=PW!J4}5)J;mdx|`B zKCU=S`Kt3|er$rh^3Eg;Jo@!d(KSHtT0IJSs%F*J|HbqqOv_HZ5CV;>ojc)7>l>1L z85Q~9`Ou}A;o0AIVZVuG7&zotSUQ_n^W643uV4DpggkXNt;zrfg4B@V<6bhqWox_} z;$*;KZ!QkI`leI_NPkqoFaK?4d7JO*VGUXYhq*C*N+s6aNrU3>^ z=U#NR5ySGdOm`!<)_wEy_YWVV)#j3z_N52Lwk~MwTn{Hrdkp4Azt{5QyqYRXxQcD^?b1Zb@fh!`%mWq2RqycsskSlZ`S8%-K|oB{|97>W4+Z&u zol2{@es}%agR?eu`9Je$0$Z0=&KsYfkfY;8H_;NKiMM6;$AhUkgM_O$I?ry-Ecso#*#HyZ zz~*(IGRtaG?mut$JFzC&nx(T$B;0b%?;wjPc~E^N17P~BCi86YfCXq&nHkaX)X3#s zs`oEBI-dvp_J`wtm4s+eMO>MQMpnWnwbJLMK+s@i(EH+E)hhY@%7$%cPr8h3d8L}NCLaO?yjc@h9!pfqOO3V6g9Ke9as*#Nf^q$G*W;fruu`J_OO=}pHP?7nTNQoz zo~W}{{3tg<=y%MBN^jJ^=BU<7ukJYnMtPS6Jb2S6sMD;rxngxz$b-RjI|v79|eHK)C<0fA&uZ_JapMIA}2 z_dFSyb3@B~*?aqMU8w^o7H&zJ_vx%!u_e(N0rIPane4aXnyWtOFG3NML{r^01Sc~8 zLor*~+pq*?{BM}~a@s=LSEn%ctfIDNAPID6Dp<0c4ZqQtcM#rXx_aM)kjm;Zw-^ZE z^icouOkVmteyzNP{je4n4lJBTFOvDF_nhEesyx^Ao$_6r@BsgNiG=B2koD03u8K zx~aIdz%f;RU{O;vb;`RjPVKrWqo4*t^8OqA%@<{*5M3l)-}~*)J-lOE<$WOhj#Gdz zQRWeUwqy~q84T946cQ5@KdvMDy~P{p`o^_Foa;uS;bEpe;itE=FZz^C5EMlJeK|_L z&-PyAM&RhcAm;R{V2mA3Tn^$4AdEC27CFTa`tRV5AnXhwus_zAV0!cB*Q`MxC)|Mw zZ}e-wlz!0&(Ur9HmN>4HnotQM2$OIOI#^AjLSvM)wcvTyMe8P-> zC+Xi6u!IkKsOR4iVp~95tEF66aAy^*<}JGZdi44G*b^8A=txH6HVU-p1ENyS2yqHz z2L(g5FWsQvUYXG~L0Uw`vVNPwxx4SY`KY(l8dtPX2ZU=D!rA3{iv%mkr8i(;3m8Z+ zU?aR`9J#E2u`u(;jIYBJmRJ)}G0A(uIm$SF@dMCkIYz(^4JtqSxi?57sYLwb-Wj6_ zu@(x&azTfBGh!kmnHFW6fyUt|Y_DXY?hXytktbGZ=PXcAovob>kJeYdb8py}4V2Ey zb+Xc*f`g5H@8dzF5K0aSl;%Tq!<#@7rX>R(qIa*-_~-7XBgFd`&)AnC*Z)Yy=No3> zC^USHNU8zTa;xPznk`T}<7wdYJ|}m&JL#?L_H8`kC!{H3NEt#25Kzfpq$=t9O>ThS zQRtcU-Z6(4LGl-cnJCTI#@j9Kh6Y1n249%?QduJ%9mYJ?A%?CxUHGIYvJ5zr8-XCv z0v;#)39~&H0pD7{TqCrY&p5a|84@O>Q9TAi2K#DMl2;s3tuP8LDX|SP@(8w`)C+w) zn;9$$*WOp-iCP&B7~DXHcj_4nOMW4VCVzn9`O#3t^O=o^5AdGrXWCtXaStjx(}H`9 z_`d|Ezy$R;{*a86(cq$>M$~>vH^UZqD@T8BT zA0r@zQ!Z98+=Qi0_X?8ak#TnmB#UmWjNV0uMv?>v;Ev(BnS@R7Dcl1gdaKff zQ;EXtr`a)HA%o?^xlr5vQ11rzrp3|qS9A}X7ExB=Nsq5HzC|kX=TPgRx(FrKc8hB! zRuv8&RA~jsB|O%0K+CzTJ+ZTcCE4iasm~U^Woq|!C?x2Iyg0%SrxHdvB7+rPR(_`v zJWf7LlIfELl(K7TpteD{zFlLh?jhL9{aI}5Qb7dE!eO9kc4l_{CiF-r7p`?M3_UoR zrGOLF=|I#}ZNq{;yAh#uc!c+g@*!9$3Lc~F6+HnG#9|DaT_aSVqHS`_BVy$;Ri>>~ z>I$8iQqH8$dgYf(^xn?>oXQ3)>t|An9mC0-&8KVu(DDZ`5&3xHI@KYIDe7<)rUm`7Sa=W=m>yH_fG6t(t~|&QmeOq)z*d)`?zohl``D7(OmrrIX!10}3|O zaui$vu&F@f$Egdi%xpdSE>8`|V6a5Gr(tYxq?+PkJZa0ZJq@cxj^v)3t@!B?j54&mAnUr;bJ2XPY?u`4 zgVz-@hC%g6k9s!m~QmAP8RxS6XGuoG0(PY;~0XP;w=w^2gH1?@+7Q=Y%(Y?8VRUS5 z0FMK!oun|-Y0!p}^*cg`IQZ)CCACN{+yV?qi-+%!79Ikd^dJc>}BzF+SR z-3_`<;jCnF3Ei|aPkS_O!9StDfsw5_0tHX${qzdlv#y!CZwcg5!}2kdvTaySK`2t4 zU>6Ihn)6=YIDF=kJx&oi;!OpaGs*&g9eglelUvnBDqw0CJr4$rU?{R9?p=ryhU^=6 zFlCQUVAZp3nq_ePJ6r>eAe|aD2v0x)-M3@|Sy*3he5UOb7mrnK3A8_)^`~m(2TnUr zvzfGa7jey45$T&GayIzuaSym?b@Qz|9L#(xkP@0GUTN-XV?r!4uk>)NEPkyN|1bw} zenMB1p-%*7g|kd~nIwInxb6Ii_TCJOem@`a3^KzYrvHk7OEElU63*3`q0hS4g||GF}=?jL|qqrBm&S@Cf$4n{P>_Yv~!c zUwE&+;T6i#{6<)a-Pa+0!)hkXf)|>%jZDRCBavB~>|KwMWp)3CVJ6*GQ%(vNZ7GWiA^SqZcHmSJ3+_NImi>Ps6!lPv&%*eCB@b zzRy2k!A?F8O!&r~xLOdH1U}MLjnt!V)&pf@wi8AO99#B)9|K)D2MIFZ#QD5dtMOQU z{9iF$znc+xI}xo}$H|khf)kMsR#8ewyI^&cgYA@XK?J@zeLEY48LhFmiuz8J(TKb6 zj9>5g-b@0^e{_{6n`%>Gr=Xh%%XrLD`$OzRihSpECH`4(?^x&Z33%K2wHklTmfd6^ z{oXMGafLHy@m{6z_g403?s)$u_3fvZ9>QRQfp^YZa@AUk?H{*CyD_GfiXSUCKi@Jf zbgcnDQF30+&U@Pqi~MVox*j6xPiyaLC}|DKsWvDlr(RCKCkU$XgFPJ*fjWrD;t(q= zsIW9)PZ@j?c$B!6F@PAE!JfJVaUf7fK%CF1SRq4Dv7Co-J{4bQ(x#F&xwQBp@yO(d zlX-}wpy#`8MbArllFBx|n_9tN`r~k%`(e9&zkh{}87NCi1`Ic&m^9?+q7pAGi6fXz zwh~D?en!i7dJlqu+R+Y2Q}DcX5h%_A)nTY2C5(SGK}J^2mjGb%&vFoJo*XCBvOxPW z)!G!NB{5COp?8PvGcoge@cW|;C_p*18y-x%pZ+R{jo{4aTk~7QpH7BG>z$-z51J`T zC|m|Wc9}iC=S_Rgn`U?;DIu1{jg{M^npQJ<6bFzj)!N|gP%!y@g_l!`{_obt{`vpKV*PI+LEYhhkgWfU$SPp{MP&W6 zc}rh1E@ldjWv-{QLh%sP+}I_3rZ1=9go@E4O&}vrqe@A;>fQW&d6}&K&do7Z(Y+ zO6%Q7_EW`*?SAgxQA`O!=hDs}CMIIM=2!)Q`3r-lq3wRJ6?cAS;}T5W!R^9Dp(fqE z!1az&a!Fmr{{))W+QkOnW2SIZv z-0)Ixa~LUMmC9LDf+n0gPb*NEap0bv5Njj3og`4<*nIwfINOy>}QbNG~Ii4Xyti{Ql=Q zHgHWPo^OVoW|$DNwUESvd#|?kDLb@riu&%k!7|5^SqN{trp}ar2g!??YW2z1k~r$| z*V7uJ=m}E#!v(hQBgRHRHnK04&7~RiJZu2K!%xi1I`1IXanqS~l=5OPZpBk2_4*|H zo?1)udznK}3Nw*XSs{sJG3ux8!~OPOf82J_$TNR!cmEiMd3zU!gCxOxRF+NO^}$gP zDce}y8{v2I^^F;gIQ=ft&aub6ouj_%nG|n&c2W=$@GvM)=?bpS{6&&{Sb3JB8IvYTU9TV+ zv@2$OR5Gm!f4R%QqaSelXdzf!LPW^{Bw>Q4Xm-dyv9?eV`%KjG5U17u5Tt`H->}me z%;%nNV!074-w@Vw0FdNJPkrq?bsD?DdLe`EA>1PiV&deH81gsELW=gu^Vv#ET$VV z5z&!Qqv7rB!&6_Y3m*`dF^!;o0Gf0Go3OA$_Qk91&U58&MTm){FsKt-_mZD{qJaI? zfV@c-XEV|SuXEJIX`>!C|$BH4amK=wWGlEP~)ynuMl+A-A8X%gT(Zd^G@1Y(l#9G)5 z5~0W7!7-KDDO_|v2?8aZPRYAB-u`w)cQI# z9>8V2YL7E9;%KI5hiy=!MG&M%7=#LM{@8QfAti+^9FCI^*A8@&HJ1QaQB3}mTWSI8 zFmcP%x67Kp#eRS;*Ji*@mnkuxp5f^hB1ug7WMOnHeN$xKl;L_|9LEtG9YAjp3!R76 zMqM%7HvrSl)sdaUtmmT-c@!K*G1RN4VO?U)m_DMW0k zO8`5XiHl4byiibjG2lAlRY-pT5;Cb3q61zDfd{UaO2Zhe3kiP@rudK<ja$NF&eS(1MA3>88+{!}_uun6*1A&csg$(qOb{oLYK<&NLG`(?2c7 z`KXL4FG?@__*npt#HGn4ZZF_yZy7Xwt8lCo=ratTpb5Vkg~I-Wt{?}EX$;{aIb`1b zn`vcS*8nJEP^XQKzb_q&G&Dg*zA%S0l(Z#w>GO61T>RaM6Sv#VL)llKCDlpptc;=b zT{ZYwaxnQ$*%U9VHByz7XG1G8h3y;dB8y~^HsleVy&=#%^x8V8Sdu%Ptfu_>bM|cc zBK?^&u6E8_s^nGp1AGpg7{LtbAM+w^)qCJytGV(Cxs~({TcZada9vT2(guFoIk4+y z#PDY^xCDVETnG~~lwFn=YdB9CMuS*CCd_dOwbF*~KaEXUe<_(|;}&+OXfjx}4q!oJ z735MKCY1xq1t_0+m9Q{|VB4Pc-4%ATanpJ)=#o=#@}4H%@Z+9HC`_}8PbZW5`2-*Y zVJc5HVd?`W|00&wct9q9w-}S7$N0&Q?R=7)2xU*c#0sD=NZkm0Td|C-BdKH*Xq2L< zslkkYT?DCH`)YYRAX2=xMZW#S7!f9wF0T(wDxC*`dwiuXg94!i<@MI(5cFG#t<0ih<3Af+majqKclQtOmQMrzBFM9P&<* z&sz3ph0N)MM_)uVYEb-C#-2tFraYQ@){8|LWrU$H=DF{*#V2#Pogu&R_FlSmr0~Cm zfZ73~0{X2~7Xy1i8)|jHFasEtcequvp*`6kFA*!8{Fy9bAbxBawk>dG^t3OgOX-$z zds3pqpthQhE>O;^bQiZsNvRUM*{2_;shE|?8x5^tuEYk7h{F0IHwBSpM9RBTQu%+s ztIe3DZX=8G94Bu2-okd$P2&sox0I2!TnPy*?!ypTT3U8MNN0QOlQWF&Jv7II?NOXYVk z1_yQQBgp+VhG2TC9d|03ueW&J;%1RyPo-ZiYs?8M;w7A8!N3Z|;qhZlu~%Bfy^x_clBY~D zK4JP%OXrqEeAkhNxHG^aiT4NpS<)~xss2U|>7bm(n8T;mv^ibdxf|HM;bkB8K+< zX4lH)OF6Ec@3p}HR%tLJpsE}y^C$8qM_+i1i&hSAy4LA+!Wgfs*rmzue;PW#is)iQ z)XW`28EJ6DfB*)6_QxQe_=~;`B2u=AcPT^=qNTAqX7nW1>v5)sFpTnsX~qIb;ayyx zTfD+y6NK__@yHN>G7|FWc5brR`}2IOg5?ffN6BIwYuk+MrJPPv>ubu5E4s`A_{~Mt z9P{CNPHjkbB?_g?4}2AF~d=U%Md05|{QZSQ+ho!gnO!J4|*jPSqu+>jz{jW5Aw0 zpRF~Wih6xFv?JZvYlFo%^@NBuhwB>a^|y7%5JF=NKNKCgqGa`j;$QSnY(q1{R_v{mxyN27=n#5+Q~@kAHF1-&~K%l3nry zxd&{w^v5mD2*UzQ3*Xa0=wiLlG5Q9rs@x$edpm#=Y2&iedxArg3KwH_ ze0ItY*wOU!<)BP`@P>f0Il&{w;9Tsm<4Z0+ygAnDem~!aV6MHt8m96U)|)SKO`ErF zwtqtxb?xv@NA}D`$L{U1Z@qU+d+R(wn4)j8H8`?^=N7irT_4TWGFDUUIg;q%M!C=A zTY`LfLK(3VQ1XBfHezf)1dE>_`V%hgzKg~k-G#}khV$ycVy?YC%|Js!Aem2xuH1}a z?EqJ5x&e**-k&h^6K+4=C$t9X31!i1nUdYM@kG%0?ex8{2Tqo6ZtNp7 z61&-1=3{p0@li2mexq&`BYu*rdT7&c`9COhE(nSc&5!^N-iw=)6qz|@Jq0)rD~Rnd*A;4wH(h&tJpUp?wD<2L3;{% z_>>?nhS#DXQKPI}Fs_B_$|?1!?YCQD1)Is$?CN%dx!qoea9*c2!r_e&Qc>uaVtNk} zrM10ae4hYpz_U zT$#NMve4HO1k`b5`Bq{hCKe&S=_LTd^cJ6Se^@%W6TRON-Hju+!~+OW8z1nj&}cmaQ_<1@5gOiS zHYzQ^BZ=8=av%`Y36fibtU{r@Q~3R#f(Q@M$`fMIi2al%F{$ORbN{(rBnv?yevHkx z?Ui3-ShXwNkJ4wQgpYHY?+lkR#VlM%n8V!G7^8`@;~c-5AIvys7I411>_qI|f*tIR zl!*x!PolM3Xt8nCNmzp8e%qj?Y+(vsNs4d~A+`voawlFh!mROnf3 zUg=w~v`}mj&xQ{nH-Ur{X~_Jj5P2oE3Sq^Goi zF6NIag+Y+1({T6hf1k3=n`g2E8XmAeNJ7xsJs^wgwHNboHo+n+1+RGMiWS!RWsUrV zma1eLg8<0Oe5q`K`}T*%@3TfnWyYgWWQtw5Vpj};ihaI;?bvY5F1-w2ly@&m#S)$i zL&JP#?tlkBtPK__cD*ycQD5v_esUxrvqwarqGJ1mN|!TL6+71l!yDa)Bpg#fvseo` z5R{()`_TCW^1JPc&sug1Ia;tC-GZ-zU#Qfsq$N6{pF<$EB%nflU)E^)T($W1$vUg@ z7@BWRr##RXWMJFGy&0|2M z4rlzKSBE))KgNqtB6`VkPW98qY(N?XupWwu?e(6sS-;)n46}tV{#y{TuU|jrx9c*5 z=DYTF9y^e`&32W)kJ&Aid# z*+;I{eKEuEyvi2-Hg015$6g~agf%^JyM`{wQc)LAcrl!J$$$1}0PS(*VgQ$x3w?aH z?X8u2dqH=c$0x7sPW0!rCgj>o9iP6K1b>A}J<-=lgOm~b!ky@0tR`e7eS~TLTlv~U zW(vZcrp!=Prod&DU+F3Gi0tCG7u|_KdE`u97BQtP;j-4haLuW zLYkyzmbtW$AQc7Wi-r~i9p0(Yd6O>xRw>d+ypi$~1BwE1cW!D&C2eG6{3bE93^z1BUY zoJh#vh*1pl{RiE)ZVJ~*hs)aK1iwkK)K(K{`!pOA0MN8CRUGfmyIcxq zs^%%~y-QtQbAfYtsbCV~`Mrk?Ee9A)6gKRn|g$KB*Mrf=&;!(?jIBmHKF^7XuPbZ9EAxH!(!0>%Ll{a&F$*m z%I+GzED^&=kVK~%5QW#*C397Z#8Vfn&!P7qIa<1zOv&8UK;6|ujfutOWT|8=&%i7< zf*3Z}zK<8KoP>YjT>WB@VNaM+jb^V?zsan19gzf2c{u7~Uf+=gvJ{V#%pJG9J~M&B zR@c);#*_6xpJ=5{w!eOUZkQl(F)o`@ujn3U!M2vPao`022+93s97MWfRC8|EGrauK zs)oEWo`e(EvofPuw1>qpuvFjDwKyflvaSC4_vrT0Gwg@mVGUTckm3?EZdoN`ls)wTMe$!BH=~MoGD&xP#dtnsQ-yck$Xq6o#=p~`hPhrQ0H`!J#!-Y|b z@d_Z@Ms8`bu7H@nIQ;mCv*!`HqwZJT*)#y=_C5PmpQ81Y|DiR&S2y*;8>z%e$56L+ zsRy|n;Z99Cv(Ep9B*lDuBN9GU<1poHEt6BS%4!wJ9I`3Yei`}YK0XOH$*}1-2T}{w zgyZHijym)j%ZbCt&g(%dd5;iBQTxMwfy`htVZh57=e^2?e<#T^D>ASDd)K3>p!j9V znbgH~54{aQcpz{a>iB2H^W$exlzcpB<@=tpkfYc4Div>2CGu+t#?WN~4knbpmGqHV zbT_g97X}9!GK}}Jx0lN1W@DVivvqi6u^W3jXS=~RQ3!<}q_qZeKYRTGW z^C=d&wL9^{!*b}a@*5X}4B`Y!CI?_7__@SAEL9fld@;=5>$E|Fjw|2aB4+HNvLa8( z75WjL*aYRB5*iHu*f+r%bs{zVh>ewMytGIIE=1oAEt7trZ*Wnk*X*Ig>`{FD#g_QO zD;!HbaTRXuGlH~=q7(itI?q^Zbna*v`f_L)L6!m>`4xNeCvB0~8lT+HF%@N)xVl2|e?UWHry3{rkNZUc z$ci77)oz!T$Q76Qz5_S$ydvbM5A)m6o9=M5E(d1d*>|ncahy6_aQ*N|%lZU8fUU2g zk^+4N6&kb$@7~=9Tn1q*l`-Y%m0!5a&efJ=w5aQcBW5KDJu^GJ0)cVTmbi~XfFIb$gdi?k;V~OEfYgmG}Uro#r}q*2uj^d9HN*Uzqb}P&toRl-zLq4qe)Ac zNFi&i>YBF6>7T>>M{UUDb^YO-g~_J@CewA)Aoz~=H?!MWNlZSg#M3@2FxN$YWYdGl zbQKoc#6GRP)86u=ME3gH41Ci%m4G~czh?t3xQ_y~HBooDouDl2@E_Iazwl9j4Vm)2 zAN3gt>1o*k2G^S&B@uXhwC!K$W2dwl>HK)pf;$O`rb5d&edaeoHt7jkG?peQMCJjZ zipCAkq=!uc4Wkm~=2m5=Ku~GeA7Ne*S!FHn9PZ()-#@}XQJg9gqO}V$6)4ZpaqM*o zR(~=~+lClM{n2QtgV0Yj4DQF?fL zvl?CS*MKl}5N07c>h5rHHOjs`a#my6fL#f~S*xR~$JLvJ8(tiDHzJ$1r=t+b31XDg z`qD`qvE<^gDGomHrvP=hSbZ3zWe#zB#zc`1Ohe>*cqo-acxk7UbP-aHz7;%Wl=z_l zTml$U@@Y*Li=UU{B0%-jrgM3W9v}m`5Ji=*Auh&dF(JwA@*7QWqt-mi(a5oL=p~rC zH$T#E)UlaGLdsVokw0|V5`=2&b+?H_%Q>Mm;-FOIv~UJ6{4`ALL06bypyADUyFeIe zrkc31i4JCXv|sFvb9tj#GQFOTrjWvRVkaLmh>i)G4%N|7^fU#j>yReE9`IqOZeAb7JE%!phbZ<|JoN`EGvFZgKj)3vLv(-^e~di-b= z>(p7wxdsO?XieE_!y2*DXuG~HsmZJ90Z?zno5d;&PUhwJnQeJUls67Z93w6n^Ip$!KoBQVMI{ z6Xk$2m2w*T;<~1P5#K763&;S9X47^<$k8% z$R(Fp4K~M!)Irh%lsl9s16diW1VL+o+If{%Ak?vVGE+@vOx{2PbK*S?6nj5Rn-np;caw|HWW2@WG}Z{C#1i_m|j2gh>snS5nO#ZgMz z6p(ymV8>UY%?GZ|druwZShQ7$c%m^wzQONyQ8q-zeURjCws>NFU^P&Dz7-i&$xH%F ziX;2@&i_3%PHfXwt5j_3EUYBb6zV#=XWC4NDnuTV(h{$&Nm_&#b8r@^ZNld=@Ln(N zqBY#N2Cw$J8py3!2(%|QO~?rT_0#}go1bLsLvb))x6Ta8J>fO*O=YB%9GlI>>NTCO zlU7T6I`otxq)%c#ZrYG%5}7^ABjfMZW>w-eF!6 z2@v===w6~HN)az^>F>Y6z5ck^f2-xVCkA8ROd@#id$jXkIue;c9uV1NS0=`$mdHgA z^mdC(i)*@JRa34c`2VLP!CX%=uHiqs*3Nm=z3wbp4jQdSW!)rnLjQaL>CId

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

    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 zcmZuabzl|8(_fNjdG5Ij2?PzUMT-P?5(*TDAcf*ythg5oy12X36t;LMUWyk=(NLr~ zp{0Usis zcgDP&;{V$Zq{WIx>X@w6?6P$-e;12E>pZJWiLA2GqC_6iUUU(f%_9+x)X&?_ zkQy*e8m)75YW6Sd7$sAJIoSR(iX(M(kNG%SpTXvsS#5e93`v(-ska&-Kl_XaVb6{< zuw`X|+uVNb5kB&bU4uumw`CPuYQceVB&MdE2CrLAaixwOS`bIi+CDrc_3TJfWM~wv zTk88sld#7@P+Cw{{8aI$9+|!XN75)o*NL;Hp~O0<(wqSH5=PBfU}QzgE56hz^QxhB zH04q=7PLe0G-IXqS(+6;HAkjyUAa0F6Skv*;!YjAwgNI3bu%JHg9TInS-(ENl)erq zpPKfw8^uX#0-nye*gDhatc;7c)Iq7avKRsZFl8w9HC+bXH4qA>)G*hS~B=< zUnRwons&2ntQ>I04`EqTv%LKlBOCr!vbid*MB%;n0<0sBr9A^ zG4n=K!e}}O7ZAq5i%tuhi~b8?p3Mx~C}q?5vSqWw%o)LlCaWEc7xSW?_>Th3%6pw7_EkbMOI+!xFKhn1BNKd}-M9DA`ks zEDpd;6k78^s)U+K7CvcD*qcm~LStuPn-7MiO9?>y{>WI1UDoz=n33l{5;hj422W(= zXHSIn!f!3`IdqzhL=CsuVp!3eVUaxMT-aQ+tq2nh$N*^Jx6g-tO|uTjMR%6%N|>2X zzZ}*XX@qSBBfzvIHL$yzZ@3=TDN|1lJzrrbEz|Hix5Ex%Hqruv7kC`D5k(ZX`TJ?u za-mhde&jbPjyyqPP!v6PF$H~CbXLp+;5d_9gP91q_n{xmAQ zYi79xaJU*?40~$I@G~*tsgmiec2{DU=(8?c_-!N<(g@)8?BO&SwKax6$Qk|`r<^tq zxuIZq8cM6>NA@~NiRED>!hb`caO}m3;V$kirwbnfrj!rQjYbCzvhm9m!=Gk~8@B(m z@JRlwYIuI^q{$$F41gA1r$+b&#E59nx@#Eo+(wFt=dT^!AJe(;C}3N;WDvt($1%Y6 zG&IJrvkfDR-1cR7UgV|&S<%Ldg(r6nZ~HNZ-{~HHAY`xXY=2|L!7ugr5s)gfemtr{@{ zF)$soa{!LUZ!Pai>n&~#nX7iqh~5~OB&&&Kv{sz_Nu7v8I9oMYIq0_od5C2czRhfL z8(1+9HHw%dF&r|4)g!H|JCKj)6fqUG4#_#QEl}3#67eVU)V1cx-6Gy0P()pFA8^j3 z9uY%7?#TqENUsPxawoZr959QpyABlH*|K(ufz@jV&M4O}VgvSRxXXk_(O7DIqItdn z5o08pgAI3MPd)hf^g-k?4(YojtxFVw>{)vyhPNLPQ5TtjF6U6rkZIPA(G8#h`R;KM zrLmI;D){#B91|n9A$u|W<7p9oW||gp6vJ3czyRxoeiYo{+sCKPjM#zPgmZ7Q2nXvu zC*lwiYMEJs@#MJ?ZBfC>H=QvYfV7;7oDbi2-gkaPLx-d!Zbp88O~id1SF7}S#)b$t z&PGVRSy}ncP*fT=`8H{iXz-r0!3xQ>gZ?e67>3z=-eFJFzo@|lC69Z)in zK2LXri4k=t;vv!t69CY}Y}hw}~<2!$E{1U3!8dyR#W+OCqADP=dkEN9HvAfeshi3E-04h7E3M zXAyiFko}luu<;S44409y&Vzm40VdJRa)zN&0uD2HG)fH3BK&AILrEkOZUJ^)UZ|Gg zwH#QhFnFyxhE7PM$-z%IFeoUO*f_$snLCmUe;^}GYnI*whR;xtxG}IRB1{}R zGa39i?JKaNBov+?w2_}3qI&|;buQ)_W^l0_UmK3d-Uqe0r1j>2=qX3wVCq#kn4qaY z*6?0-7YR@>-#SF`uyNxI_XUDOKVwMOJZ#wn!zD@L9tLp*Bu=(_vLV1u4TW;`(nP~f zGh7gWqC(6GGLSN9HRr-%ucv$cgg} zM)rO=9y+y#UAqw_Gfy{;)IuYJO>1v`ow zSnJ5Mo-_9?Z5XT+637z9LIv>67)9mpP8(_=4J<5~(f7wdbu#g+ zAqLT5w<1Gml>woJKR##hBU%%SEf@z)8cF8|0tn`^P@T$bJFocn}QsZcY;VpQ4w36M1EJTVkP8HD*X4Bwt%*pGER z#CR+R;2ts})D8?d`uPZ}F%5yR0gmO#c4HAdafGB7%eO@vsX$FzYma5{osGSp1nGNn zjPWmwDXk|1_C9thr_s*SvKxOzo`OchaKO~Ta$f9pHGNq1B1T*#siT7(pA0#4K@p=9 zR}EON1#^MP#b1>*#-ZOtaU=NDDsRN~Fl?hoXy#-srYd$ey`s^=7nIi(PuK?WDo8Xm z2lNz_llnpbe{S4^)&_aI31Zo;*&jDQcI(W$FwtM!D!a%M3%DJ=#Vr$I~y%XBT|0|v$?x*^#7z`2WBW9 zKCquL>;ESFX^_!@vfax5!C>xTMhfqb1{*Ze_!<=#sX-HigHn6(pate+K0axNaWMK? zm=!Ex=S5~4w|)#{05q`HoaoAnV zD8X&(JP5=lCyaEW7h(h$6I18IIF{4KR#In?u|!l%zXn!Xe8%`3hY7h*V2=H4?2Jau zI0=1pzFRiZoq{( zG&KZz(-NpXYZy%5W3YaNj#>)nM62mGn(#yBytB)+4+&}J+nL~-zEtt^9s!dT2}Q;e znrUdhNj1^VLl{#8h!kiUgh7^A)1m)K$n48ut6eCEDIcOk!7BJp&SOf<9NPlu%5S3m znpoXP3^QL-*yPTf`GpuGYMQM4NhOn6G71HvhG5TDfMS)ZntUjL9^V|$g(Z-~d_9Em zC8n5Z6@rdnuaJxMVQ%?l=* ziXh9783AMCv)Y?RV)CGjZs&k0fT=a)$ZTt%4B6V%M7c)KObjq4zOlRM2{O{s6H8tV zK{a9x9N3-iX`;9l)sQe=$+d6B3bhcx!s{Vo28=aLM;^LI*!cC3aT-iC;awC9iTQ9n zi1~Dq=?;piE6v|eG0~kGrDNWEx{0>4A^*JFpg7p*S*Bew`3XM*%*1=nHf_e>(C0I+ zHQ%%bfx78=mL;Z@C_reDc(lxP3+)t=ch4q}*SXTP>_75eU2WR_A0E5bnOq1Iq4v{e zNCJk9COS0;nFufz-e8MqBnDV$nbt6D+7{UN2EQ|vmS_%IzC<-bGf(gsvEMWlF`-l- zcx>AWGp6bxlM$U3GNEl7q{GoCOtmpLk-=HpZIHR0=S^48r6EHA#>%r@GN~UMQ=_r+ zURQL*^{K))UNe{p*9*%c~M(;lX99ZtnhcR6`TCr)EhCv34&YE ze@yTG(>-Yi%(1R-O;r#h?5%ZYfbsG_!_DOpGvhf_JDO6wqs3eW4I=_daKCCdH$|Gd+(vD|^QwdkoHL zu7TE&g>NBq9&U^`4@G90fP7gY^9f`m)@dNm!s_n=^1UU@MUh-AKhQHq!?<|q(&n9r z5jjK9xGS0cyuznuMl>i)77mz;2n-DYKqIs70h5)fYNj$!E^~FvIhk`0On~odnD-)~ zrT|Z=WA5}n8S&B$%qI~8n|CPUK~`SzGxIS7isD2lP;MU#+30g~jSqrHQyMTB?*s8q1Kywu|3!Ik~lguG)#Pd^w&2)VV0UytnO$6_~ z`ay|e2fj8xkR3sAM6^5vQ|kUOb5%JEhfUfF91)r|dCWL-b3_fEXr6^l_Y^%2>duE= zQ>L32qj?I=G)K#Yn*)jpTd{~`>@wRlap1kcVslU2Ll(>mXR|tn6+RAgw!?aJGz!tS zk(4x>hVk>Oo6J)&wP?yp<)$20RJMJK`Jq&<*hV0EcpTF1uUpMOVQ-juP*xf&Hhylq zIUFks(KC6!+0LxH%ts|Pgnc~AIHBa_Id_}AIO`!BNouz2uo(_K_nRYeVuttvCN^5| z;II}_#Vl3>P|w8%p9Hr(ylq~E+X*Nt;@Pez<|A@kp-$1CARLZ8HPe$40!Hx~&&^cG z3a>)XAph}Cb6qqe6ff~S;k~&p28H&`;M>oihgtUj2l&)rdHx?@R*U7$e}K(xmiPYw zGN+}H1d7@Y^s}=YVHO|Tcm}GGk{(MmnjKbZA%>5+&cezt%WG+l)gojgfq`?RT$Z=w z(_PZe9tJ=MOV?TU~!``A+-Bvh{Ev=Eq5~O2XaY5zOIqw@&Cr0Z(^zSKL_K@npy6BOv6D8 zx|k0QuF1wPx3bWMxd>u?aQ68nxNaWX*7A$A4lGx~WI{9>d%DPG;!Bb(k+_W)2G;Dr zoWH=jcdxs}gHniML^mtX*VFPG?En@n%#w#&EUa-~%Skzmm=AhyiOqHyEvmC>6 zLS!fRWmvtw9B%P`T+2(Te`6MDhVsEW=R%!RWv$i&>y~ z!4%6CB>Vv5kOB25`-?E#EAehe_Ff}n}zzQGFw4S`o zdP_G<7ol;Lf_5jrz11?vCk+F&jO@;w*I=u&`jCZQ9f%MVLjuOc8mzZCdF|ttQF6%; z6A%pQWT&q|tsXdS!RtNkDPlY;dL8n_h_jaWc&Y`rDe)}*IxL^5>6TbjN{j%&EIfF} zavPT-VcTr~THuw{LrVruA?^M$4}kE_H{bs z%Ht7{Z;4x($RhmT$jIAhYLPoLA|owuOc)u-l5RoR=JG_IMcG6k3P!z^NEa{Zi;N`2 zwR1KN!vQmj>OKN8(Y<(VY^j zst%qoKXN>VgBU1j8-&Bi2avRiMyVEdCfpjyqn1ZLL_>o;@^PSkFWt{U?Dwdfm-d&8WMk;^*=rwqh}M=XM6pTP3J_j%-L98a30pw-Tv8LeET{ZAp{yEv@0hY)4}Oi;6(lb7&YZy+}@g8}2@ zb)u}xLR-mLmR8W}<*{+rmpE%gmKvGQYGDAhvN|^)l#+8;zmw@f6x%{_(Pe4|WR&(f zt#kt@>Dlnez0*M$tKOH!x+F+e!HM`iJY1rA&wNc-a-u;{0?)LMpoIP zKa||uRmxft{Zgx}^{QmS<11PJMZdxoBpC69Qj(9TYTb`%L(G#9rp`&Y2 zzgk(_mvH)*JjdD|=Z0AJp)M8}FFX4ZiX!6z>snm)KR{dgtu@wFNT|&hwr!*JN~U#P zmlfK!Er39| zkZ9Wn4a0`Kf%B^M+^TO3p?2ZGD4>2M3{SdX-HSXRLBuoo4zPDd)xI5HR+|Kdq7V>q?2F&5cndC!m2}tYXG1lLwYRMkGf$i8 zw_(Oyeh0L?7#V;)yv)(RX9xg-AXT4bo+Bazr+ZE+t&CwPgN(s`P5oi z^5LEgYg1&Y&1OJb_`>JbcU1do3wJ_(o147~gWP&4+%^W8iQsids7AIg9MWp@a5b85 zG})SA7Le%#(N133WxFXiIgEBbRtD4_-YUNhcZUMQ-Gyz1(Wv4aNyNt92-VAnmax%T zxjspFo3gfND8FzNe7o2bgKFoqKDE)gq{vf%aq^axY%?*@KCflNDj>KeZ5a6? z%cW<=+SoKRgw)G+wilUa2aM<8`8wMkprpY*whCx<@ghm^SQe=U*a?do!?yLe-NiBs zmQR+RVuRhXhE0eBpJWWM`EYd=L76td7Ub0?*bd9^77BmzjV&H+4ww9}+@AmercAe$ z$ZXkVZV)vi#YUIrBBcvpw^=rNAS!0J24n!Vao7#Cm31nI;Jb!O6#LHhyA)Wi-zgAY zBkii6wccUFv>-$kd=eaB_ue~gsc0eLOTsvL`#rW9nZpG{53(f=)y#_?w9zvI5l9+_ zr~hE1pLm3Ts}9>}T7`gJkNyu}(c>QgIq+PAHVRShJ!zw}h7fSXDH~oib10=_Q5mpA zA>R6eZ7!;yg&WWMs|{}ncV4$$mh(x3+Ziv+w!I$J$7Al7M%g(=HV{;T~w2T%Fca$`(ZQ~=$@BV45%TzU5Wz1cSE(i`0Hr<35+&&A%vNuY}n`R7wDJ^6O>oxUw?g1_1iG zyMn!&-1NbXm7NY=p;?o^s$<`b1B>rJ>f5*Bx0X~uOglfFWT#?7IQ?uNJ9x2;-69m= z7n<6Spd4~qjk3Gg+h~Z1>uv1E@%gt_hHxPK4b!w(U*X%xQYM0e4~N)u$YD7YIa|?v zBGv1i*uoe{E1uEzL>x_|dJWBiM?v}ej;AfQ|Ah*O3ORk5eK}c4`<>acdv?!9Plh;T zl%_}{0x#nSdw|#9V7H^NMUU9a^10vIf6p{qSVkNy4ZFX$uR}`FY3Uw29l?q3rw8m* z@riHyAv?Yy;qcuGRZcmkQ;7{0$Ot9IN&7*JB9Yz&@ah?R|4iCxLU{P(^Y*`RQ!e+A z0AxwIVE!GtXD^W1mRffW<76Xq!rGbe$o`WIb8)y8!amLkq15rQeZxlr{=u#EiR zx{Tb8i_&t%$~tnfgaT?-Zi{!&v=zf@z4`roj#ns)u$Tb43OXV)n-+i;o>0W`ISL2` zC9LcKWM@k`B3a@m4ii6B%+Zh>s##e_b3ivI%`~S7Za~;t0y#)X4^K3O7z||Ll`1&O zpj^Uff}Mt8fU)qc6&;rlEqtM)`Hln!{jv}e5y~N0UajhQ_OTptuvax4N&k^OttixK z!)xoZhsF^YTRle~3~kM+QeVJC^ZiMV{v^8g;8Vy37(Xjo49e7@pE>9zIi#7!l1(lK zF==SxScxi`%9a4thxv5>1$(c54T1<-}U6 z1^nD@4ij^gfT4eF>!8PLFel}7V96!aoV-eV$B#Iw;HcA`D4_;7RgL*?KuDk)8Dc0F#ri?c?|nX~fYh4Zs%UsdIZ?%uN|*2|KxDw5URE;rFt2t>g4|64ljxWFGUN<{G$C}En%g@%$}7} zBl(1pjzM@7DxSgv#=$C;hFMvBvZJ-!Pl~ORhTwad;~K^URFr~`gCAMsXo-u9R%&qQ z`3}#T;32W>#GaHCiuiD-I}cm!tp2?uUFA?qUtfVrTkbd*7B ziwBOP_n8Q%oz*|%z}iK;v(^xN#2E+OW{O`V2w>X_4lL`Kh;YFIddBf@uQ__4N_uw& zm;gIlK{c>W6<~Sj_rQ?{145jj5w++8oB4;1320q7ibKhP1?*-jfy?;RcI2 zj!kGEo0FT%On2 z6DOi(Mh<=OhX``%)@b;o!p;*Iv0{E{KsK$WYGV`2IDZJ)k>CoSTGknk@@XXp-})*1 zfLl&H_!WCm(GuBUS(4Mo8q{{W+3R0jR=%f#vmn|+M4gW2`71l|*B>9z^{5Ry%Y4aQm9V>*8^A4wukY+k$K!BWfNF{tsjmiEuX<2h z{`!^k6ey@3A={+P>a2t>ZCXIVwDF> z9P8NthD@IB{EmF2tv&*CM#Hq6sn5RWa44UJ-j5Ki5AH#u$UgIpu=E=h<&U6NO z+!ALx>au*dO8^5bB?&Td^%c%JXar#yA?D2_)yHDCJLRu+L~*FWdBV3&JaW^1OCU^Q zg&)C#*`Blo)6YnC-o;TMz2$-5&^z%L6-@iqdPZ^I9w%+!$mN1ZkfqcCdFtISEQ&Ic%>W^oqha(UR9CTdYW?=hH6 z%p?xiO!ymn4u2hiUJAfQTK4C?{&JQfS8Lf&Fae;8|Nf6N8FxFv$bj*&Da~MG_-$Y8S$!YM7E)T(glzghQpK5J<1GxxOLB z+OM^M5!}}2be$uYYL%h}WB_!q0+k^R9f@~s`Ittc3%3N8sRdkr{cm)+H(o1$RK!JZ z1=~G?6p^hZ?8=T7cZJD$BeF``2$!3^Z3P9Wn3UcME?V$KHX?L@!KAeE2MI2Gb@~Bu z7XGxFi++V9Je|@CPC;%S@|t-}ZPy~4r{L~*meyL0-Pzc62MYzUjEGU%v~&4*d<)lZ zbepiLj$zB%fWie@yCO0>Lql^QJdQMCgrv4=EbrOT<;c7m5+gU?)76!Vcf-Oty^}%t z-pf@pYw(NL$qx>3-NYe;|ACPHIt_IXu!1+e7CwKp>ygw#%wXsk%bd|}3qLW@H5|tl zBuO1zCN_B2yxeM6JX%DoUZVSywJzFKKd%gPw`WJy#r7sSExgSJ7u`^VFz*V3CL1@q{4&7i zu7dyqk^q0V%~d~>+P#mtV)%reuAmf!gG$XZi7(J454b9R4BL9hwOq0mJ6GuU1%|Sa zA^i);Ebf!8!&tCs0nFcBa?$06h_Y>+RYk^a#1+>gNiG62<)zEXvfYD#Dssbh1WiFC zDqFS`a#@92uJ6!%BIRo|9B2k%Wa>b+vdLc_K-*9al8W%FtoHTbs1k7@ zRGi)&HjQoV?$fe2hf&u{Z9nY8Ds>0(V*T!&D2cE!n9sm~g^&BA-T5VN;pa*{fbD=d zcQjf~><2|!2aJ#Zl*3IADa5*yHURh}_k=Y~EK?=&z|XT~Af!Hi=I#k6M{PPn zbWO_dE=g)?>lgKj=B6TUTIoWI7@@tqKneFNtj@#?5*T-7w~M#0;2s%@Dy^ol3bq`u z#c?c%gNn>n!4=7;R(EHWK&r50Z`QlI+s~iWcEe9mwbuz8NbsFL6MonEYCV1Y>}T$4 zxGaVYQnW9a3JemD!+vB7K>JyGA8-rU;tTBa0d+LDb#dRPaMKpC(6B)5fVe4!0TEO8cz1hPIrKtQ{D3r11}arHgR%5(<91Iz=9DR%ryw+d*R*glF>3O^_b#Q ze|9%U+lMMH0Qz~hU)=>U{6kgEsllp?kG<+HMgG#(Y++NtxLLu86W}4+w+2 z>>am$_@Pw*MCjsBS@%VyKA>^2lp(O}IUc){B$`7W%#JBhtHAiCSMKf-1$N8BCJu!R z-SnONcN9uC-&E){xjzfwy7`}6}H_0COqc;u@?JS5q7tihWe2QzD z2IM0Z&s-#@PC0q=7*A!C6KdlD*o?}l^Mku?c(nlHuB$q9^5&~DmEd; zqwrY;JO}aePs|Ab8koC*$IE9|@L&m|cSp>$${zZ?#D_HO$w-)HU)S)AMTtK|^MpDc zdIBsWBd(4oj^}9L8HLC90=TWCCmVB*25&t0+(W-h2r)X_(*q9)N5jl1)!H-eKjR2= zuXd1gBHDSTB3k3ifp0G~tUeBJ)6G*YQzxbk&TsYfe1$*}s{qW(=k)b_f~iMa-{y`3 z3Em9%&;s?xJtnI5-lH8|x{C7+Iug zTma)>WyZtl=i>1myigU1MWf@TgqmN7#$@C}bWwA=m=!=_CG3m?w#ltykJ zqIu=NJeL2Bnf}s4x$`5MeD6F5|2Iw12=4^Mh+F_Rkpi;9F0Y$AEZ(bfGH`g7v|JjG zgMLgd_Z+cvhMPiLiNL?=s{8hRcP96)QLloL%l|zbx$? zCpRb@)~V8XW&_P4EPXEQ3Wncwnt7M1UfN^o7=Ew1mrl%eAd8y=<{VPX>qbB57=E~p zckX|Hv+H~5oH^7pJ<;3mKRu^@=56y4(8&un@gDdHXy&<_d1oOIOqYj^oTnCGj+WjR zvY0Wp^5PF>`4_FdbeRKLTK43JlD%t?TKiYWkvbs%1@I`3{Hmcp%y>RDY!G_TCd_*DFlEY>yYuheNQU2fW=;TruyV zkIG^HTnLv2h>bif;jY)jwk(6&fPG1DvI^U_Ed0wKy?=xPAk@dh7oPGaWU@XHM{@r; z?_X$u=Qq6N#NL;~-uE#IAm@k0XJfG|phi8r95U9ZYhJus;y{yIN+lA%TkF_*x$2dB z-f2fg=NC6GjMa$uVf(k`B7vG^)}*e90HwfQEZkfEyY^lCVVZ}0UbqB%q7Ux4wl zifbSa{`C7i$XuML6pr@Ymn9`!v&68a`FxSAQWhVDidM60Fy1$dZz9r(qk93&ncbJ^ zr?p7^a4lTq&5ZZq4`{Ur;m{j@tt5{H#V|dK`b;c!9b~yYg?#vqRQ|m_!5q-^hlj*X zq5ytd%y$Fx+w2m)0zz_OxostUM)qbstoq@f_~u|2C~n|_5-@ykN#73`9OBYwWEar$ zzy>hL=5oGjh!N9S!|>=zzMFL2qdmhD-M4LoH$ZJRLj7E-w(k(ySiFuQw4E2O=kwvw zj5xOdOn`mW(sx4Ixc6LNF?Ott&&|iS^1(5t{3+%@Uoj5A^Y|^w3qe?9GZYAq+UbJ{ z%L~lH&8o`Zbo3oXO~uUwU{wCPlkba6j9I5G5ENUx_~`c+BL6_oDBh#Hug^#10aku1 zyq1aY>7$>rqzwj%mu^)RzPGn;2F7nl4%0R`B?ImjzOuh>mmHTT5A@Ny4j@;MNTjNS z(Y`FK+IH<^b(oKSekU&B1ZL}YP`KX+A3ewcPQ_T#2%m|!9POh#FT9#Q*$02AWSs8= za@Q=&=S}kEMcsv^>!!j{{gz2U?wR7Vp>$Ax{f3={a@$f>6N~!}cB6?id`85GdQr19 zpES#N8!3S&y>5kOaaMl^#O}R$y1g}aeB?qOEr%g9DLcVk>5Fx%lDh(I{QBBB#F__l@R`S_Oy2KW_1ufCm&Xn!Hw`hWjt`9JX& zvRUp;zMPUlyQ)EzZNBKUvytEV;BH`(FDt4%BePN*?ILP}5 z`w(|8KX%!-8E^7#wg;tJXYog}UVGrgVBH_S3v}q#%OB0!Wbs?rzCEDSmUq6Zv`7(# zZ;kNJpas2Wl*)lo0xpQl^Z94t-Xv)aaJse^?)lr7^7~Pm_wW6&?B-t8$QPCIpT!!i zcUAuz97ISvImz$g3u^iCPm6)ka*8yI!)p zo&VU#KM>!NX$tc;o%~BA`OdC>UnWKz7!{J_9LP7wZ77VJkCz$cpN?~0C^R_@6#8ql zpWZ3=oB;-~P4It(!b5MA?RS0>!@{*m9#GtTwk zIfVZ)0gy*dWE4tnb!gStZ8(JcZr<9HrJAOqc$b^$`8 zgeA~DWLx-MPh@}|2Z0&judmnxbS0$8#7><6wcB|D>yStYn%@^lmEZi9KS0l)1gcR~ zfc|bDd`I&&N`RIU5eE5BLOQJx9f(9l1yS#;0eWUb;cj62Pr?Cn-|T_GnOw&$c>?s8 zH3el#e1J|&v~RZMClGgFfxtO*gNU*(3J2by4M5yjR_PSHR-INnV8V1NI&Ci#cz`;J zxqJE)oFN`97idLy6PkyrRtZeZ6e;|EwZH^Pw6%}Ie@R%U~;N_M7w}WQw*jQYu!Cy;rluU@HT)|cpDHvJNy1D zR926_3^c~>Vp>3Vh8k+@7_hUjmggW4>j6tVmlQn2L-VZVD8Z7%eRLqD_JJ5&!u~otvF|5%7KV5`tw<4dmgU zZwug&0f+CW$Q2ZcV@cZr@P}$If|F|P4D8A5)3{v$4_RGHYz_7X=#~Yf$j+u-f*Du$ zK!DyC1G`-O+arOM$RwL9n2QfP9{5Rqi6hV>A@(7JXYQW^t1#z6PE?r~2GDT2elvi_ejMcc1^Ej3 zZ~O`iOzPdhmXClwKL37T#m5q`dQSsZ-s4e#{&?o*r{G*68(=n}p@a?M{s_?DW6{1@ zg{yD^`tn6!8uEmUDfBh4l&fI({r?1JN{pr&@9~N(#v!hMMH-FKj*7vZnLc?;M3C-L zg$dKI!z%mU7$m!b1M=~+mS9~O{2abhP);(rft9%d)zu?!a5{35k&Dg{7U4dLf|Dh1c$=-`t$KCyD} zqWtFI*PFPr>C+Fa1}F#HsRmtqWTRjTW^a+-U}~9J;vEQ!>dk^QUxb{6S_Pe~{~EuW z?%*V71Hj{SbkaX$C zx*>UPd=XqP2Ndf(Om{Qi*hvpDO9ahTf$N|!CjbL{!TKQn>O|K{_MW^kSQxFN%?5sbbFe8X zq^&GdQ-gtz)BV|(P)`AZ{yLCIhno)squJIckSIO7f;&-@YtMm&hT-q_2B{Q+Wvnn; zv_FWah_ep_zeNeU-ICpN@d-Z!o1@7@_d!1d?JVoD;8hVk{Oz&eN({4ACxdjEA>_~m zX1$+7*4~!^Rbs0%L3~Zgff0I^gBRb*G5Ntu!S=Xt$6pT?k-;fKs^9e>9Ze3pK^Ref zAHET!MYYYXU>>B=wsb@Og!N$0tsvF{{PX)kdV(a%gjP?2^rz88A@uU8ZWeHs%137e zk7Jc83j5Blf;sVfT0~S{oH{+Da`0;rQM3~mwW*_CR3x{Vqv&O)*u^m{1Dg1b zVALG>s#&Y&bMW5PqNqrOIV#9KyjiU%x@#4|13aJ87+SRi-)>$YF{%_^)roRwcyiQx zbTV-Egl3S+LHapJAJQ}9CFnW4TNLh;ILJ6YC@mK1l=2EXC69}uONxb)qVl0twT(yX zIZBWCSg4fy?vsC3*=!bsWpo*hv;Fx!alSv=}{%>IeHqMBu{5Pvxr<>!}A zN6|@&<}ePxW|#mpdbaBwl<94LjT(S5LLjLu<7yNxBQO_KHtbDQ3@dXj>ZGs*H(!rR zmKt)HlV8d3;CJsuT}B?F6xE34T#mN$@P|=ru{%^O1<+|Q`Kj!o?y>yvizxits~jSM z5;HU_@s)3)8c6p1uXj-`kxS!nB?m%>7?c%Q(TfzBB>;apqo^So{>2TqLVxy7)Wd-J zQF>Kq2cJ&v4l08rPX-evD~mG%;rFW2AX8wmFO1Pqyj)ggA*KWvGAnbNqFwBmG1|d> zxs^(ihbW_ZG$g7%f8zle>gcMf^i(tXm1Cglw%Sq12MC zrzMmG*(&~tQcY3}`9#5@eA6dNDG9sxiPBWIDwk9m%GTVHN|J0nEUA1hTh&S_&1GwO zDbP|Ja{gILsgKywN+a1?SX!wmTlY#UwPmYB8R9oVZ(S{;RF>Gdvc#`%S*5Xr{a9A1 zBU?&2!gejE)RnMZI?VPdjobcH!fvP5-10>FS$P_al_#O@lqYq|R-k^9D=78k5LYXJ zafOoED}qTytB2m&rMHZglo}G7SP2X+`pv4ORFtiYm6YnTl{JC-eVIT;+m%2{nk!SQ zNo5*sd1a-EqO6T zs8x#;npulXf2Wp`C`B$^Td5zZ303#}^L5o(kvd9%t*EVhBC%I$lN$N!5bf7>2=-GQ zinO@8WS}8+Nxn06N#>Y(MA5yT(q3{tufuZGCw;rtCwJ_uPqYyYsFl=!+_t0v>H9>- zmP@356B0?^bBV++Hi_olpd@nixg@e*-i8z;gZ0*r4QUMZGt#`{G4v?$i1wIZq7wo+P2+5@eW&txmmn!M1nHI0$hnz%UI5SQ+4XbK)~LsoOQB?&sTC4Rfw z(rAukvO(u$g6&BrF1~iu>efzaDP{Sw9m$fjJy~N=dy2`l_GFhV9fGy_KaS zS)+SL;&QMf(Z+m16urJ6E%$vvp7wWA+DKWx>O@-p(24rFJCn~_cBZJ?sJC8sR+1%c z+b@Y?^OxkU$S!2b&RxjPySh*`nYt21%=%!SXV~p&kd?{OxyD5ES zt6g`cpKM+3u5^{H8a>D}i+WIM|E&kDX_b1?7*l$Zt#0+C(F*kO649X?#iF3IAD(?COplNe|9R-O?=Hbifo9znj0 z8%f^pGm>D3^j2UL@$06y4vr#fA<>$Qp{bENhNg>a zEV;4ESfV{RmWGTPM*?*jM=Ix?Z$ZOS9}5`lpzynjGrfv1jQ$k zO{Y$zRPbyfEtO3sQ4H;vM3Y_phG2ugA=veAC~+5@Ot6&6G+|S6gK>gWl%i6|I#ZNx zvbAf9@`Y^Wm`VbToT_w?Fql2jENq&B``1F#sLSMOw6vX{Mv+)xI<>}5C+QzfCsqwp zD6YOsAuWS5D4vJUAXvH%t2I;UEX7EjN&T|SB475MMV>i6i=@gkn_6RMlbvtOChL}+ zL!OyChy43=4pG#bOZ-;MC9j4tY9%wJwUp%`BZ_SENZ$l}-L5w_fXiioB2NqX}F zrHka!e*sZkUO=|0xR6?_7LtDrizqsi7m*%&7Ljg&#T1jB_13P%q=#z>$p zs=Ac0%a@X849h4OdMqOePU)~x%gF|8Ioaj!etl>{5Ok}Q5^CD9gM zMUswPMO-egBL5ayO%hCBO?JM&nq;oAhODuC4SDt58nRW3wMr*x=fi82p0ZVH9qG1o z9m(>K-b!3glBTXFF0KtUM%N8A#<2|~X_k$o$B>QWg`YN(eEBz#kH&5ye(9Tt-=~`i zJ7+W5;L&E1AaM)Lh3#8t4EI*DeV?u5t)I7&EP1z)eB-v!Xt%bJES0vCO(91_vu)dz zV$vjcx6_K<=vy+=k#8vo3#1a$iK#S+pQVyO4Zb6Bzx|G2o*g7)-yKRX9AgKmT4^VV zws0r$3+FUOTTX`9!IkckHuv|GrDlIm{LH)bDYT1%`sOZ@zTs}7J-D0t72ZSr=I>Fu ziQUeD#%~jrva}Ph+sUz)mV^O&X_0%emnLkhePoRv_EAU`+)voq`zfto+fTZcIY5$b zJV48FT$=K^7}v5aA?tc}Yd?%TJB>E3m(qx$_Ccc9e~_#us*&P9P&Lx}2l9T}4`l4@ zhp6+=LzM4-*ISJaD~qK$UmRA(%hvEC%Ga{>?uar>wniK!*!!cTYL{b54~e~UOzAIM zpB*O&b{wa9u`c#drpu8^8QHfp8g~CyZa-}g@lt7?JG{wJb!(X#%S{swGRG7 z`sO%AnPIfv`b}?DIZfCVdMo@4!P=jp+;r>=&5zt?DSX&j3gy4glBD&{kyNYC5!P^? zX8h;p$?@NwCrJYrXtV(rh~j6xRpMuY&D2}Z^;XhF!fw@D&P!y!0hegHoWDd;75Ig+ zz=&T+maD&zO)Ffc*kG4QqbHZCU+rHByHanx)mu%kkT17hq0uZ?X@U*9O0?&%QYt8Q zjWnNojqLpT8hQHj>r_c^yiWaWH%OMwHz-T(zd@r#-K3m7@+Nuz)=jcdLOR9ihIHa* zy+vN=af@tlMsF4SjbO8Wqe*AFO|8MVDcT?2Rwl@3A8>~_U%W&57P(7vVeMU|uk06l zkGQ1VBdguNN2AsGohJ5y-%0wc_bIiEy-%>)_lctV0~&Yr1LF7g0a>!yL$c8Jhh#s; zBbskR9#Op9dPM!oJtn_xcuaa2p3n?v|AZts_=F_L`IICW^OPjG`jjLn^^7=Ae?~F+ z_!-4PQU;~S?=wi2Y|kko#_FvHdaJ=7$_Q!6bAKoUWvkww%4FHP`X}v9n!F&3pL{`{ zF8mi|y#;?!L>T_2IsMh&r1?D^*6bgG9oJiB{-s^k-hXLX%>RkPy>%&6jlc1t6TyVI!Rp_ku86#Y#EJ8vR><;^PYbXS>G zdH6Kfq7ISaFx;ZznZsWe70)5MMygn#pNu4S@RxM)%zTKI2D@Ta@x-K}4H>fqHZsr? z8!2AhuHp&NDm!sDI!LuP4z-b3(M!&__Ob`_IMo0<<50^=`Rq=$kvQs&+Lm`Cb35S? z?J%cWR)DI%I5I?neg=^2?{Seqztmd?^j6TV;$1;EH%WKMP5R{YkhY`r)=dvdoZuyi z=X+_43@=eM@L`0ojXr`!`pM00{bapuej3*jAggo^sCYxLGeDz71y!uvCIqS9y`YMx zTeYG{=5~ad(NZBnzf&j*<5X%*(Odtj6d~=SY1l*2G+2%-DxO`8%R;etGmDBR z8_i>g-;o$nC^nW99~w*H@Jp)iA{=v-mqJdDCo}yXPll+Qm$(79b<`EI_o!3XoJe3X-H>7bJ6DDM*r*Ekylh7a}e%3egz# z3RAz0g-Lo>5ek~#MTquf5$cz}DD|6Glr(x+lnh(H81>s!OvN*kKygY_!-^Bduf=Jm z6)i!uvq}*5SqYLf@e`6|+b7h|S5n2>z|JKJ_G3wsGB7 zfK5uPco?<2G-WnN8Jf*)$`F^GWk`=~Wog!LS_20~)61&4CHwEo5?N$974O$RD@XCS zw;Vay`6)%`$WJNYPJc?txoUY8kA}CGry-*&5Nu)vN)Zn$sCYq?R8hqvC|;3F=c`0& z4XQ*coUKH%luMwwm6||K$x@k&J+v|fA;_17{aINpA{7J`qFF)}6|cMoRUrv(R3XFW ztxB$#T$N0GxvGl$p`>amo>J|pM!MyyPB7TM;nnNU)rm{#8YJJ+8WeC5HOT?ZYm%fp zYf|vLYpHnO*|-+jU{@`&P+V<-jjK&#+^my~#5q?33gvNn>z>}KnW*9(^LV0)XWuoGXfmxyqH)6;lICq2l6?Cb zQfy@Vj9Q~Uqj7J2M*S)^A}$LXQEJI(ME0xGnC!B-F>!Gf>l?Fjb0-im5Z*#7Ow8t2=SZiPEgWRLAYiR`A{D%X*c{;ZC~C8Hyak@y9{HtDU% zP6X@JiTEAtM7B~plQq8XOcuJO!>WBrx~q@#+ z>_)OI>_)V&bXe2wB;U8)NlRM~S{&NJK5<+94Dh?}t!kXgri;**ui&;`y59%s{<${cFNj9!9OzdMk1`WwVLH)xk2C7)Q{$ zFl+?b{-)llJd$85^_FoI!8(s3eUIs__|b%&q_-Z8rhawDP-~;!vW+EMbs0+$@skeA zKaMmXGmh4%r{hTT#^cH7+sD%ykYxg`0TU(=?77}*IgwU_LleoD#V1j1yK)l2yx&l3 zl-|nthJ4<7GD(^?nc_M36oO6ETaTvD#;^TUsx5w*N;$FOG-|EZTlVP$>!-J_=&i~r zb0*2sbr#LHld~x9^US8!D7|$}Z$s32;><$wO!-9wTdTLciwQPtF;zVG7Snu7SVFUG&Jvo*kC%}B8ZM>Q&ZXpEbs6c~ zUvHgRM)KuduC^3g?N@u_)X!MuWY}siU#{X4oBM#38r57uvAb#o!6H_YXF9GV*de`@ zV->+hts>eRI;_HKf-P80GwR>flye%dp{xQ0b0sOkvo$mu6W7wL;A@FCu#PkzvW{Sv z*O7&atS4FEHvLn{@6>vdApZu+0#i0n6@GC8`7O^z;xcR_ZOVVzNULs+O*HO=P2{bN zO*E%lZ6-+%Zzg}lZ=rrETPP0RZXs;)R+>@Awi0cTZA39|8)4sXqbTXRo%ROTwo||A z->PkdS51?P{PQpKq=HuueoOmqdn(D?CzW!})l}kK%OCYjvdtMyMy}ux`X7a zypyC~wUahj|L&wXteKbEN?IX^Y_t9vD_S3Fy#C{s%r~Nc;^a1ME>j3pTc!2sj(+JxkjmF)WM)rG= zMzf;cK^0$jE;>ju-#7UNN({ro6VY(7f;-W(;XRXs+sOx9Z$j*-l<$H~qe^w#?0l>Z`5 zkn{~skSr@s5a$PatLTrkGaT?EVfX5-h?Asmy_1BUb&~vX_asSQ{wKnY(OW*zVMmFGMiRCGK~nefng;^(?R{%ESVmR=wU;L#Pn0WSJ8S!ndnYB@O< z(tf5)7`#ZW?iXpa0~d*l^Abf#n@hxH+a>B3@eBE~=`S<`HvK~U!Y`9QnqMaDmdg~o z)?bNB>tBiUR=pK=g=m{yQCo?e_`a~?OFTgLyb+wG-*XBBD^sU}9-5`xx-5^P~+@Q#|+$30wo8-&2 zI_%|5@^qDS!cI>oes|Mpw6eDdJN_0)`s*#VrjWFJufu&-u(UfMX~o~vQc}`EzmWvz zeaARl z2-fcrjhps}il3^e35f)t{8A?*B=lSL_9)xuGw}B&T1H`q6(;@PGan!B+f56p#O+07>|p95C%~ zg8lY4ja%X$q8;%Mx#ILc6b$kIl8Gn(OS)bDmx3_oOQPuelEz4TNn`k55$EJr1pDq4 z-4Z>2MJB2In)LnVHNmdDrgWYC4Z-@nAqn>DE!$hQx|nLU!hahyleyo*RO|UxEg-GC z_$^6#|1H_?(|4r#ly@{PSTdSDd#7fVWS;lr>2B|-`a1s}BWF&DXn6xPXHK-N)#tp3 z#>>LSVbQqlKNyBc78f3kH*{n5*8Ong!RkarHI4{OfeGe9b+`!u9Y=K<3(tSDH@BHbW?QF{{zLH<5&Oy 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 1041ef46..8036f710 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 05122f51..81ec80c1 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 35dbbfed..d45131f3 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 2d7cbcfa..fab2ca84 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 dfc223e9..357fa552 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 68a0ebcd..05409c69 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 00000000..88b82210 --- /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 70a0a6a1..f7b1a43a 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 6a0a8be8..5446e0d2 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 f669d644..e296553d 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 7b408870..887527e3 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 f1662454..3db7a2af 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 0fb24baa..e4f16957 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 5065d86c..93de0598 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 5b9667a6..29cbbb35 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 948b357d..bdde37ad 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 a75b373b..64d401be 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 a78d5861..1969fd44 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 516601a5..63fa2a63 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 b6a14879..275b5eda 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 d422ed26..078129a1 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 8778b7d4..9e4f5ab9 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 17583cba..0341c0f8 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 61aefc93..d4d3a34d 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 a28b5d71..8260ab65 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 0967afca..649fc670 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 d1e2ae69..605b3822 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 56e5e72e..f7bc3934 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 76a46e68..da5d134f 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 7f0d9881..f73a2b65 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 7925e8f2..e194568c 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 5d8d7c1b..68b66aec 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 533986e4..11b344ef 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 335ffce5..8a8e1bcb 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 6402f48e..c96e0844 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 cb62667c..9532d7c2 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 018c7ee3..73ca1356 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 74a3a1f8..e159efaa 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 30dce3b7..efefc17b 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 02d3e974..c595ce5d 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 7e0c61ff..6659e529 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 0e845467..d234aa03 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 6c918575..50be6575 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 910a0d20..fd8652d6 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 3513ddb4..0298104c 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 431e992e..ed669069 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 0c1c2c4c..3f02e28a 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 6bf18882..1f2a26cb 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 40c5a18f..19767fd7 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 39a6f208..65726c37 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 a1d81fd8..fc1e82ba 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 7eecefc9..2a45f05c 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 ca4c90ee..9f17815c 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 e36e6d61..bd5cd02a 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 369f62d6..1386fd63 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 70422671..5f126ebb 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 793d6cdd..7d9dbc74 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 dacddfca..66704ac1 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 9e89a291..7039ecdf 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 a2f79a40..057e2684 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 7ec4364b..9609ef96 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 4a2b6d43..b2065c7c 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 3095503c..932d7b9e 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 b4102e48..5891db62 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 edc932f3..25cd8e28 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 1cf37f36..b20c59c4 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 dc121083..f65265fd 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 b66f7487..0daa89b6 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 300f49c9..9c838910 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 f8e61631..9f44b64a 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 2c82c1b4..31bb984f 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 2b406e11..17fe3ae7 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 c95ca280..4e1df706 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 857bdf9d..aca4e588 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 308bda20..62388343 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 eaa90f6d..c04da618 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 312b09e1..a8dc9e14 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 6c2504c9..3f21c529 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 03e16699..934372c5 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 24bcab56..7304d1e5 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 f361ae79..3015771b 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 46dcd0cb..34886481 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 64e7a8b9..441fcace 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 7a242b76..65464593 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 6e6d8aae..deaf5e88 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 b9f19050..f9112669 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 e9abdc91..5aa9b604 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 231c0101..2cc96712 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 cc5fe0ac..c808a991 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 fd5a13bb..c170e7e8 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 80ab10cd..0206d415 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 36ca5c77..be24ae88 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 6cca3e21..06bf4cc3 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 e2de47bf..33f46882 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 cb003edf..6e8ed789 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 e5c57aa2..3fd71aff 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 1cd0b6ed..6d4bb202 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 d6bcd131..370b3f18 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 47b24e10..eee6b502 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 65fe5f54..f3548a38 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 9ab5533f..e8e2bc56 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 c4ec3cf2..c0a93415 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 d89a69f0..b63340e2 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 358f564d..0ae3868d 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 b46cf7e1..f037589d 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 7f34b730..0234eb5f 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 6c74bb52..f3800bc3 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 12977024..aa7ff9da 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 c4a7df44..598f76a6 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 b0b547a3..c06e46c1 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 7404fe06..aeefd9aa 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 a86aada9..8728a211 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 00000000..9bfd1f0d --- /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 aa01f4cd..b47f1b8c 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 d57a4293..8262e1b5 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 42c694bf..3570dede 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 814c50e1..28b4ff4c 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 a0724b21..d0cf7521 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 bc48d39b..5b3c9f02 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 66139a31..11c73797 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 1ea31d22..dc7e0c79 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 5d8e8c1e..5a7d4699 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 e27070f9..ee526646 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 6765261f..64fadb8b 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 7f2afc31..92888e03 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 a82f2b9e..e692f31b 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 edbe235e..dfff5720 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 966edc87..bb9f59f8 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 2afb7dfb..3ef9da15 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 6decce60..42366787 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 bf454aa3..1a7df614 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 f24732af..aab6e797 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 971f0c46..cdbbc022 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 5308f780..3f6770b5 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 2a290bd8..ea8246c4 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 7d2924ce..c559f562 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 fc3d9ecc..5de41ac0 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 c3dfe8b8..8d7b9126 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 8f892869..5c3ef9ca 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 3c5c6e67..697595ed 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 77a2969d..6f04e08d 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 94d9f225..130edc5e 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 26c9662e..f6bf39b8 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 7ea98728..e90e0b0e 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 00000000..08881858 --- /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 3973ec71..3b6b909f 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 d53caf00..ffb646b6 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 385723ae..50d35ee4 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 60885ed9..eb869642 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 b24d72a5..0d657397 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 55899905..46bb8f81 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 26a3dae6..00ff8cf2 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 e0bbedb9..019852bb 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 5ae652d3..851e4d69 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 dbbea974..fb5fc371 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 b5394e58..493075c3 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 8c9390ed..c300f927 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 1096467a..8a3dcf5a 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 44de0124..a0dfcc24 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 8482a164..96712fff 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 a1278ef0..c4c45b8e 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 65bf4814..bae37389 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 135a9843..d3e5ddd5 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 f040e680..b28a7170 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 ea894683..a229cb5b 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 a8455c0f..425c12e1 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 e823a746..75479cb6 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 c2ee80c4..9f4b1cd9 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 d0458009..da40a61f 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 cc99ab56..45f0b465 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 5cb3796a..f57fc963 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 b5b94982..642c9367 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 c7ed2ca5..36946401 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 ac0976fb..1016ae83 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 9c290334..9276664f 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 ae94d7b3..781fdb01 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 2e9faddb..3804a583 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 a809c3fa..b723a5d7 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 dec58f3f..5df01599 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 67d06874..f5ec6fd7 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 44acd911..3124db65 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 12c99246..713a584e 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 80ff1c14..3ae6dd56 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 ee8c8544..0ec23cbd 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 bf384390..ce21a308 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 abbcd514..de59bbcd 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 7bf423ed..2c4a4049 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 6d5b1247..2fe9f8af 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 9257321c..7ade6d79 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 6171bbd8..fb14a905 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 cf27caf6..ab6167b9 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 3095503c..932d7b9e 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 96902cd7..a8835083 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 edc932f3..25cd8e28 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 ffed8a6e..f97e0c13 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 98aaf610..42cb2056 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 0b0aecae..100dbcd7 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 65ac41c2..a7d06617 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 c5b0e723..3dbbc53a 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 2a2c466f..131939bc 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 94cd6f29..dc4fa99f 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 b169916c..96a86eea 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 bfe2c43d..55366d3c 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 7661ba17..0944b5d4 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 1bc11937..f0ba1bb2 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 96b001e1..a7e2eb06 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 8c3bf7d2..7b8339fe 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 6c2504c9..3f21c529 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 03e16699..934372c5 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 93ab71bf..7e1a6b0e 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 f361ae79..3015771b 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 815726e9..02af23cd 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 5fba1c7f..726c01a2 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 a9077cb1..549cc411 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 8f8984f8..1420f5a3 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 1943fb51..d8e90de4 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 b9f19050..f9112669 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 634ebb2a..2e172a75 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 fc93eebd..e21880c2 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 f0035302..4af40953 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 040fb37e..21f1a1c5 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 d9585818..9f8fc39e 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 549a1979..2b6f38ba 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 03ae6822..b6b5d107 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 9ac72f8d..93ccc07c 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 02314db6..31e87095 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 2aa2426c..4ed31008 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 1075064a..56b7120f 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 2b0b05dc..b3d709cc 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 0d5a0f55..594416ba 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 fd52537a..695be490 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 3b6e8603..dff4610d 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 c9ea270a..a60ec248 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 1a69ecc2..409f7292 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 34d79326..45ef40f4 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 a5390855..51ce3dca 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 b7211989..71fb3894 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 c367e7ca..b63bcbaa 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 bf0fb8ea..38e453e9 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 31f98562..1b04f8eb 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 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

  • #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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