diff --git a/.gitattributes b/.gitattributes index 852eec4d6386dec5387dcc9a9190f48ebb5e576b..9d638481a8470b033193906e495e763478186966 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 c3c140bb99ab9d01f4fd1172c4799454160b227c..acbb8d21372d5146fca25106464e3518369b0cab 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 a38654956aa0de27938a579247487edad4b3e2da..fa1ed701a812de4c6cc59ddd10e5f071de377b56 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) @@ -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 6288c2cdea415a9d620de715a909ce3dc78a0065..1788b6304fe7b995ac6e0f4d5fc2f92ffd832e13 100644 --- a/CREDITS +++ b/CREDITS @@ -3,16 +3,16 @@ 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) +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 7007a3c3f1b106d41b3266a7666f1b77b82e3894..707e56e9e8e5fcde0975080e0648c80d41d6fc77 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: 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.29 +MariaDB source 10.1.34 diff --git a/VERSION b/VERSION index dce8bbe23fc1d45ba8d2274c2282a83a46aa3b3b..f9ccf7c618851825919daed1aa05e57969e78f99 100644 --- a/VERSION +++ b/VERSION @@ -1,3 +1,3 @@ MYSQL_VERSION_MAJOR=10 MYSQL_VERSION_MINOR=1 -MYSQL_VERSION_PATCH=29 +MYSQL_VERSION_PATCH=34 diff --git a/client/mysql.cc b/client/mysql.cc index c043d054ea58c4130aac65e3be22b60ebda00bb0..2cbb6ae25ddbf9450ce45e828a4f9321f874adb9 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 @@ -1174,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); @@ -1200,6 +1197,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)); @@ -1227,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); @@ -1793,8 +1793,9 @@ 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) + exit(1); #endif break; case OPT_SERVER_ARG: @@ -4589,8 +4590,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/mysql_upgrade.c b/client/mysql_upgrade.c index c10dc20e7d7c42167497eafccbe782854ab77115..5eb495774cef128c2f96fc2ad1605ed013a7eb83 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} @@ -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 ffdc73f99ad62edacbf018785da48fa55678ab16..d4d40b0a0f28fc4b5429e0cec243468ca8d2a111 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; @@ -315,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))) @@ -496,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 c103061bbc5eff3ac213881871f5242280b266ec..9753125dd67188f887c1d62ca5253da8adfda6e8 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 @@ -2655,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 c4ac58973f89e634032006f3f03c25d625ac5fc1..a4410eba8aa9b67d227ccfb728790c66377e7e80 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; } @@ -1161,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; @@ -1239,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 aead4caf5067019e739efba2aa8f4ad66232de24..f67e52c1b127ec20cf4ba1a071e3afc19076a306 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; @@ -972,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, @@ -4991,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"); @@ -5000,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++) { @@ -5062,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 7f03cb355f834387ffc4d95fdcb2a45fdf0b1ada..a9c24e20b0a196e2559fb86dcfdd63d9c47ff368 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"); @@ -637,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 6f434d6770d714b72bed563f72f13f5a43d0d32f..95ee8d697f3d1e51d988653067b2be5a3ac2ffd1 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); @@ -328,8 +327,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 a78bf35d51b745efd5cf28ffb102ca508fb86073..fd30776446d77b3da0c5380ca32d02c52cde9a33 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)) { @@ -779,8 +775,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); @@ -853,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, ","); @@ -868,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 155d0c4c0921eadf96b333af5afb0ef4d5c6d93c..a58b83bd372ca3a3f025acee548c3e219e647c6e 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; @@ -1523,7 +1525,6 @@ static void cleanup_and_exit(int exit_code) } } - sf_leaking_memory= 0; /* all memory should be freed by now */ exit(exit_code); } @@ -2679,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); @@ -2689,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]) @@ -7292,8 +7286,9 @@ 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) + exit(1); #endif break; case '?': @@ -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/build_configurations/mysql_release.cmake b/cmake/build_configurations/mysql_release.cmake index c07de46fc1675a77611df69619032a4619d23855..04860a40dbbbcb27407c2daf0e1da004568c8a80 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/cmake/check_compiler_flag.cmake b/cmake/check_compiler_flag.cmake index ef675959059c4de63019e5eac74e388942972558..673361ab8fe1398797ccc7332744d414a729f40b 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 08852a366f6d46b1a4696ec3c92f0e555d3c0e00..fde7e1632f6c15356cd0e69e165f3faa76107b7b 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/dtrace.cmake b/cmake/dtrace.cmake index 3edcdc4c1c5594e99eb3e78e6bbf551fb6a9e219..d7ab0f31991a912bcf3eb05aa9dbfdd728eba9b9 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 d1a261f8cefc68858b0b6cb249af8d018db57851..5484691e94abaa29f9a8fd1f8aa26d4e3f26e1cf 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/cmake/maintainer.cmake b/cmake/maintainer.cmake index 0541cca86a5d810778961741b63fcea6ccd3520e..4e902d7fed8c59c683b50ce47ff7d079507f87b4 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 b5dc8b9f1573127e81537010be1fc4216f53a416..9fa127380a43a878421f0b10e57e2c0e80b97057 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/config.h.cmake b/config.h.cmake index 8ef512c70718e9a682cf089b269aea8e512fadd5..b1a9d813767712e6f7eab1ff9c32978bb11c9759 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 0057c7fb1003e1aa7aa41c1c47569772230ee39d..df180e72963712c57fa3b31223d64c336de11328 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) #-------------------------------------------------------------------- @@ -1101,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 ac15460660cfe8188e988edb24156a7811569f71..aa05b36153f5a3ba2f4e600ce96d3c7f6dd33b38 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 c019209faad5ba915cd008a8193409ebc850520a..d3253348d72c7f34008c8692e07869a8d814e2c0 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 6f425e9419f818a10c9bbc5683868ccc1351609d..7f0ad8a8361bf92e10b9579e106cb97ba49a67c4 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 7b1dfd7a0dbed198b02b55dbff49d714d7219cad..340ad66e28a0ef617688a8132a31959514ceab6c 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/crc/crc_glue.c b/extra/mariabackup/crc/crc_glue.c index c301cb01e2e0435640879f19e4bd122107803cee..11d2c21886b0e9b2e7818bfce00e8136e3284278 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/datasink.c b/extra/mariabackup/datasink.c index 460e0e8ca1947f3d8e975314a7f3f8a0ea2df23b..1459da2fb57b0ee4dbc1f0be03406716e7c157ca 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 8bf1321aad17dccb386d2ca3ca044faf9584a313..5962e9ba4b75597901a976df7561cf0b4aea44a1 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 4bb314c0f50b4cde6e74cd9ca801958a9aaab4a5..8e13e878953c4783347ee0082e331f569c5698a9 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 15801c8abd412e5ee5c8562b3cf28ae64a2a7dde..88f508573620de505de3d1e789b61c02c4e440d4 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 3e2b1e0129bb88ba0536247bdbfe168ef7f6eb2d..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..f1068d251dc594636ed355c112f28261a344cee9 --- /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 b0f0f04030c2a1e5000852d951c2d9253a6fec6b..e30906b575d1eca913627fc9a3714d2e541fb2a6 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 91a514ddf6444a27eebf3500863c2037a0501011..391a34551951b1cbad66b1ca5fa7938300ccdbca 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 b039d83ba03e02a1166567923dfc15b264aa7793..27a8d9688f44e68782cc246be9e9683a7ada9387 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 42924a72d7f80ccfa6af8a84a5fe9f63a8eaf7b9..544929fb24c01270210b79509e50b191b5b878a1 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 7e97b2584898673468f53969741db2369a75d3c7..a134abb314d8c282399823964b3da0298b09e9c2 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 56661b03dd083343da0398907973965432eb1f0b..878b4c81023d3fdaa205a025500425b59091c98f 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 2f9761eb0ec93a96dabc0508a91cff88158a82d7..84f57bde64f50c2fa2c89b62f013af8895bb88ac 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} }; @@ -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 }, @@ -1181,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) { @@ -1211,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); @@ -1378,11 +1380,17 @@ 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; +#define MYSQL_CLIENT #include "sslopt-case.h" +#undef MYSQL_CLIENT case '?': usage(); @@ -2555,8 +2563,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 +2575,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 +2632,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)) { @@ -2688,7 +2700,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)) { @@ -2735,14 +2747,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); + + } while (!scan_ok && must_reread_log && retries++ < 100); - if (!xtrabackup_scan_log_recs(group, is_last, - start_lsn, &contiguous_lsn, &group_scanned_lsn, - &finished)) { + if (!scan_ok) { goto error; - } + } mutex_exit(&log_sys->mutex); @@ -3060,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.*/ @@ -3113,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, @@ -4227,16 +4333,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; } @@ -4335,35 +4436,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); @@ -4873,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); @@ -4885,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) * @@ -4955,10 +5046,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); @@ -4967,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++; } @@ -5421,7 +5538,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); @@ -6127,9 +6249,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; @@ -6308,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++) {}; @@ -6361,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; @@ -6576,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 78940e02ca43f998a039a1bc38efce945eba8be7..07c95a79ddc7012575880a05b373b05c86f82079 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 407e4092ccc0aa3dbbd16329d07b5bc725a974f6..6e181a997bd95e3aa78147d09c62aae9965a2a3f 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 724cf6c5f98a95e019e6a02d9ef378fe43aa7c8c..e92f649b87bd73350a9b545aa7f016c2c98ba5c1 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/m_string.h b/include/m_string.h index 7437ea8b7cdbe7eeb93fbe6ca69c5bc86a15304d..d088b510de5ceac9176e888b8285747285549fde 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 cb03ccb53823af3cf1f51ccfa825664540f987c2..4f05b425afd73157ff17f249ad342f112861fda5 100644 --- a/include/ma_dyncol.h +++ b/include/ma_dyncol.h @@ -63,6 +63,15 @@ 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 + +/* 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 3440d9ef920c14bf4a5303c328e9477718410e94..1c50ff937913f2cfbaa6994ef8e2ce99513ea1c6 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_default.h b/include/my_default.h index 0ed94b094922c991ea6cfba62d3182d01e324596..bd3a21f03a89a732ec8b6ecb8c8aa16d1e9ec27e 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 b9284b99577582f1efd8b59ed1d9a56db490bf13..dcfd607b455769a5a31a00b1911fa4510b4904a7 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 */ @@ -1091,11 +1098,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_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 bef75576422bd342d5a47af347bf3bc33678c6c4..4d88e992b5e336e76d4a62c7df8cbaac3beb1834 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 110a2ee9af39db9efd09a61fc21653308421e71e..1c5649812d10b408a47e38307a0db73c960ead16 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 3fb93350213a2f990da75e6932f20dd456d39155..c488aaf1052c81419a6a97eed89f4964936b6423 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,15 @@ # 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 +/* 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) +# 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 +49,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/mysql.h.pp b/include/mysql.h.pp index 32d87b7391ca2e85d43e0e2d70e1ccaa90fb8eed..8936a716b908f5f30c7b1efc69f06e5c70806c4e 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/mysql/psi/mysql_socket.h b/include/mysql/psi/mysql_socket.h index 1dbe8c7eb22ac375a7a015bedcc30c0c5343cab0..fc0a3ce2eb00f22fd1799435c74ae5bf1b2356c5 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 678ff0b7186a7ebd3c567ffe65204d5daed20af7..dd55daf77aa584c133faf181f8ac9fb818629be6 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 39b8ce18517f5a20d34dee1baf24ff4115c41574..9c67034d798ee23a89337b15eeb7095122f7b249 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/include/typelib.h b/include/typelib.h index 4504bea4ff78cffbe844e21b371caa51daf5799e..ab5a0f0d2582aed79cf32db27793037c67194566 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/include/welcome_copyright_notice.h b/include/welcome_copyright_notice.h index cd7cd6692be26e5bad343fbce7e33ed21951a61c..1b4b17cfc0d51f5706cd99fede6649472b7a67ea 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 acbd80b48758f64313a59b0c8a1bb2f7c938bdcd..001bd884865a8e494144adb9e9f27635310b5247 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/libmysqld/libmysqld.c b/libmysqld/libmysqld.c index 36728cf573c39027f462966dfb5379f1b7d90a2d..543ab86643ee3743862db28138e4cd9cd8d40a43 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 48ea44a5ac9362b72fbd5d11bc47cbcfcf08cbc4..f04fa12238339418b52448a08885543815b4a51c 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/man/mysqladmin.1 b/man/mysqladmin.1 index d1fdfd9d5aae4ec6605491767a9031ca1ee2802d..cfda6f1c4215e98c8898c344aad76813a820a729 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 1c7cfaf81da67a5af5cfc78beee5efd515eb8dd7..c03f0c358386ef449500f4c6af6c83458077e800 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/extra/rpl_tests/rpl_implicit_commit_binlog.test b/mysql-test/extra/rpl_tests/rpl_implicit_commit_binlog.test index ed7583137704b97c00459c63e7c24708c879896d..20c79ed4b3b945bc12db27698171e5509b15f0d1 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/extra/rpl_tests/rpl_log.test b/mysql-test/extra/rpl_tests/rpl_log.test index 01e8497e4de3586e6a0ac2cbf1fb7d5788616ef8..934f40306ab3cf6f4841d11ceb53029109a0725e 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 17c7c1985d71fa39a9e2f381faf827add4fca54e..bfe5389671097a5ea6695061b7d4fea63c365847 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/galera_wait_ready.inc b/mysql-test/include/galera_wait_ready.inc index e20f01fad90dd5052420c91a6252a2a3c40b4d94..a726116f000bc85a961fc7fb2663f66162ea10ff 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 0000000000000000000000000000000000000000..fb94d61dd423b6f3e6c7849c14952194b8932fa0 --- /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 0000000000000000000000000000000000000000..8c6357e57d6d5b88497edae617d410217094a679 --- /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 0000000000000000000000000000000000000000..5ee57c0bfd8c06039e91424c5c1216cb4f5e1df5 --- /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 0000000000000000000000000000000000000000..2f6c2848f9fd0edb28f8c26a5be22866514a8b54 --- /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 a0447280ff564c4697ce339514e2c2e67ec2b4cc..940e081c431653c05f9db7391dcc5e2ce763ab3c 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/show_binlog_events.inc b/mysql-test/include/show_binlog_events.inc index b2462e0d1b1e1efb725c524e1d8f538c7ac20956..57fe1ffe0e31b2e452dabc8a0336690c04e2c07f 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 368cfc9e3a7deffee621c739a9fb6cdab87a2338..9ee01f73999762de60e31099e9d43f5f37a715e2 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 0000000000000000000000000000000000000000..96f813f180cbe75420d996eb78d9698f285c6c0c --- /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/include/start_mysqld.inc b/mysql-test/include/start_mysqld.inc index 04dff714d497b09afca8ae2f0fa3d68ee9a5cc06..e31f26aad8c85b9323eeccdff125e02c0f6a3b84 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/truncate_file.inc b/mysql-test/include/truncate_file.inc index 2326d6c0b940cdc032a5724619f35c13889a8b03..fe88cb05bd92fad1ad3d4029c28c323509bf510a 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/include/wait_condition.inc b/mysql-test/include/wait_condition.inc index 5fbde6950c8be615a5989c2121ec67d8fb63cc04..d40b0e4d448d298c6ed13e4a6b11d321ea110c9b 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 6f64ef454400ef738d944097521f1cf0048b7514..b13d07e94bb026fbbcfc182cfd05f87873347cbe 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.pm b/mysql-test/lib/My/SafeProcess.pm index f3ee772cca3f67eb16dcfa0096f384e6c575b5fc..2980992290c4c878c79e88a5d268a8f6200b68e6 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/lib/My/SafeProcess/Base.pm b/mysql-test/lib/My/SafeProcess/Base.pm index 1ac0120a73521d45f8d1b3370695fe38e886490a..c5ac2ab51c211f157f6611e2d4b6f2d447674084 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 8f18b137b871a5524e0b4c9b54c96467c64e9446..f8bed8001145bdcf37614657da009c68bc8c92d7 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 0000000000000000000000000000000000000000..5985fe337395ab44f37fab584b19998166a6b896 --- /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 ac9f493dc841f4c8b148a1ae11dc19bc61108969..9df96f636d39f0ef9cf5cf3e98a098252a5e02f6 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++; @@ -1589,6 +1604,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"); @@ -2817,7 +2833,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); } @@ -3198,6 +3214,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 +3251,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"); @@ -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*/, @@ -5042,7 +5058,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 +5661,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, <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 be1f01a2a52e34847430470801c5ad9dc3eb80e4..238baff50e13e3f74b032aa522c82b5c4755d14a 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 0000000000000000000000000000000000000000..4ed6170136b7f302691d710e9b811a382bccb1e4 --- /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 315aea0ef4688ef7a7ce39db30bfbdace68577c3..cb66ff483e19839d5168250173e8bb8232045f1c 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 0000000000000000000000000000000000000000..0452b238db9be1f68fc14fa3e4a7703e818d09e8 --- /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 5d92184f191b886e932533157567800855a4ce3b..36d033f4cb37401a30768e5c7b0fe2d36b8bfef8 100644 --- a/mysql-test/r/contributors.result +++ b/mysql-test/r/contributors.result @@ -1,15 +1,15 @@ SHOW CONTRIBUTORS; Name Location Comment 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 -MariaDB Corporation https://mariadb.com Founding member, Gold Sponsor of the MariaDB Foundation +Microsoft https://microsoft.com/ Platinum 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.result b/mysql-test/r/create.result index 14a8788d3ef03121e2dd68ce5543e098ef268a3e..4ac8a0e249f0c3ad456c4eadc0da13643f7d5dcf 100644 --- a/mysql-test/r/create.result +++ b/mysql-test/r/create.result @@ -1912,6 +1912,144 @@ drop function f1; create table t1(ID decimal(2,1) unsigned NOT NULL, PRIMARY KEY (ID))engine=memory select 2.1 ID; drop table t1; +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); +ERROR HY000: Cannot create table `t1`: index information is too long. Decrease number of indexes or use shorter index names or shorter comments. +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); +alter table t1 add +key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0064 (f64) comment 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy'; +ERROR HY000: Cannot create table `t1`: index information is too long. Decrease number of indexes or use shorter index names or shorter comments. +drop table t1; End of 5.5 tests create table t1; ERROR 42000: A table must have at least 1 column diff --git a/mysql-test/r/create_or_replace.result b/mysql-test/r/create_or_replace.result index 70b4b98b89cd36299ce8c02f093aec3d9b225098..27aafa976a4fd822fe31dd5af30506955f4e21cf 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 85035982cf9ba92a8576479773171a0d35422648..66c5a37750d0b57608060301f985ad8e30112e6f 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 f9f0acf726fdb2db34bcfa9e46d51e7117a86eaf..55caabbaa12754e0f3574191684ba82ea66c4f38 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 ca585f9e33072565104142f16fcd5eba581a7afa..3da74d128772aa27fe1423d492556efaae13f734 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 # # @@ -10520,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 bac0fc34f80e6e042fea01f0b9c131a91380e2dd..904f432af2066e60b8a52db5dcf7f8d82c5ff8ff 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 # # @@ -3421,6 +3444,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/derived.result b/mysql-test/r/derived.result index c8736b557de81d102808ac4930f7bdacd43e9089..687497ceb7e10d86a118494ccaa3a437b899f471 100644 --- a/mysql-test/r/derived.result +++ b/mysql-test/r/derived.result @@ -1036,6 +1036,47 @@ id id data 2 2 yes 1 NULL NULL drop table t1; +# +# MDEV-14241: Server crash in key_copy / get_matching_chain_by_join_key +# or valgrind warnings +# +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; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY 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 b0d28a81043fbaf16e8286a7d04d24047519152a..fe4ee3f7de2b1f782f32f342272c6c36e5e23792 100644 --- a/mysql-test/r/dyncol.result +++ b/mysql-test/r/dyncol.result @@ -1873,5 +1873,25 @@ 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"} +# +# 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 92af85f7fdbfb59768e92ddc1d41cb2022dc2c24..c6d96389b08d33c9fb6f22c25335fc6de7398d0e 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/fulltext.result b/mysql-test/r/fulltext.result index 8bf948e0d72a6c42c4970bcc2d2909d753bf6a18..df484363acc3792fcbe1a94b121af86638ac6338 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 b87ee7bfc522629657c9954ef0f91b03aa6eeb6a..9ab6f74653eb4bf3913a31c6f817e66aa596abd4 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_date_add.result b/mysql-test/r/func_date_add.result index e8fbba786a43f4b3440b768940e6194d4ade76f0..0258267b5ec5e6c7e66879d31b236171e6188dd9 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_isnull.result b/mysql-test/r/func_isnull.result index 2dbe3d036f994e6fd4538d62d4bf7306c054e9e9..88c5bfd54680ac77402e3bd6b5cb5c1a41318239 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/func_misc.result b/mysql-test/r/func_misc.result index 545d515176d1487adbf9a77a97fad06ba36969f9..1f9aa2127408c505308b7cd4f5c65b62660d12c3 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_set.result b/mysql-test/r/func_set.result index 96af966d367d93ec21647b7eef7d810765ea63dc..23931bde1b5b4802b9d1d8160694136902902e93 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 d32efe642bbc135917bf1d82bb735e530300fc11..3d9c9bc15d97661b86c62f45c35403c03e1dbbf1 100644 --- a/mysql-test/r/func_str.result +++ b/mysql-test/r/func_str.result @@ -4547,6 +4547,64 @@ 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)` +# +# 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 371dffdd3ae40e465b9b3d7cf7d8d357cf3942fc..2180ec2b83c70186dd3ce0ece4c183b535a8948e 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 826d1f6c6b256a1f5acb9ed2f40501bd34e0c1cd..38d0136778e113ec10706630d1ea9e8cbae42ac3 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 cf58a2dc6f5e9f81775c5af3d1a43246aca4a87f..bdd88e126178cb780b2ffa6b64f8ea8907d60905 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 0000000000000000000000000000000000000000..fedfaf984b2bbd3773de768b12fd89956227a487 --- /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/group_by.result b/mysql-test/r/group_by.result index 29b3a0ea13b31c1919ce7671f6af5a612f42d8dd..eb730a8c954d01530caafbd7bd78b9f854b5ddd1 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 7fdec5a29cd299b306350f0ea44b7e23e69eba6a..3845f11952827098382c9a275a576a3357391de1 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; @@ -708,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 07536ab07193928d159dff14ee339e3bee226239..b0cd0b75e8d4b93025ccf7776e1619a409abc8ab 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 2b5a536308a716a8852d295b38f9246b3d2095f7..631dd8eabf57e0257b0e0c256c61896904ab4f3c 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 3f4a26a728ea12fbfa4432f8e4abaa6b8935f6d6..d130854ec1354f852db03a0cdac72df7b2637167 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_cache.result b/mysql-test/r/join_cache.result index 7a11cb95715b3b9ba992757d040b7866144f7a66..9eb1654e2ccfd2993ae1a84a32a74496f20cf819 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/join_outer.result b/mysql-test/r/join_outer.result index 2109d75a14a1c7e29f0eca0ab37e09c2ab49ebbb..312b36c16caa2a3483729982ca052d8e2432a760 100644 --- a/mysql-test/r/join_outer.result +++ b/mysql-test/r/join_outer.result @@ -2433,5 +2433,34 @@ 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 @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 69f0c25bb155342212efe1a1d585c7d1a9f33cba..a006bafcfc0ed8825d38838c5d76e69d5152f4b0 100644 --- a/mysql-test/r/join_outer_jcl6.result +++ b/mysql-test/r/join_outer_jcl6.result @@ -2444,6 +2444,35 @@ 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 @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 176a93c7a460509ed4ba9cebe95f999937785555..228c1be7a83a49bc4dcc0ab8cf23931539b3b93f 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 501c379b2578454dad876297711a493774b4c87b..0dcc0de828f4e174e5a8dd93606cabce48785d59 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 325808046867f80cde09f1381739ecda142bda1a..b3b83af09884e7999967430e650846e882111b07 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/mdev_14586.result b/mysql-test/r/mdev_14586.result new file mode 100644 index 0000000000000000000000000000000000000000..f6c2095d3cd236894d4ded5d31ff8b2746882769 --- /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 36e196497e580a9b115bfd5f8da9ce7d4870e4c8..97c391566dd37aaa748ea41ca931f7dafa1fa51f 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.result b/mysql-test/r/myisam.result index e114f424ede82d67bd03eab9bf7c8891066cca77..999f489457fc2ab8bf82e973af2481809586d9b4 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_optimize.result b/mysql-test/r/myisam_optimize.result index ae0c5b59d060aa04b872eab3b83eaab857e5d935..36faba5eaa9ad4b2fece510b1680e96a3a171a46 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/myisam_recover.result b/mysql-test/r/myisam_recover.result index 0829c1e8b82da7443fc47e1b548c8f4e94b88359..6ae282cb2b60b7073979aa2b780c4ad412013c5c 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 06116a2e630a2858d41002b530d350d9eb5bf7f0..6e18d16feaf3aed0afdaffff2a99ab5b30c6721b 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 e84921bfa0ab0f727d23da4326bcb457edfb56cc..fdb4d8c280df3221691858205e681272f11c0173 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-nl.result b/mysql-test/r/mysqldump-nl.result index 829bf9801036f1dfaecdad3f70c35b71e983fa4a..d397453b0712687caf3ed526857367e3b1ff7c62 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/mysqldump.result b/mysql-test/r/mysqldump.result index a5fe01d63c376878630e6c4ad145fd12ef3f9433..48e77421bf40552174725928d7fd0526f2f43ef1 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 d3c5107dee330aa2528fd5a31b315335435801d8..791cb5ac6b38d42eb12096d957e7040e7e5de687 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 b10f175b63e65a01cfe84d8e471c9ae618eb79df..24140583d13e83832752e6a0477cf747f5c9a128 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/order_by.result b/mysql-test/r/order_by.result index 71aa32f0cee3dc8237ac3548396eefccf57a0aa7..4cd9aebdf49f16489a84dd1068cf9b0362f27d97 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/parser.result b/mysql-test/r/parser.result index 26f4b018726bd21e0c952a012247a512ad94f98b..3ebd84ff521ebd00eac11223640af4c5d53a5a7b 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/partition.result b/mysql-test/r/partition.result index 49ebd1f597935c5642fd98b8dc08f2b362c7903b..53f89c9cd557b86f438df7e943c2a8cd8d37bab5 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 dabcedcb3f92c05468a7779259068f4c503c62b8..756690925f8340935ff76b3df3542ec98505d90a 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/perror.result b/mysql-test/r/perror.result index 432a4fd4c04bc4ffa78351c48df70f7616de9a3c..46554442721075d7f1764fffa337cafa52f4daad 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 94f1a51deb7a81190886e1e47050a0dff8f2ced8..1b40a7342630ad258774139239f8689e4bab8b5f 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 @@ -4332,4 +4332,64 @@ 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 +# +# 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 0000000000000000000000000000000000000000..775055e858f1d8f5811290db36eb16234eca00df --- /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/query_cache_debug.result b/mysql-test/r/query_cache_debug.result index 01c642b325b13650832156ce92fcee4acf80b165..b3070761d9c964f90be1d17ffec7faa3421526ae 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/rename.result b/mysql-test/r/rename.result index 74370ba74ddb1beae6163b5ef20d631a638f8a06..c90aaf24e9bcc64b4bd50357b56710d49f7b13b4 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/repair.result b/mysql-test/r/repair.result index 79ee0c7a9b8ce07f689d3ead41237329875cede8..8d48d2f884826f5daedddf8ece3dd14cddd129ea 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/selectivity.result b/mysql-test/r/selectivity.result index 01847006928c28123efdddb8bc70e8cb8f8cc5a1..6cb7934678b01acaecb9c4d6cd46e244bd7f3329 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 070cc49ca7f8ded5a4acd57c6d10a4c582bdfb16..e0227163d692ed5fd08226081f04e443b81eba5d 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 0eddfa70dd15d208bba3c4c15f35e2497d409e1e..a3754d25a8a7428707c82beb193403fbdfca80d9 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 b3405705698dbbe60ca379ac2a7c106d7be71801..8dee74040b3b2950436adee76d59b3e94235d942 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 c6867d46489a4cfad77a466c8c98967b4ea666a5..bc33c08d9d8568ff813544c814c7ae7feeb7d102 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' @@ -8107,4 +8107,150 @@ 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; +# +# 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; +# +# 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 2d0f18f1ed76cc294b6263dc1a416d96be67a234..d5a112cc7794320533415850e7623156310b6f53 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 0000000000000000000000000000000000000000..348681c33116c8a1d106b4f0e4c8dead5c23891b --- /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/subselect.result b/mysql-test/r/subselect.result index cf542a5913e30b311511cc1390802fc2afd75cff..40f936fb3b47f9565018eecaab687684d7cce448 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/subselect4.result b/mysql-test/r/subselect4.result index 4e70615120f9f524a402a645f311a9f25a013dcb..a7e2bd9d1b5f9dd9603691987aae3ee8306b9dcd 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 934aca92f9f37aad311cd69e53e4e0801121133c..924317dbcd19160c200f70f4f3dbff4f8492a91f 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 df6b543bab8d6eed33730aa64672faa73bc1801c..d33f1488e4df4034c58bdda87efc22a792e1113d 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_no_exists_to_in.result b/mysql-test/r/subselect_no_exists_to_in.result index a3a6e2ab4c0ac5391b581072bf9ac1c47f7b5b67..a23820820ef768df52e9ae6e60d68b24168affd7 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 11457ccbb026cecef03da646fb686a12ccea2f8a..baa74307f89fc01ef7e5819c676113dfa09e9623 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 076953c210f48995d0da9ae787932d244cc012f8..039f2fe1a9e06020ac023b74e8d97c7329a3a285 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 b5c7e9bfdbde33d0ff5aa30ae9b2f49ded9dee7c..0ce77bbb37613b210a7743e6c4092c222c991423 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 52da5f1cec319b243a3d8ed7fecb7064149a4420..574e78122f1439a0e8c5772d14462a5c2cea9d09 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/subselect_sj.result b/mysql-test/r/subselect_sj.result index 643034f452d8402c7cd9dae0ec03967c1d168d9d..77dea34e2ab1ebb841f0d15639bef03710d35163 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 c8ee451c62f79e364ffb958b9a9bf22748490b5c..db4ae1714eaa9a1f90e2bed41d7ada369d114027 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 6d9dc37345aac97bda578d4acc823a5947a81c11..0741eb236ea8d60269bda50e866751f1cac31f53 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 c7e04225ffea4ac7988f1265c7da4e6319c5246a..47970668ae578a84c2390a9d93617fd2e8b9a72d 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 86219875bede3e19c654cf163f7455d0e81bb1c9..8852a62225191c380130da8ac2b833a3d7901224 100644 --- a/mysql-test/r/trigger.result +++ b/mysql-test/r/trigger.result @@ -2290,3 +2290,31 @@ 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; +# +# 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 b5689d31aef60628e582c8072064c807074772d1..fc287e86fbd0845f520a3fa6a06fd05e8e3937e8 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 a61c658d50ee5fae3323ff83969af29be1841fd1..067fe9b89fc4630bd672dc3f0668a501df5967f0 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/union.result b/mysql-test/r/union.result index 233e7399cd2421a84d36e134039fb8579b2c95d6..62b5e2841fb1b17ce4fe73209dd8b3b6aa3d8592 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 5fcc584035af577974f5c608b1d72c4d5a7eafc6..0a85c6dab3e93e6902e928984bfa00a6bbaf98e5 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/variables.result b/mysql-test/r/variables.result index b621fc13ee4b54b6b2e6a8f22e6f4ec8f1d72e7a..df0d16237aca9bb5a4f45ba919eba6c453346412 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 451124ace73540dd1c8e29aa627576a9cce87648..e8c96e4997779f61f6c20f76d312b02eb1d018ba 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. # ----------------------------------------------------------------- @@ -5662,6 +5554,217 @@ 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; +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/r/xa.result b/mysql-test/r/xa.result index 6c242d950abefd8c66b50e618c3d448d8ddccb06..0bf9b07bb2fdf1ec855eb36adfee11dcfe6b12d3 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 41dbc74422825f80de1e5062a68bb695f8c7f676..375b2c6282772d8f4376dbb6d3e9ccb0e6b955b5 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/std_data/binlog-header.log b/mysql-test/std_data/binlog-header.log deleted file mode 100644 index c415a57e61612b723f773414898f9dcf0871f98e..0000000000000000000000000000000000000000 Binary files a/mysql-test/std_data/binlog-header.log and /dev/null differ diff --git a/mysql-test/suite.pm b/mysql-test/suite.pm index 4d921d1b0493b53b4a31cd2bb9ac44d6f7407284..5ac3bd3e138df5f929cdd34d0510d061adec1c6a 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/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 0000000000000000000000000000000000000000..99f2a57835f97e2c5bcaca9b7cced309bf02c09c --- /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 0000000000000000000000000000000000000000..b4627caceb23626de3a8a3988dee82014ed07643 --- /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 0000000000000000000000000000000000000000..0faafa35a1b1f1a61379f0fc0e843a5db19021e9 --- /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 0000000000000000000000000000000000000000..5de549c45bb06aa2d1f88ab4c8fb071bffc38c8f --- /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/encryption/r/innodb-bad-key-change.result b/mysql-test/suite/encryption/r/innodb-bad-key-change.result index 4e4fd89d1ae519fa594966c09818eb6c04c5e553..51fc7a8cbc4a7f5f2a0b4fc6bbbcfd107f5e2707 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 94ed922a0ec48f0346d673c624c1a934bbf6af68..1ed78a9efd2aaa5742cb46b2ff9978ea4eab6e40 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 227b8cc3debc68f8d824d400bdc3a6ccd3d6b833..a491b084764f1cd3e8d26624924cc497bc4bf729 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 15c2a4109488f950fb638aa47068f712fd88dbc7..ce73b80820fbd2f092025260ef5e2045568738f2 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 06f4abab9f40b411f07d6465980e44ff8a4febe2..406460d0a2390bb4c22e22d64fb5f465d250653f 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 dd2b025553e680d641d34d7c98cf7c04b059f103..4d15098d936329172e370cf1e1d1aad72f384b96 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 3f3a2afb02d99aa2b3f6109077be5b38fe4d9cd8..7d63f47d17ee6ddaba24494c141222dcd7ce8640 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 2f2cc0259733871bc9114335c735971926c85bbd..53ca0845c254ab4c71e78d542fa04c5c0196542f 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 e12dad6d0d732d71e3c854e108e0dd7eacd4ad45..ed578d80b3a782e35f78e4dbb95d6ab2b6fff3f2 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 dcbe1f5a395a8030a667ba46b3acfe30a010424f..1ea706dbde450a297ef18cab8905cd4f41d6e748 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 0000000000000000000000000000000000000000..06f1c986a25f642ec2d6f27f28eaeccc18e4ee5e --- /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 ec92825ac8e7547944486664b09b18c40055fc0f..14933e526c4514895bf9ee81c48b524d1cb92b4f 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 d08a6e943f4c62470a11ea66914e8a829126b1b6..a2a4f25b026ef8fb1b2b6d74eb4496110198deb0 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 ab958004eaba4c74b3fb43070106ce1b6c101d9b..1c8341137b4d73ab52a7e61f8b48aeed70882e59 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 a0b7596dd5a976c4fcdd4810563a257af1099357..658b7dc291bc84f725f7c03e95794aed497c1f1a 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/debug_key_management.test b/mysql-test/suite/encryption/t/debug_key_management.test index 5001ac6a5161074986965305e7e234d05824fd9e..22b213c613573e87c161bb75829b39ff6a884384 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 175c830982cfb07c0d4c6dcd70c4175a50d6e9ae..9395f467539de6eb87d922a02caa2118b2d0cd02 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-bad-key-change.test b/mysql-test/suite/encryption/t/innodb-bad-key-change.test index 66546872c25a5c795f9348c74b5838517c106093..9d61770f543e35aa9f2e349d22f90523a172b6e1 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 52ee442c725cc6d2d629218847d39c52d69dd15d..0c312f1f449be2af355d1224b7a66c53c33a7e23 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 14d88614f55d722494c433c9af7f639679056a27..0c52bfe3fe6444df9305609e8cc1cd104c20a7e8 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 cb69f22f7450bed83f68c14d1b6cc880354240a2..4a81dae5a0f323fd2e32be73188e26a963618c1b 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 9feaacc41e51bb1fbc80900276b14f21c25bb334..54471ae3baed64a8b6fbf79cdc716481651a4493 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 38f36076c7329d19dd40153068b6b1465da31617..6ade8d6e3b28c9afee15f2af17e3fbcc285df72a 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 dd4ee51b1eb5c1dd3e0be43a8a877c028488edc8..cb6440127ccb5c69aff2000b6804c5aa6552117b 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 07a2b16211c7081a9d7ee4d01c978db046602d0f..6ea0528825b89e0ddab40b81b14185c03c391c01 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 159646541c7ea71be9bb95b5deeab7cd03495d4a..69de4f0f9213f4ccf5b0ca5139efa6351f71ab0b 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 e55e2ade15398d70e75ea00395c5b2a09e7b5a0a..68d831fcd175730315fc752e172a24fabf4c353f 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 0000000000000000000000000000000000000000..24e00a00a02213aeb743bda28cd787666e29cf0d --- /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 ea6bd65d6050e6f169ea59940da38c7743046272..fe132c0c59b487ac20f958a46069a4279c2d2c19 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.test b/mysql-test/suite/encryption/t/innodb_encryption.test index 35c2b3695a95871529cde0c422455699192cfc2e..d183a2914bdc70ce5b6b15d69ca4f2e1a5ea51d7 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/encryption/t/innodb_encryption_discard_import.test b/mysql-test/suite/encryption/t/innodb_encryption_discard_import.test index 192233a535fdbcb82238ef846763ef2bedccaf61..29c762a5d0fd614eba7f32f76cf025fb605a7121 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 8f0986071f123cfba7ad69cb567bb48221208377..60afb6033ace9d70f816412ae4ad695f6182968f 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 0000000000000000000000000000000000000000..7010d2c100db9930c45f854292761b2f47f32257 --- /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 0000000000000000000000000000000000000000..2b90f474428371ec75f5dc7fdbe32a89373cfda9 --- /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 34dcbdf5963cde049b6a9186871a15ce675a33ba..5232bcb5d12772538af246826dd5a08775c668ee 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 56ce31f5b2fdc7d57e76b0215625826113346d6f..2250dd205bdca8475be276bfc50b0d72524643c7 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/federated/net_thd_crash-12951.result b/mysql-test/suite/federated/net_thd_crash-12951.result new file mode 100644 index 0000000000000000000000000000000000000000..573ac96efff59d4885c69307cca5a0ab6cf9b520 --- /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 0000000000000000000000000000000000000000..81cd826686e6e5a720475bb0fc850ee9ae27a2ff --- /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/funcs_1/r/is_engines_archive.result b/mysql-test/suite/funcs_1/r/is_engines_archive.result index 2772992495c54bb491507271484f719fa42cebd6..52802b17acd8196d236f5931a2e5b1ea1ac87bf6 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 2a7e61ee4d3cb76453baff9e9e4ae35826e20785..7e413b9af6f28924bebd4f133ebcce044af363ac 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 8057a0266c574b39e0f7d2733fe96306b611c4ce..20926458ed00f65486232f5e9d47f9fbff8dee25 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 7e42c864187da40bac3b5e627b97667df59505ab..d307ce4be6a006011c62cff7d68cc92404e9b1f1 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 cd19fccd48305cf36acfc50d4892909b4e227eaa..397ad22dab8b684daa0aff7b532a1f3adcf2286c 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -9,48 +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 +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 f68fe5249044de14eac065cf54834d99b67506b5..0000000000000000000000000000000000000000 --- 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 d5490280ab24dc124348c3c16c82eedb0a6fef43..0000000000000000000000000000000000000000 --- 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 761a1a89fd38dfd1a1c684a1b5104ef6fb9cfc73..aeab7e6ea199f099b805634c7393abd3ff285493 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 cbd2c1c817ad07241b9ecb2aa9428f01b759814c..16af5742b9b9f80b2668badec0d2a607f667118f 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 81ba54aa6f5b2f7eddcb6388477279e1bd2e98d5..3a49f4f6ad2e84731cd55e853cfe5ef1a90e382b 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 bae37755c65f23be27fa6a00ed02dfd36ad315aa..0b96de55a32ddc324464ed74faa8de5f4e817825 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 b8dd0fda987b16692e3cfb283e7b79f1c9ee7c8a..44a1513fa6e2e1e093f723886de67c5f1225e012 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 1a65ef1bd942aa27ac8de52d980f0915cb79b55c..6c09b0ceb0c770105eb7de78a94528b06d2211a6 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 0000000000000000000000000000000000000000..0dd693f2c6399c451cb24bd4737777da0c39caed --- /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 0000000000000000000000000000000000000000..726fc6e2b1882d476b1731df40cbf0f80416ed08 --- /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 0000000000000000000000000000000000000000..0dd693f2c6399c451cb24bd4737777da0c39caed --- /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 c61bad8e19d3aa374eeebaf1930b33aa1dce44bc..d7f665df6c750c610c19f7125bf70cd96901b23e 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 4ee3d17810cbb15e8f6b01efbfea0300e714981b..57af9203d0f6bec76511d56c8c82bdc3daa7fd83 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 9d1c3e5660d826d08888107e7f1551fae43ab253..c9c0069889b636958567941660a111c57a1eb486 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 a79ba598d69a158fdd4a9685e99b0b638bff1a49..4666d131c7dddb7f57428c90df27a014e644bae9 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 9bdb61c1a9c93513498c8dc905480bfc7c2fb468..34874198c6f925facae0c0ec797b3a82fbba0ef7 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-388.result b/mysql-test/suite/galera/r/MW-388.result index 17d347a11fb707769f68ea91b3dc420a338f80cd..59d4d4a2bf3e9466971fabb279a383fa899f8765 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/MW-416.result b/mysql-test/suite/galera/r/MW-416.result new file mode 100644 index 0000000000000000000000000000000000000000..05399b213a83794f64b2bf549e8351cb4b1d2ecc --- /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 28a6f1ac8dd23c0d1f0584d33daa9cc3f29e54d3..459a61030a4868b7e9adece18936d792f8870630 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 0000000000000000000000000000000000000000..6a07d0359a46df2ea03ae73e8d7a20d18add9113 --- /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 e96d39aea0cbbceb5d29b59de51557e80ba11908..06de9ccf016b35728dab2efff6b7e8cccb201ce9 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 3978a3df193f811481531e9814f561a386c66569..2367924466c4d0737dedb3e86be658eed01ef647 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_bf_lock_wait.result b/mysql-test/suite/galera/r/galera_bf_lock_wait.result new file mode 100644 index 0000000000000000000000000000000000000000..4e6019ec8ade52be84fc6e92a138d698a3d68f62 --- /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/galera_defaults.result b/mysql-test/suite/galera/r/galera_defaults.result index 28c3f4dd1044585c209ecc32fe79118f081c2549..5c5fdabf432d3fe966f6691e767ecfd5d3832892 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 0000000000000000000000000000000000000000..63f6c281af14a65bfe998524278150caf2afeec7 --- /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 9f5cbdd75fccfcf57a73b4a5a71d667e9f8603d0..a5b87c0ef0c799cf3c3b8c60d0447f4f8df47454 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 new file mode 100644 index 0000000000000000000000000000000000000000..58a9d3f5971824101ce523a1f70f3861076a1f44 --- /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; +STOP SLAVE; +RESET SLAVE ALL; +reset master; +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 0000000000000000000000000000000000000000..81fae57d73117acb708b89f4f9349cc1b0a78d5c --- /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/r/galera_ist_mysqldump.result b/mysql-test/suite/galera/r/galera_ist_mysqldump.result index 788d60051b54a1ce3ebea01c2835d82b1123aeaa..a7ce7c6c23e5b89d246e5acd7832f89a144a3b7d 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 db3c75e288634745cec918909b7a2d8d13990a38..cdcebdb4eeea281d8b29cd986490f46d3e782ca5 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 16e9037a4de77d05c62df2f2e1920e54c018dd7d..0d40ac1656545509b47732bc50da2617dc3e24e1 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 0000000000000000000000000000000000000000..677ed98202d4be034ae40aca36e31a8149366714 --- /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 3b10815c63d295cf57395e382b363719527842c6..0b19ef7da8f6c8c2e94c01e87b4b4b6ef6b21788 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 0000000000000000000000000000000000000000..edf20da92c63e4afc90bd1f6a948fa41e239b695 --- /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 0000000000000000000000000000000000000000..efedb1b469a9a6562155d204ce41173155c13219 --- /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 0000000000000000000000000000000000000000..cec0f21ee22ae6c29957854a1aee7dc0d7da8cfc --- /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 0000000000000000000000000000000000000000..a7ed54af860e8fe0bee1c9859105e9d2eced9ffa --- /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 5c0d9a45d41fab3920282409b81f0287a9004a6a..2369c1d6d735098651259c7fa070c1ffba76a7e8 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 227e1c15444ec5a16d41f5a32874ffb41364b39a..074481afc2d265391f4f5230b808b659f0be6fbf 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 0000000000000000000000000000000000000000..323a0a92a35f5bae00c8c0bf5f3c0fd2827119e5 --- /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 df2d9190a4b56060e16164b87e238aea74342923..cec0f21ee22ae6c29957854a1aee7dc0d7da8cfc 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 0000000000000000000000000000000000000000..2692482f44801ecfff7ed70bc209f17fdb7c4e54 --- /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 df2d9190a4b56060e16164b87e238aea74342923..cec0f21ee22ae6c29957854a1aee7dc0d7da8cfc 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 357a0d4f78e7a6e7e3e8cb9d1e2b4364bc344214..ebddb4c449d890f900c4d123365779ae8eae373f 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 81781fbeae7b107d512a6686dfb8780b0284347b..1726bb6445f0691c8570bcf9fde5763e0b2c5838 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 c1bb065975bbde9f8e10d49a1d4f04940954920e..b9b00cfe1ac00c32ddeab7038c452abea99b1114 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 7c56e22eca2fafac5e7a639c821c81a943e8c421..8245cdf609363a88ebac04ec3a0cdf2a0852da4c 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 f141b332b6cfbabc5541c51c026211edf8ac0e6a..5a108ddfcaa7c1c778b53dfb4e345bf7de516f16 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 cf36e964f9397983dfb044a437be0d68269a2d2f..a9c900d8bc8c78614dd7e6dee601eaffef2453d3 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 0000000000000000000000000000000000000000..5958e6ae981e21d36f4ac0804b6259c2c9694f5c --- /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 f4d17ad9a419e8e28d2a7a2e5953abde1de7a670..22a3105a588b958e941da18314fa7f000be176a2 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 2340d25d160302cbab10666076854b01b258ca2b..70f3b8ee25707ecf50a5fddead29653f02866628 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 06fc27ae7ed8e7aceac1590a7209b83ba3493ded..5bde4874809603f5b6f0c70eea69766c1954b461 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 0000000000000000000000000000000000000000..c55610fd049fb102be25f8b965acff0934f5d90e --- /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 3b8aee61ed2a21002137adcf522758071e47110c..0c91e10acd7ed7ae176bc0702620d9187c4bca2c 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 4617d5952bbd7cde11b1ade84ee68b8e39c4714b..ec6c4a6e6f49eede5367e373522e3502da0bbcf4 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 fc647a2000daf7f3b9451f73abf961ca520b3ac0..3e8cfdb42d3430588bb86b627cdb8ea7488737a7 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 da57b9d00684ee936cebd9525524619e9a2ca98b..7ecaff7707e7bffc29176f0a889a891eebb59256 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 f5c0fabcd6e0aceaef92f87622936e4258bef4bb..1822201f3381a7f2f1ad9c8161672fc24bf2f4fe 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/r/sql_log_bin.result b/mysql-test/suite/galera/r/sql_log_bin.result index 237725ec9a7c69712900ec59bdba7eb60bcd7dde..a2ebafe5231bb8937ae780d65e0a2b2f4be6e1e9 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/suite.pm b/mysql-test/suite/galera/suite.pm index 361743f1243b4ee6f606ac167031515ad12501c7..5cdb751a43479abb457c5b20407f816c3e327bd2 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 7add82f122796eb5a6f9d33f519df189e64c7e53..5e17baa1bdb2a7fef8e532a89d377ffc7590e7d7 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 08deb317fbe5fbaffcfbfb2f340cea9a286ec1a5..1b2e322f078f8e7e38ec21b942d557d6d5e74f4d 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 d9f9a787442507b4957f72471c25dad955677d49..bf045832113f661e353dfd714b6036ecd8d7d05b 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 79d8951a822cd030c719a5fe8383ec30ac129038..9572489ebe985c9db89ee47e7fa3283e07039942 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 0000000000000000000000000000000000000000..df4fa35abc781fa479b839214e0194e86229d1c1 --- /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 55a3fd57f80232740a7724b72f7e3d39c4edacaa..09f444fdff43c42b5ad065e3c876d766e6080445 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 0000000000000000000000000000000000000000..3c8490b690770c783f521e46357fcb69d890ae1f --- /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 93f9224b2589a106278c41f82973d8687b2a0359..49f3c99325681ed7b405de8e2faeef71f43b74af 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 30ce9bc4ceb45e6087fdcc55984021bc202315da..cd7621bfa6ec48640b6334d204c38ee1ca5d9ea0 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 24c29778e5d28ea3d1fd9e7ba55be22fc9ed27f9..13e48f8f3cecc2726f85b19da8724579c0254dab 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_bf_lock_wait.test b/mysql-test/suite/galera/t/galera_bf_lock_wait.test new file mode 100644 index 0000000000000000000000000000000000000000..e3a9077a8888d39e114fbe4411830e4fc3c36b7b --- /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/galera_concurrent_ctas.test b/mysql-test/suite/galera/t/galera_concurrent_ctas.test index f0dcf8e49008544d56e4179075917bedfabae52c..6c4e8be68a79fbdcf9651923e32c00ee593e3366 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 32fc24097d26b34f997033c66e0829dda1024f55..facc5180f2f7509d966117327145b98e76ce0a0c 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 0000000000000000000000000000000000000000..0f7f80b7d0bf11d84e7b38bb8279d4dc0bfe673c --- /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 0000000000000000000000000000000000000000..c42c3dbd98af8ffbb51d9004fda9beb0b28f514f --- /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 5a1fb6748d95584b4a9aedb0a24a1493dad83373..a084db15c5dd4dfc64f7d481472c27d2cbcb1e26 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 768f4ea4f1b9a4f2389dc10cf57ff4af4d584eb6..24acd9ec4ffa4054329bd0763ba2dd3fd8c76d48 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 3bfcdc9f117ac15a7e30233b36b646f10e1bf6b5..08165f30f7d3d7812c13ec51c709340ccd0bc51d 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 ae1e0d8bab0726e5944692fa4521854eb7597526..80d3a5cb6598474c20d27e9f30dd270684f0712c 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 5329dc245461db2c239cbfa71f84426684ef4013..8b5aaaae5bd8f39c35e4b07efc34424c3c03ee09 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.cnf b/mysql-test/suite/galera/t/galera_gtid_slave.cnf new file mode 100644 index 0000000000000000000000000000000000000000..409d0d1609a33873ad2226d2adb5ab0890df6d89 --- /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 0000000000000000000000000000000000000000..19bfd8e17dbb516990c0f07c640ae6cc50ec7bf8 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_gtid_slave.test @@ -0,0 +1,79 @@ +# +# 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 + +--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; + +--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; + +--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; + +--connection node_1 +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 0000000000000000000000000000000000000000..bb9c8e84f1bf5030de25b9e213c616bbbf3192f1 --- /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 0000000000000000000000000000000000000000..3fe94ad16b7cb5f36e12518285e68a574b13126c --- /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/t/galera_ist_mysqldump.test b/mysql-test/suite/galera/t/galera_ist_mysqldump.test index a9ff8c41f0641fa3b67331a8df1a707063293d35..f60d5549edaf6cd1613e6d69f0d45be969bd898e 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 8b399e77794c058fa2e4a932bfd6cac0a2d6d7e2..c44b064234252cd5db5ebe6566a16e5b7f94896b 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 1903df449e43135b660f5abee3a6359be61510d0..4106378885fa60fbe5980130b0e2d4c4c7202a56 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 bd581842f6fa076b7988e7da9cc878d0928cfcc6..2745bfe5faf87a1cea19aca72b55f3869c077456 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 551307b123f5844814c2665fd927a57584e45af1..73c5fc1622c739e02ba6da9d00864a84e5cca52a 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 0000000000000000000000000000000000000000..b6f601c56b1fe0205202573c132f3912fd318e51 --- /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 0000000000000000000000000000000000000000..d32d7e7526282873a7a56cdb15db77d1927df8c6 --- /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 41cd0c8e6fae783fb84855a80659d05ae9a48b01..2cd840123cff43eccebeb21d22c1016f9ca65572 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 84fd3a9185707bfeec526dceaf192466c530c4a2..f24ca5cd25b7b115f4726f1e8c26cc84c28bee5c 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 0000000000000000000000000000000000000000..93e24244611c931802e75fba4f1ff9da02c7b71d --- /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 0000000000000000000000000000000000000000..336296e9bfed5394367e3adecd5cc89788788142 --- /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 0000000000000000000000000000000000000000..bcb9ade3a25a27a364195449210cec08f023ba0d --- /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 0b7171597dd8a4862ab2323b802b86683a9b4a03..835fac94a683cfb393db3259cb5da17656abaa73 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 e108484b24865093f042a6679993b43bfefa25c8..44e5573b3e6d16cadbe1f5f1a026bb97111acb81 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 c813e04169f994be8a0378c7a6090e9defb076be..0dbc63b531c44ff3ebb7b854a0a2b7e1b3952544 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 c6823795e59d0c382ef7ddf767a12184efa4bef8..5c08707e87038c569865fd385248f0ed212d3001 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 31bd1af07c21f7e8ea25c2033406b818e0d77cf8..3abf2549aaed597691080c2a0ef844be0250476b 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 4573f176482d214127ee47cf3a880b9a87ce4290..db2b706b6b856beaba5d9d49a8638cbb1951086b 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 47cb3e0229220e1504c4452191a8e64b8c009fbb..0025b259ec52614d5defdeb4219a060b7c6257fe 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 aac6822170a862a084b330b80be2ad486fe9f037..c270e4d0b1947174c1e5393b5db90156fb620c3d 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 969516f5f3b26f2a65d0a6c833b314e14f75ce13..63d05104a37fcc45b0bf5029fa30c7cc6d84c085 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 24d9589d111b838648cd6275bc88f4dd5292db18..2f685ca7184f4eba42278bb1993e08ed93a2a0fd 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 aa4543cf81caf76bb85a480e103e6492d7d5f674..6f0f8014397ed29b0d31c5213ad0f8faef70a96a 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 1f44693877512abce2955e441afec645fecb8563..9f161afc52ef026385320dc84d4ffed7a59da566 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 821f7a6eb2cc13abe48e86d14f07f2af65d89697..dbd2510cba3cba75b09dc45d0885b1b0af6bc5c1 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 0000000000000000000000000000000000000000..0a03610888cbf0e8f202d633cefe6a4a4f38b46a --- /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 d65a35be4d132d0026c2cf3bd41931c17ed618f7..ee31be94edd7edbaae6eae13395f9372e924299c 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 03706bbbb120c789c352781d99094ba9a4dfea11..6d99d35cdac2418115e738457b078466b8a7a34c 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 cba8488b8791087901a86b8305468486a15291af..1f01c4aac07232476d169c8a1d5dc3e6b3d557ab 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 3353652d8b9471b0be02d97d33976391a6a6f32e..22e98e3aa82baba7fd1908dab38084427816e9b9 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 0000000000000000000000000000000000000000..6859855c35f1e650db3c8dac739e4532d31713b1 --- /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 bf4da3234c54aa8e341b9dfa4a3e6135fd136fef..142f02546b4853f3313dc68aa531c035de123b66 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 5e56800c5d6a3f8c8e941b9b846df4028b952b4f..0afda948ed51ab13cb8d1a2367e796c4c536084a 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 3c7988a4924e52c07d7617a0930eb150554f0d1d..ecf255f59c3ad40fa16533b75da8924c26ac087d 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 360681d7674fd79bce10097733d315e47e8352ab..c570dd7d14331ad7cd415cacdd84524cfc184254 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 769bb665c7766f1fac8491afe39c22b2d99a7ec8..7daa544686fb435a918efef9d4743dcfcc36e432 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 acc7c735849710ac2a08964a94a27b4547234653..351e457f16504f7f35b79d3047f0cddcf15ee329 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 5af86fb28722992026f72d8f85d9e2cd6ae50462..11ef64165263708b918189749b0adafc0610a304 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 381f9bb44947866a7a7c338ce61070da22d0ccdf..33a2b157f18a4fa63a918fdc2a32e720683370c3 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/t/sql_log_bin.test b/mysql-test/suite/galera/t/sql_log_bin.test index 615bc4c30afd7250b1e877d5dbe68cd1fabdfa62..9f8f7c844865903af73068de12515bbedd5c1c7a 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/galera_3nodes/galera_2x3nodes.cnf b/mysql-test/suite/galera_3nodes/galera_2x3nodes.cnf new file mode 100644 index 0000000000000000000000000000000000000000..3f39b82f7b78d6406208abafc40d1c21803633b7 --- /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 0000000000000000000000000000000000000000..560cad03350f626f67fe1fef59a15324e11a74b3 --- /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_evs_suspect_timeout.result b/mysql-test/suite/galera_3nodes/r/galera_evs_suspect_timeout.result index 1464222a079c40cc680ad2ee74634e20b003ce2f..7e0d282ec7ff266adda5489ea5ef5f4236c87867 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/r/galera_gtid_2_cluster.result b/mysql-test/suite/galera_3nodes/r/galera_gtid_2_cluster.result new file mode 100644 index 0000000000000000000000000000000000000000..35ca84119e74ca78283e9e286ce332fed9dab835 --- /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_evs_suspect_timeout.test b/mysql-test/suite/galera_3nodes/t/galera_evs_suspect_timeout.test index a87f19ac94ebde02e6aa2c5e89be7482fade7c28..03236a3cb9366aab2c39bd279e534e8b6efb8761 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_gtid_2_cluster.cnf b/mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.cnf new file mode 100644 index 0000000000000000000000000000000000000000..dc5535ef34ab2050c8e69d2879d1446a9cae8e92 --- /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 0000000000000000000000000000000000000000..c679db1305dee78e5272da49892c4ec9c0d652f0 --- /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 a6660bd08d1646c5d963671228939d5214c6dd96..cc3f42c7290f849a8f77ce5c39e8c707d275e058 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_pc_weight.test b/mysql-test/suite/galera_3nodes/t/galera_pc_weight.test index c118b7481bca2a3714afc6bf4dc29bd4ae3a9d83..d69881aa5ebfb4ab20a1f282b578b7b2af0f9a25 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/galera_3nodes/t/galera_safe_to_bootstrap.test b/mysql-test/suite/galera_3nodes/t/galera_safe_to_bootstrap.test index 7c9991e68c445d7b0c6cb1a1cb86c77a4211d86b..88d0cfba4f4753e2f08b37aef312e32a86223d35 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/handler/handler.inc b/mysql-test/suite/handler/handler.inc index c71dc53e5accc9cfd82409d9b1411e78e6212edd..25c72965c0be1163a726fa8254059c65cddcf4ee 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 89dec29f412ba0b4728f1dad67ca1b8f7134b66f..c9cffba33f723b1e0cb10043a7bc68745b8b99e5 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 2ef617c3ce7f2e5b4735bbccefae2f7b87968ada..06797ed69806a94cf58b9baa033dac449138b755 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 0000000000000000000000000000000000000000..54685f9156b8f0ac5f4ab40ef721ccff16e5349d --- /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 0000000000000000000000000000000000000000..68091190c85948fa940cffe004733b95b51c3255 --- /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 0000000000000000000000000000000000000000..4bce2f8676fa0787d01d2233e1b708c8245f12da --- /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 99f6efe9bfe0cd139873b021289a659e8611bfb7..9d266c68af335d361e94e0d0c7b7d22b0293220a 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 0000000000000000000000000000000000000000..1f4f78ee67000ab3963a65777caca14984a5fbf8 --- /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 0000000000000000000000000000000000000000..6ba83f04136b7fe1da00beb7fb042c0fbc663681 --- /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 0000000000000000000000000000000000000000..bb23b78213b712a404f4285aa1b0f52a183f2f3c --- /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 0000000000000000000000000000000000000000..35aa402edd9a0ef741172e0ce201e57b101a0ca1 --- /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 0000000000000000000000000000000000000000..4e90922d70db91a9f32092fb6af3e6d2ab861739 --- /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 0000000000000000000000000000000000000000..981188f00f7feeca4a5ec896ebb5ef148667f841 --- /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 e9711b2ac31bd5e590e68f5c2df30c3776071d3e..2769bfdf1f56045783143ce742601250a3308a60 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 fadbcce332ad687e96833257587dab7bf295fa9a..d41df53e5a7fae4d6e15e1e938561e08ae69b449 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-autoinc.result b/mysql-test/suite/innodb/r/innodb-autoinc.result index ddca4685e05fe8055018bd0332b506f7811d85f8..7d50ed00a92811c6f2d7450eb4de53e75c68f492 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-blob.result b/mysql-test/suite/innodb/r/innodb-blob.result index eca779724001c72efba34289ae807bdce5a6d6d0..5d2101d8eeb790c03cac9284724b24c430936d7b 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-index-debug.result b/mysql-test/suite/innodb/r/innodb-index-debug.result index d78ba68078d72d7a2be17b3dc1abfc9b6e9ea566..69dd8742b5ba983681666fe437782f76de45dcca 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-index-online.result b/mysql-test/suite/innodb/r/innodb-index-online.result index d6941770cd3fb601aaac7cc23336956b33a44d5c..efbc5c14e61de142cee72feddeb1a7f07c7da872 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 0000000000000000000000000000000000000000..dba01945de3062233930a192a695414a7d225ac1 --- /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-page_compression_default.result b/mysql-test/suite/innodb/r/innodb-page_compression_default.result index 18f7fb5e04a89b34439220c9184a26ca15e45272..19d0a875ce6cdbdfaf7d917670a7ea00b5874746 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 74cfa9bce3a0f7c308933f19580efd99f2451b64..824b671eea3150060604c348eeb89238937f6d88 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-replace-debug.result b/mysql-test/suite/innodb/r/innodb-replace-debug.result new file mode 100644 index 0000000000000000000000000000000000000000..989fb055cbc32b5fc84447d93a3e887058822324 --- /dev/null +++ b/mysql-test/suite/innodb/r/innodb-replace-debug.result @@ -0,0 +1,14 @@ +# +# 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 @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 = @old_dbug; diff --git a/mysql-test/suite/innodb/r/innodb.result b/mysql-test/suite/innodb/r/innodb.result index d50b9b36a4f03ee7973ca5fa939ff588d0b53761..3255b61d422718d269f8434bf62c6381de70990b 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_bug27216817.result b/mysql-test/suite/innodb/r/innodb_bug27216817.result new file mode 100644 index 0000000000000000000000000000000000000000..0210ced9f9111865cfb8bd6e02d3ab44e2b8877d --- /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 7d6133adb74e8485934685c4d83ac9170448ac1f..29b0127f20b9221e028c5850e13619de4d87153c 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_corrupt_bit.result b/mysql-test/suite/innodb/r/innodb_corrupt_bit.result index 0ef6f65d0ff7dbb474d58c093ad9b0ed6530ac81..b3392c1a3c442d4ace3e76c93b460315fe00484d 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/r/innodb_defragment_small.result b/mysql-test/suite/innodb/r/innodb_defragment_small.result index 3f594f79e70281c5af83836d7ba2ba30e398611d..07e58f442d990de145c7e1ec0b399fc7393f22e8 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 0000000000000000000000000000000000000000..d949ac945de5f8ec21ca57173adeb16d9240b2d0 --- /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 0000000000000000000000000000000000000000..6bbabc8d87a01b715f4653407eeed1112647f50b --- /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 0000000000000000000000000000000000000000..593bcae40eed6d833198950e60551c05f0f89b83 --- /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 new file mode 100644 index 0000000000000000000000000000000000000000..47398c1ca230e48e4b707c39ce0f98846e55315b --- /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; +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 0000000000000000000000000000000000000000..49ce32540913cb99e616c0ff788dd36aa9630c57 --- /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 0000000000000000000000000000000000000000..5ebd6753e8a466ab42164b47c0616a3b16f95eb9 --- /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 0000000000000000000000000000000000000000..f0883802cd66fc6be86c5b248378481a99c75a10 --- /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 0000000000000000000000000000000000000000..03e6ec38060d6f2e48a002fd8d795bd655530ab4 --- /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 0000000000000000000000000000000000000000..0f433b1fcfe2bdb150772b14e331f8d167f151be --- /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 0000000000000000000000000000000000000000..e0981abf7ebdaed21b134c1e40759fb9d386b244 --- /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 0000000000000000000000000000000000000000..202ecee6d48bcb3b569b3a719acaf1e017fdd1a1 --- /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 0000000000000000000000000000000000000000..c16ca068e467de8d17d3942e08e28b1449f38796 --- /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 bb5cdee000ad1d5ec70688004fe6a9856f20cec6..d039459f91f0d195a3b07a2a707b48717ba5bcbd 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 af75482703cf610ab02e039f82112ac349ed1605..0d3cc6f1733690eb824a86899e95d7765f8f1b23 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-autoinc.test b/mysql-test/suite/innodb/t/innodb-autoinc.test index dd4c4ae8603a60a4ea754c1c605cf92c3682f7dc..75b2e8984d9cdb56c84b5b0c0c7c5b309772cc66 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-blob.test b/mysql-test/suite/innodb/t/innodb-blob.test index 775d52c9ce84a134334394706e3dd27a03ef3e8b..17fd194dbebfac70dd26c2fa528c6492509bacbe 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-index-debug.test b/mysql-test/suite/innodb/t/innodb-index-debug.test index d4fcda4f160e6ad8bc01e0c85e09f42549be54b6..e179b969a6a8c297458badfd4f7aaf5c13175ea5 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-index-online.test b/mysql-test/suite/innodb/t/innodb-index-online.test index 5509d985edcaf40e14a9f11eb3cf16906c745df4..efe1c796cf11472b16048b4c46a073612d2a86d0 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 0000000000000000000000000000000000000000..fe04f4b770509a97051929e424a0ebe40362e6d9 --- /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 5266978e4f0a7ae26531d87bf8c67fa6b2c0b491..2e71d62206dbda60d2a0fed283d8b138d34bf027 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-mdev7046.test b/mysql-test/suite/innodb/t/innodb-mdev7046.test index b4085228e0208f6052618e80a2d9634924ab7fe6..85a257a173912f80e5eecadf66baeb2361d0d7b1 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 1cc6c917548bf8cc981165885c781aaf19abce43..34b1829485e7e92e0fd8832764d1d74cbeeed063 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 532ec294d28d5d150c21cab5b3facbb21a45cacd..0186c24ef2e38672e18109d9d5951854d2c56d09 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-replace-debug.test b/mysql-test/suite/innodb/t/innodb-replace-debug.test new file mode 100644 index 0000000000000000000000000000000000000000..7e710ae154cdf24fdbf79100f5e2f4d8f2dc230c --- /dev/null +++ b/mysql-test/suite/innodb/t/innodb-replace-debug.test @@ -0,0 +1,16 @@ +--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 @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 = @old_dbug; diff --git a/mysql-test/suite/innodb/t/innodb.test b/mysql-test/suite/innodb/t/innodb.test index 2e7306c8e29a5cf4f1800c578eb7985babee8fe0..087d0c6a7dc6f7b8500ee0dc9bc944ee85e3899f 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_bug54044.test b/mysql-test/suite/innodb/t/innodb_bug54044.test index 61a09375ae174e1eaa123369e9ada87b684a089d..cfc6f3c3f0a9bd8259c947a575222e920328253e 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_corrupt_bit.test b/mysql-test/suite/innodb/t/innodb_corrupt_bit.test index ee04e8d66fcf77f88359e4bc7c1cc852640258fe..86b604b4a6af3526380cf00894b152a24e45765b 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/innodb_defragment_small.test b/mysql-test/suite/innodb/t/innodb_defragment_small.test index 454333d698608bb0649a7740feed9935cab563b1..c52a58fc5a7c120ffd9173c6709c063d2f3eebb6 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 0000000000000000000000000000000000000000..8dbad90d3541cea8c7d4f2757685880bd7cc5964 --- /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 9cc7742f6a8a4db0ebab961b5a2a7813b7e29d29..061bf35ccef71f93e16e847dc4c95ec2495336df 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 0000000000000000000000000000000000000000..bf76a5de7980662a92efbedb392c32a32fd21805 --- /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 0000000000000000000000000000000000000000..402cbeba1b97e9e51020cbdfa23d4dc71746c0fc --- /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 new file mode 100644 index 0000000000000000000000000000000000000000..42d98ca34c705ca1ec96449442c5bf06ae18b965 --- /dev/null +++ b/mysql-test/suite/innodb/t/recovery_shutdown.test @@ -0,0 +1,61 @@ +--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; + +FLUSH TABLES; + +--let $shutdown_timeout=0 +--source include/restart_mysqld.inc +--let $shutdown_timeout=60 +--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/rename_table.test b/mysql-test/suite/innodb/t/rename_table.test new file mode 100644 index 0000000000000000000000000000000000000000..695c0915d147e375e2ca3eed1474fee60ca30475 --- /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 0000000000000000000000000000000000000000..242a03400ff8963674c8226ba0f90cd8672bbc24 --- /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/t/table_definition_cache_debug.opt b/mysql-test/suite/innodb/t/table_definition_cache_debug.opt index 6195e055dc86748c7f0403025358743f38389737..c2db7e1df6ecef83825705cc0c0351dfbf9d42a1 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=30 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 fe767476fe6b4956834a304d075947cb25ce3ad2..ae23b93dc847e138f570cebe423313e5ee13c680 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 095713130f10be19cd22d5cd5548b41302296af6..58f36be08a52a61a989c35dc11d6768b72a7b8c5 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 fe3d799229d5de7af4dc5e9502a99efa511e945a..e961d0ca7d097e4193df18877c11f937d3dfff2a 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 584a8a5d647001bcaf2069f32da2b5ab78cf2a8b..2695df641876c0d819c45ddc4caaf8ed87730920 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 53d739feccbb847be255b394704d07dcd18c1c3d..282b588c841d0c0ddf76fe524c51b9134996f48e 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 e8ba98f14ce724d6456cb5de136510bb5f35fe1e..e9bac78f99edb449aaf354cb9734224ef5df98d0 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 1a7daf5a1ee148804924ccb02f598b0e6fe3d0b9..c63688dddd646e950dc80ebeb4de35dba78bd1a2 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 abca48656887d4e8afa77517ed7de504705e0b37..09672cdfa3b2f857fecf6bec015ad298499ce404 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 0000000000000000000000000000000000000000..1e87010e9cafaa71595d5705c2c790dcd2edf252 --- /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 0000000000000000000000000000000000000000..f8a1e98cd41b6e47f9fa7cfa9f71ed72a7be64a0 --- /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 52e83eb111db45b3b59b733bc1d8a95aa7c48fd0..1c9d6b18100c9f69e0c75dd4bb5db21de10e7a75 100644 --- a/mysql-test/suite/maria/lock.result +++ b/mysql-test/suite/maria/lock.result @@ -30,3 +30,82 @@ 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; +# +# 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 5b6d17069e7c43622efd93d08a6c1b952d3856fa..4f3d4e8065ec688e11bd129250ff1209e6d9d936 100644 --- a/mysql-test/suite/maria/lock.test +++ b/mysql-test/suite/maria/lock.test @@ -50,3 +50,70 @@ 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; + +--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 ddafea1478c1cf5d13085898249a592773f145c2..f4d7f3d32c6a5257e8b2abfcc74472f584d4a882 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 # @@ -2760,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 720e7d2ed5de8774bb7b987a759960b6d482cf96..17dfb803328bdba95180a86eb98c595b67fcc8b8 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 @@ -2013,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/maria/repair.result b/mysql-test/suite/maria/repair.result new file mode 100644 index 0000000000000000000000000000000000000000..6bb9e1b5b9ebb6f7a2a435fef67ddf9f4933bdb9 --- /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 0000000000000000000000000000000000000000..2f713950d3eca3dc21cf29119897a6dd000db96d --- /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/absolute_ibdata_paths.opt b/mysql-test/suite/mariabackup/absolute_ibdata_paths.opt new file mode 100644 index 0000000000000000000000000000000000000000..52b6b743ac81073c6c9ef25950f304995f918ed9 --- /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 0000000000000000000000000000000000000000..fe211e71f2f4a7ac3e2fd3aa57f6d9ac234cb21a --- /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 0000000000000000000000000000000000000000..6717f16d1999f701ce411c59e5f7094c941b0689 --- /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/apply-log-only-incr.result b/mysql-test/suite/mariabackup/apply-log-only-incr.result index 2baed8c1db94c2d51a0b755a1186480e34920da6..f724d1d1fdc58cc6264e369201847375e3466092 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 aa5110cc51e31faab241f25f365fa4007ae23623..81c91d3c4526899219038a6acc68e87f86a3daa2 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/backup_ssl.result b/mysql-test/suite/mariabackup/backup_ssl.result new file mode 100644 index 0000000000000000000000000000000000000000..6e59da6d43a2551be92592b56666d4aac811b6c4 --- /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 0000000000000000000000000000000000000000..e858c834d297cb32da7f322e287da59daefeeee3 --- /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/huge_lsn.opt b/mysql-test/suite/mariabackup/huge_lsn.opt new file mode 100644 index 0000000000000000000000000000000000000000..74a6450a1ef4e8b29e3b51790c374d445a8d7254 --- /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 0000000000000000000000000000000000000000..f2202c20968f01e88e252e499a7e815afd14038b --- /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 0000000000000000000000000000000000000000..baf577769c051e099fe89711c678137e5130bc78 --- /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/mdev-14447.opt b/mysql-test/suite/mariabackup/mdev-14447.opt new file mode 100644 index 0000000000000000000000000000000000000000..5ac67e950c46d18ce417b514c0b1445c9f15da54 --- /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 0000000000000000000000000000000000000000..3bca7eb570106f980b3b5c99a52d9cbb221c41fa --- /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 0000000000000000000000000000000000000000..48f376462314a383d7e8a99cc66bae1f94a40d6c --- /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/mariabackup/missing_ibd.result b/mysql-test/suite/mariabackup/missing_ibd.result new file mode 100644 index 0000000000000000000000000000000000000000..53989be7c1493f350c6bdabe28d694efba1ac5cd --- /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 0000000000000000000000000000000000000000..53ce397fd5e88d34385cae6faa94703c3813437a --- /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/mariabackup/undo_space_id.opt b/mysql-test/suite/mariabackup/undo_space_id.opt new file mode 100644 index 0000000000000000000000000000000000000000..01b1d91e820c79c796a2db5bf9d8d7eff469af0b --- /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 0000000000000000000000000000000000000000..96d3e2a58f4104513672524fdb76a3c79ab33def --- /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 0000000000000000000000000000000000000000..8adeb18e5a754a973467f2fa5096890e58131a94 --- /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 new file mode 100644 index 0000000000000000000000000000000000000000..ac69169a9caa6539f93864e101c307ae475b486d --- /dev/null +++ b/mysql-test/suite/parts/inc/part_alter_values.inc @@ -0,0 +1,47 @@ +--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; + +# +# 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 6424ba282977aa8b181f5e24455d324f8808da3a..5a223cf65fc638a0bea10cdec60665e025af5645 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 new file mode 100644 index 0000000000000000000000000000000000000000..87c113a2720bd4f52b5e6216f062ef7825ec8112 --- /dev/null +++ b/mysql-test/suite/parts/r/partition_alter_innodb.result @@ -0,0 +1,55 @@ +# +# 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; +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 6343566e408d0f461b58b5ed984f9bb0070ec4ad..5f1f882d2eadd5d18d370d936bd2cf039698ecbc 100644 --- a/mysql-test/suite/parts/r/partition_alter_maria.result +++ b/mysql-test/suite/parts/r/partition_alter_maria.result @@ -16,3 +16,62 @@ 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 +# +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; +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 new file mode 100644 index 0000000000000000000000000000000000000000..4098ebba473f0c19263c4ba7757e2ad3d6e329cc --- /dev/null +++ b/mysql-test/suite/parts/r/partition_alter_myisam.result @@ -0,0 +1,63 @@ +# +# 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; +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' + 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/r/partition_basic_symlink_innodb.result b/mysql-test/suite/parts/r/partition_basic_symlink_innodb.result index d7a77e5e54aaacb4c5f1cb8eefaac6cdac82ddde..405511543bf5b4feb1dc059e47da1f549c838b40 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_innodb.test b/mysql-test/suite/parts/t/partition_alter_innodb.test new file mode 100644 index 0000000000000000000000000000000000000000..451bec05adcc104aacc9899a39edc017be927b9b --- /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 db249591158b11dbf03a292cc329f226a229d03f..e0b9256391d4fd24c5644d7f0f2ca7ea1952d51d 100644 --- a/mysql-test/suite/parts/t/partition_alter_maria.test +++ b/mysql-test/suite/parts/t/partition_alter_maria.test @@ -16,3 +16,13 @@ select * from t1; 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 new file mode 100644 index 0000000000000000000000000000000000000000..7e984921c1c2822d5a56ae94207375f5ccd728ab --- /dev/null +++ b/mysql-test/suite/parts/t/partition_alter_myisam.test @@ -0,0 +1,23 @@ +--source include/have_partition.inc +--source include/have_symlink.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/parts/t/partition_basic_symlink_innodb.test b/mysql-test/suite/parts/t/partition_basic_symlink_innodb.test index 35dc2d5e004d304778d995d8b95ada0146a0fb98..31448c7a9fe9efa06b2fec5a637948064d027bcc 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 31e4bc9f8437078c0b0291def8d7eb1a31bad14a..69e1ddb29f576036cdd05d711e0503e5c9874774 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 4416b78d0093e0d0cbeb8dc3b2f09d74c9ea5c10..56eb6fe6ac65cee881d4d9cfc1686812e1146f3f 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/misc.result b/mysql-test/suite/perfschema/r/misc.result index 2adf2cba8512573df5a9cee3c59ced60d69cd4da..7a097a275763de3524f3dbc227d1b7ff4c51980b 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/partition.result b/mysql-test/suite/perfschema/r/partition.result new file mode 100644 index 0000000000000000000000000000000000000000..9bc624268bb40eebf6bc10053c415806c4194639 --- /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/r/start_server_low_digest.result b/mysql-test/suite/perfschema/r/start_server_low_digest.result index 8cc92f21964ff430cbdc0d81521d13d3804ffe37..6fc41fbb7155040ae937eb5cc2945bb8d0bf038f 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/hostcache_ipv4_max_con.test b/mysql-test/suite/perfschema/t/hostcache_ipv4_max_con.test index 3bf5ef3b68de4a00f2f7791a46b4d8c62a212781..a76e04ea35e7d0a0e52cb7ae3d610958d827ccc9 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 0ced79544a30e0ee8938b95bc5404548b16fb9b3..96a5d10d6e180d4443a6107672b110d253d6208f 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/misc.test b/mysql-test/suite/perfschema/t/misc.test index bf3e8afffdcbe86f280555deda2d56941a9bfe16..c9f7dc6bfc093c52fc3a7e936a479f2312223ab0 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/perfschema/t/partition.test b/mysql-test/suite/perfschema/t/partition.test new file mode 100644 index 0000000000000000000000000000000000000000..073a41e92520edc38ceb0660235d0667924a0574 --- /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/binlog-simple_plugin_check.result b/mysql-test/suite/plugins/r/binlog-simple_plugin_check.result new file mode 100644 index 0000000000000000000000000000000000000000..6c960ee325c816c904a2c0f49474f3404923fdfa --- /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/r/processlist.result b/mysql-test/suite/plugins/r/processlist.result new file mode 100644 index 0000000000000000000000000000000000000000..d08ea9d35234ef3a8b45c672bdf45d83370c42b2 --- /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 3971504b238e53f25c1bfe60cc77e9843f89ed56..5c355b34ba1ec4490b20d5b407e0399075f8327e 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/binlog-simple_plugin_check.test b/mysql-test/suite/plugins/t/binlog-simple_plugin_check.test new file mode 100644 index 0000000000000000000000000000000000000000..773dafe8a814c0f2dba2c25854341169977a5ca8 --- /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/plugins/t/processlist.test b/mysql-test/suite/plugins/t/processlist.test new file mode 100644 index 0000000000000000000000000000000000000000..5aacef317b9a7cc2c53db08f938ecdc0d7dfe1db --- /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 9be0d5556f005e0613ce693fa771ae57958b58db..4af1ed883e38fe824c8264ea39e9481b4127cd2b 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/roles/flush_roles-12366.result b/mysql-test/suite/roles/flush_roles-12366.result new file mode 100644 index 0000000000000000000000000000000000000000..5897e480cd4e1ecddd8f16bbdaf661b14b7067d7 --- /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 0000000000000000000000000000000000000000..343ac4abf72ca6a272b0d53d9146d65114b41844 --- /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 0000000000000000000000000000000000000000..1c4841c8afd2bd03f711fcc7e051baa0af216b51 --- /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 0000000000000000000000000000000000000000..97a82109276bc712af9751cdee68b71bbf8ca0b0 --- /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/rename.result b/mysql-test/suite/rpl/r/rename.result new file mode 100644 index 0000000000000000000000000000000000000000..5cedea51c8665203b874d33414d18223b497742a --- /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_gtid_delete_domain.result b/mysql-test/suite/rpl/r/rpl_gtid_delete_domain.result new file mode 100644 index 0000000000000000000000000000000000000000..3558a6764d1d57e62a5cd9a04bc78deca55c318e --- /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_mixed_implicit_commit_binlog.result b/mysql-test/suite/rpl/r/rpl_mixed_implicit_commit_binlog.result index 328c3c3423fc7950b8b4e1126cae3cd792a35180..7efb1f7162bd2f43c19a21a790aa463ee8499b6f 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 0177e65b10f17022f5abdbe7ceb4460575d1df68..a6da3399fab37c1e885dfe83490573adc8283c42 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 95167311c3f1795ef56f873ec5557f8170ab39fb..1618ee3185e129033a1874dc97e6ea968a9e708e 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_row_log.result b/mysql-test/suite/rpl/r/rpl_row_log.result index 83ec26486e012dd5af8f5b8b287270c8b048ceb6..4ff3d45e2bb81d6d94fa2668dc72118bc70c019c 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 3b9733a18e8290a3bd663b3963b247f611787b72..c78e0e4816eed2617577ffcca110b41e84a0bae7 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_semi_sync_skip_repl.result b/mysql-test/suite/rpl/r/rpl_semi_sync_skip_repl.result new file mode 100644 index 0000000000000000000000000000000000000000..4762ac8dd07e27aa5de3bdecc6b4c76277e91b52 --- /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 cb702ad64effd03b5d3363033028c5e466628263..7efb1f7162bd2f43c19a21a790aa463ee8499b6f 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/r/rpl_stm_log.result b/mysql-test/suite/rpl/r/rpl_stm_log.result index da925035c9c33f4094fd44ad35312ffd48b832cf..4d187095d17c3b206ea3d93cb048fe02a756fd6c 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/rename.test b/mysql-test/suite/rpl/t/rename.test new file mode 100644 index 0000000000000000000000000000000000000000..ac499157918f18da9afb82cf203951c6b118c8ce --- /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_gtid_delete_domain.test b/mysql-test/suite/rpl/t/rpl_gtid_delete_domain.test new file mode 100644 index 0000000000000000000000000000000000000000..5abedd7eb372fc5a476c365edc794e9145f23932 --- /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/rpl/t/rpl_manual_change_index_file.test b/mysql-test/suite/rpl/t/rpl_manual_change_index_file.test index 981cecb66ad4397a6dad6f10aea363018a81b7d2..1c087c550d0e9220dd5b6c70ccc57ef304e4fcd7 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/rpl/t/rpl_parallel_optimistic.test b/mysql-test/suite/rpl/t/rpl_parallel_optimistic.test index 41fb6ebb72e73924987aabb40cfc303aba2316a7..28bf4a77fd4e58f7c1d5a7dbf3679f743b0c97f3 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 0000000000000000000000000000000000000000..2f6da18067c6b5528d53a12dcf42d8cae4eebba6 --- /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 0000000000000000000000000000000000000000..971b8b9d24341a94b6a244e65261df3a20042e3f --- /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/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 0000000000000000000000000000000000000000..cc035e4f8bc6cbb25730257b40c142412c8eb65d --- /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/max_connections_basic.result b/mysql-test/suite/sys_vars/r/max_connections_basic.result index 708342b016d0a49aa9f240b9b65cad0b55b53967..f9b2c0344000ba18643d0d15b5e28087aa727b95 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 9419f25193025e8322fc7d5534e79c85d20c89f8..d3de7707f84996de864f09a69a36515e2ce7af75 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 5c7e310ce080185059d02fc74dc05d4d0d305496..65439e3ae5a51cd7497a6f56a7286e79db8ba0f9 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,10 +804,24 @@ VARIABLE_COMMENT Page size to use for all InnoDB tablespaces. NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 65536 -@@ -1727,13 +2035,69 @@ +@@ -1741,13 +2049,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 @@ -900,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 @@ -909,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 @@ -918,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 @@ -927,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 @@ -940,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 @@ -949,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 @@ -958,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 @@ -1007,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 @@ -1042,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 @@ -1051,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 @@ -1064,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 @@ -1073,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 @@ -1082,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 @@ -1095,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 @@ -1104,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 @@ -1113,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 @@ -1148,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 @@ -1157,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 @@ -1166,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 @@ -1175,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 @@ -1196,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 @@ -1217,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-82.2 +-GLOBAL_VALUE 5.6.40 ++GLOBAL_VALUE 5.6.39-83.1 GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL @@ -1232,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 6aa4e32e95e1f24c1e5b064e26a93afda0030db9..dafdde75e125bdeedac6fdbac22d59e6b0cc33ed 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,10 +415,33 @@ VARIABLE_NAME INNODB_MAX_DIRTY_PAGES_PCT SESSION_VALUE NULL GLOBAL_VALUE 75.000000 -@@ -1727,6 +2035,62 @@ +@@ -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 ++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 +501,7 @@ VARIABLE_NAME INNODB_PURGE_BATCH_SIZE SESSION_VALUE NULL GLOBAL_VALUE 300 -@@ -1895,6 +2259,48 @@ +@@ -1909,6 +2287,48 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -527,7 +550,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 @@ -562,7 +585,7 @@ VARIABLE_NAME INNODB_SIMULATE_COMP_FAILURES SESSION_VALUE NULL GLOBAL_VALUE 0 -@@ -2000,7 +2434,7 @@ +@@ -2014,7 +2462,7 @@ DEFAULT_VALUE nulls_equal VARIABLE_SCOPE GLOBAL VARIABLE_TYPE ENUM @@ -571,7 +594,7 @@ NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -@@ -2245,6 +2679,34 @@ +@@ -2259,6 +2707,34 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL @@ -606,7 +629,7 @@ VARIABLE_NAME INNODB_TRX_PURGE_VIEW_UPDATE_ONLY_DEBUG SESSION_VALUE NULL GLOBAL_VALUE OFF -@@ -2322,7 +2784,7 @@ +@@ -2336,7 +2812,7 @@ DEFAULT_VALUE OFF VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BOOLEAN @@ -615,7 +638,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 @@ -636,7 +659,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 @@ -657,12 +680,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-82.2 +-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 acdbd007e6e2d1b7314b4b945bef477e2e578a13..05bb199acbf8d1a5b2183227fada8ca026219d91 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 @@ -1347,7 +1361,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 @@ -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 f851dfcc5a474e27bd1558916ba06f831105b5ba..7f046a188cc13c4d162cb5fb622a4f903ec1977d 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 5bc6a6e1743197e84e78cc41497dc5a3bb41d26c..72550ffb3affb9d5a876ccadd3d15e0063354562 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 0c206975c294ced7ba91b4c87bbd01d51ee3537e..db932ae8223fd6b0fbefb2965c2ebf09dacabb53 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 4c63578375390afa4a8d2dc21f32cb1799d211e7..bc373003e1d7d91f8a5e1c185c89e7a5e6332dc0 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 6db52eb815036d2547ec732db6808d956f5e3f18..3e1fb6cad79deb022989a44671483f8e857fefe7 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 0000000000000000000000000000000000000000..f9aabf49ba4d37028320001da408b1c2556e3181 --- /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/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 0000000000000000000000000000000000000000..23d8ba667ced6f2aa1beba712ea79b9fe8c2d010 --- /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/suite/sys_vars/t/max_prepared_stmt_count_basic.test b/mysql-test/suite/sys_vars/t/max_prepared_stmt_count_basic.test index 5bf5d9c8834f17306d3bd8bab70ca5fa892a751e..a97256d84a47d6c66244a3d355afef681af256fb 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 462e83d98b6476535fa433bbd64e003e859ce1ec..c3eec59bc17fe6d9577dc840db1068267c400966 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 0000000000000000000000000000000000000000..c3f0d3bd51fec1049132e5175359888bb7046259 --- /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 0000000000000000000000000000000000000000..c3f0d3bd51fec1049132e5175359888bb7046259 --- /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_on_basic.opt b/mysql-test/suite/sys_vars/t/wsrep_on_basic.opt new file mode 100644 index 0000000000000000000000000000000000000000..aa1fb6cb155dcefc014daee5a3a7b14890065511 --- /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/suite/sys_vars/t/wsrep_sst_receive_address_basic.test b/mysql-test/suite/sys_vars/t/wsrep_sst_receive_address_basic.test index 9e50cbf8947227ab25e7379d06d3e47a19d43ae4..59f69c14dfb87b705f7ffadd3bb28061a09ded83 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 966fd278a52641a8d10adad54104039b6e309670..fa1da2ae4ff8ba0102d0fbdd5fa3bbd1f4dc47d6 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 62d7f62440fb861bfd1a611b8854feb1a6ddd871..4ecc1ca3b79fe685e8f647dd0adf893de1eb3f47 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 1769f56784879601ece06d821f106df5e2054e0e..1315f090d5c3267856acb7ca35201e8728b97a76 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 5cb33516ed2f1e5a8b3059a7be58050aca9892d0..420f733afdf4b68f08428d839317bbe9256fd3c1 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 0000000000000000000000000000000000000000..401e7bf9138e42a27a035f87361899cd427f8e29 --- /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 20989e70ef9e8e64dcee5a67cbc1aa678ef3b298..c2d44c08e222b97fa293607c220f2ccadf32dffc 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 0000000000000000000000000000000000000000..299b605b2cd081884532443115755bc561547da7 --- /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.test b/mysql-test/t/create.test index 7306a819ad7e16a46fcf59885a31776c9fa68c6f..c6a91a18965ada6fe81f61f6a478edd8e1daf71f 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/create_or_replace.test b/mysql-test/t/create_or_replace.test index abf470b62d5ef9fdb90ff9c86492e3e97c8854eb..c1441d218cfb8cca2178ef7b6af1ee10a026063c 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 1ee48eed18c5b3a30a4a31b71f8864fc70613a06..3455b0437c1052d34203a6f29e4036a8efc52e97 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 e21cd1f00227d975f072d915723772daa43b0ff6..0055a2f20e25c2c72fcb8850aa016a1de9b782cb 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 d88ce2aa470ea759ead04ec99c21a329973cb2ce..be17eb461be97488f82aa89971ff3e94db620046 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 # @@ -2012,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 060c2aa1afbc2525eed04b24b9f8c96beacafcd3..af4c169091a028300b362acb29b1f35483ca3a86 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 # @@ -1913,6 +1932,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/derived.test b/mysql-test/t/derived.test index d881430a060f6187f67b16fb725a05a5642f01c3..b0415cf3b04d68ee79cd874c6a44833a9fd33485 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 03e2345ba1c0f305967518c212c0b361bceb2032..7807d1a9f9e6dd74ae8844b8abdb1c8ec5cfddf4 100644 --- a/mysql-test/t/dyncol.test +++ b/mysql-test/t/dyncol.test @@ -920,6 +920,23 @@ 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 # 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 e563e65ec2a0aa9a410b8616ad8ea5a943b8d21e..c3b3440d82d5380840c235fbd41cc2300a4f02e0 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/fulltext.test b/mysql-test/t/fulltext.test index 9dfc49d3dfde24fd11d557bf4e98758fab27e303..fc7b15c052d01fb3f5f22edfaadfd050d99b85cf 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 be573f494a28178be195c9577f1197fd08904f6f..69dd2c4063e5381cf853ad96ff1828c8d9226dff 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_date_add.test b/mysql-test/t/func_date_add.test index 5f27978347c44d772f092938568e08415086a970..e7e2b96f0ebd5ea8cb5043136127f3f906959d52 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_isnull.test b/mysql-test/t/func_isnull.test index 326574e05152b177a38acc588b189338bb72964f..4c59fa3cbe8c729977b26c2ef94d2671843c8c21 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/func_misc.test b/mysql-test/t/func_misc.test index ffb7838ee787b4abcaf3c720dc531fcb22957666..2509f55ccbb4785ac9d86d941cf9adc155f4c5f2 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_set.test b/mysql-test/t/func_set.test index 13f8661db499f103b7cc210e9bba895e75a13ef1..887b1948498c2a6be80c996aa17b4a2e1b3be1d9 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 48872edcd4baa7541759d0bc6a2f1ed164f23b56..46b4dc2e3f0b6ff1d4a4756dcdb0acbee32336de 100644 --- a/mysql-test/t/func_str.test +++ b/mysql-test/t/func_str.test @@ -1756,6 +1756,53 @@ 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 # 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 # @@ -1800,7 +1847,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/func_time.test b/mysql-test/t/func_time.test index bc553e6f0493afc584999c7011b7ae686defef4c..380822130045c513dbd161e2282b84f780c9a6bc 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 a8ddf350b736e9938269554b18f5c542775b2483..51d59844da68765042583ef38b832308e3f65888 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 a40fd2afb1853079cf8fa68500a4e5a7a814c90a..f0721b3e5e90140c8bdc4e446dd81a72ac097106 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 0000000000000000000000000000000000000000..55b09232edc9e4b3518916afef7e576ed9d34e78 --- /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/group_by.test b/mysql-test/t/group_by.test index 46d341affb4649798da8a5377761d01897dc7a32..0401ad9780c47a5705d45ca2e226dbce5a8a8850 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 f826feff5c0f6df02dc1cac829ed299e31cd4cbe..dadeaca35b65ff79c0dcdfe70493c6bb13b6f407 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 # @@ -742,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 bcd87c2688d76f4d41a75ea8e111d377105db14d..385e372bc3b795fdca31c646d2c0609c83cf4f90 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_cache.test b/mysql-test/t/join_cache.test index 5ee868b4177834d014d12596fafefdbd955bf689..ee3e324cd8028fa62a7c2815f81159c3368b071b 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/join_outer.test b/mysql-test/t/join_outer.test index 88861511d799a75e8d74619003120bae486c30cd..34b0551a32ed7e4ba8c32d6ee4e500ba0fab5f33 100644 --- a/mysql-test/t/join_outer.test +++ b/mysql-test/t/join_outer.test @@ -1962,6 +1962,36 @@ 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 @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 SET optimizer_switch=@save_optimizer_switch; diff --git a/mysql-test/t/limit.test b/mysql-test/t/limit.test index 4dbe13096d4176595485ff28c778a9fcc370736c..668d3b745185ff9b4c098cf6089358ea2bdbbc6d 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 78f0e2ecf8d853c61cf96e70ae0d70839f767f3e..6cfaf9fc320b201ac689abb733140c70b592d2e5 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 fe259b378082d510f7bf8416e85a429607722d24..7380e7a32e15b9b17d949ec9bc8b3703b0c4c462 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/mdev_14586.test b/mysql-test/t/mdev_14586.test new file mode 100644 index 0000000000000000000000000000000000000000..8b3d37801518dcc1c5ac2e5e91ac41b15d0c42c3 --- /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 e9d69b446d568e929fd54613fd26409242e26e26..d2f4ce0e44a01dd6be8c3025e0eeedda09fd16da 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.test b/mysql-test/t/myisam.test index 62260ba43aa0a6173dade806b3c07153fc937672..77baa695b6dc3a9ada1f02e59b4041d28c01493d 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_optimize.test b/mysql-test/t/myisam_optimize.test index 5f0b8fc766674c44d764d4ff488e017e842eae6b..5e133aea853291a34c5427785465d9c7736b66d2 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/myisam_recover.test b/mysql-test/t/myisam_recover.test index 49fe9c334608e0aa8e2fe4249fa6fcdd79bc4581..670dfd1aa496614a033ec77f76ec3561889f2536 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 300695612fdee5053d633c78aa40b9f83a5d89c7..fc2ae849aa61b38b72d2e3a9faff4441fa51b8f6 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 60a129c3805fb11efeb0287fb577d8fd641c7278..8fba5750d898f7ad0e4a53a7b628706fc6c7296c 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-nl.test b/mysql-test/t/mysqldump-nl.test index 311996e77c3059cc354fd6edbbeae6957ebe37cb..4513fb2c6374711fd1d407171b20c1bffd240c9f 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/mysqldump.test b/mysql-test/t/mysqldump.test index fca334a7fee8cc2acc078bceef84fc9a9ec8dacb..aacb812c84f1cd1fa47ed71d880ddba347ac96ed 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 c49c4ab3d7d62572bea8475f3a8fca159b67a6be..81115d59d0920f9c8bfcfa60750d52696deaf877 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 b2eb101a37cbdbfb156efc7856c72440d42065ac..60f41042d562cc782b57a0aa51426cc52625effe 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 fec5df1a1c79f2cbec06ed30a8f261ed68acb727..4a61cebdc0d9f68140cbeb487443ce95cfdb57f0 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/order_by.test b/mysql-test/t/order_by.test index f61a6a8be34ee64d0bb42feabb0c5d8267068d88..1ca258d1d48770029883596b64b68efa743e615f 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/parser.test b/mysql-test/t/parser.test index e27db9c4e4892eb99c6a71d115cd6a62102edf24..1aba207fd62615148ea29a07bdf84576fe8e63e5 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/partition.test b/mysql-test/t/partition.test index d3161c9338ce5ddc09137c62b49ac954202e9533..35dfdead9160773058bfb837f364004a1570e836 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 6eed931276c404ed09abca7cd4c2c421c836b120..e1e8dfeeb17dc47be6f6ad7be794f07d991dd9a9 100644 --- a/mysql-test/t/ps.test +++ b/mysql-test/t/ps.test @@ -3860,4 +3860,74 @@ 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 + +--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 0000000000000000000000000000000000000000..e09a2bf4070b6c96e39b3d4c433200cbe6ad8a2b --- /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/query_cache_debug.test b/mysql-test/t/query_cache_debug.test index 5eba778cf9e32d96f3bf9da63a43eea5d40c352c..cebe5b1c88fdef7278f50b9dfde11ebf48fa5d99 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/rename.test b/mysql-test/t/rename.test index a55bc845acce16c080be4f5c057531b95940abfc..67732d5b5b955623717fb3e358f56d269f080a9c 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/repair.test b/mysql-test/t/repair.test index a6df0dc5979893ea9eb1d1693ecc1930a7d493be..5494e370133ff9d8f70530c425d26e03695bd00c 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/selectivity.test b/mysql-test/t/selectivity.test index 3e60f242083e2ec42eb5fcf8ddc2d44ece633ab7..cf12bdaea219d44675ec8702775f87ff35c564b4 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 6e19fd885e31d1ae7d61cba762ad19bf0698af60..9d43245d56e8d7e5747d557226324ab82968b94e 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 23715166a027fe912f1bf8f5dacc6ddbb93a3ca8..e44a853e713ad6f0c78e560e7d19c4bd33f1b6a0 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 99020eb951f496dfcef49829ddaf87d69bb30e81..467d3b5a7d4c9bac04ea68ecf7220c058314b699 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(); @@ -9588,4 +9588,185 @@ 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 # +--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 # +--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 3f08e2e133cb123c98d89b22701691aedf1fce8a..0463885e41a61b2065554ecaa0244b0cdc43ec2a 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 0000000000000000000000000000000000000000..de22a5a44febdff838a081fb65b19e2f7498bfe6 --- /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/subselect.test b/mysql-test/t/subselect.test index e0e3ed1a14cb4ecd7771f1bc6c823e19ac5e7f2a..717871db61d9381e95be46918138cc949e02f9b3 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/subselect4.test b/mysql-test/t/subselect4.test index d4ccbcf6f665fc9ef90a2348c708c1f05d1570b1..d5a404191853184583add75490886c28d1992e9b 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 9c7c9683d0bf1f8deee74aeb7c7e42f11603f7b4..bf5de741ea07f1a6144b88cfa24245610f6876a2 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 f90f1e2e927bac2be29c058080775beaea85712f..623e414310aed2f592c85e22e27ec698f8b4c85e 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 cfb6c8c28199aff933035b7ad4e1c7e5b4bfa318..0665cdf68fef19eaf27cf3285592fcec4d8ad304 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 a02dce348370f1c57a993ffe5c62b6b182f386a7..a6d4107e59151f5e9ed53d0300cd648021b95b41 100644 --- a/mysql-test/t/trigger.test +++ b/mysql-test/t/trigger.test @@ -2634,3 +2634,39 @@ 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 # +--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 # +--echo # End of 10.1 tests. +--echo # diff --git a/mysql-test/t/type_time.test b/mysql-test/t/type_time.test index 27679b9ec5ab076b67bbbaa51889ecdff9c16436..10b75f2754667b0a6e99c79d8027f1f0dd6fcf0d 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 6e29b849be516a479042976da82aa772018de2d8..fc91c5307603301e9c8bdbf0989030d27b9ea2cc 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/union.test b/mysql-test/t/union.test index 059bf9154cb7cb62876d4fb39869c6dfc48d23b4..cbd19a73a807514cb11ca908c88de868f6bdae52 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 0e93e7d959375bb31ec1458212551f84805cd44e..acc8aceab00708907c4234e8521b51d623ef674c 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/variables.test b/mysql-test/t/variables.test index 8f29528ac25ad6a97db9cf12517794c1af237ac2..458327328e43fc6ce8b71e68dd6a0c0befe596a4 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 ac6b94102d78d155dd8493829ab0154e786ea70c..6ff226d738f528c0d7096ac24f14c97b079f8f4b 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 # ----------------------------------------------------------------- @@ -5591,6 +5479,214 @@ 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; + +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/t/xa.test b/mysql-test/t/xa.test index 1709886eb0c30d0a4805f19f807c14df901cff15..0995b8c26b20ebdceab3d9e64e3c4a9568a4b01a 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 371fcb72b0d1353e915985c7c532d0617476a7cd..c68790b704556a0385bd2037dc816dd9d2db441f 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; @@ -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 b5f8f9fffb9d890f80c946fd9f644c1feb10a5f3..9b00579944c7ccd7c069bdb0b2bdc4dfe103b516 100644 --- a/mysql-test/unstable-tests +++ b/mysql-test/unstable-tests @@ -23,93 +23,94 @@ # ############################################################################## -main.alter_table : Modified in 10.1.29 +# 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.bootstrap : Include files modified in 10.1.29 -main.case : Modified in 10.1.29 -main.count_distinct : Modified in 10.1.27 +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.connect : Modified in 10.1.33 +main.connect_debug : Added in 10.1.33 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.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_utf32 : Modified in 10.1.29 -main.ctype_utf8 : Modified in 10.1.29 -main.delete_returning : Modified in 10.1.29 -main.delimiter_command_case_sensitivity : Added in 10.1.29 +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.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_time : Modified in 10.1.29 -main.gis-precise : Modified in 10.1.29 +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.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.insert_select : Modified in 10.1.34 main.kill_processlist-6619 : MDEV-10793 - wrong result in processlist -main.log_tables-big : Modified in 10.1.27 +main.limit : Modified in 10.1.34 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.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.29 +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.mysqlbinlog : Modified in 10.1.29 -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.old-mode : Modified in 10.1.27 +main.olap : Modified in 10.1.34 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.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.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 -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.34 main.query_cache : MDEV-12895 - Wrong result -main.range_vs_index_merge : Modified in 10.1.29 -main.range_vs_index_merge_innodb : MDEV-12637 - Timeout -main.read_only : Modified in 10.1.29 +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.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.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_exists2in : Modified in 10.1.29 +main.subselect4 : Modified in 10.1.33 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.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.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.34 +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.view : Modified in 10.1.29 -main.xml : Modified in 10.1.29 +main.variables : Modified in 10.1.33 +main.view : Modified in 10.1.33 #---------------------------------------------------------------- -archive.discover : MDEV-10510 - table is marked as crashed +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 #---------------------------------------------------------------- binlog.binlog_commit_wait : MDEV-10150 - Error: too much time elapsed +binlog.binlog_flush_binlogs_delete_domain : MDEV-14431 - Wrong error code 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 #---------------------------------------------------------------- @@ -117,68 +118,55 @@ 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.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.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.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.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-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 +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; modified in 10.1.27 -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 @@ -190,7 +178,7 @@ 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 @@ -223,72 +211,64 @@ galera.MW-328A : MDEV-13876 - Wrong result #---------------------------------------------------------------- -innodb.alter_rename_existing : Added in 10.1.27 +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.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.innodb-16k : Modified in 10.1.29 -innodb.innodb-32k : Modified in 10.1.29 -innodb.innodb-64k : Modified in 10.1.29 +innodb.doublewrite : MDEV-12905 - Lost connection to MySQL server 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 : Added in 10.1.34 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-blob : MDEV-12053 - Client crash +innodb.innodb-alter-nullable : Modified in 10.1.33 +innodb.innodb-alter-table : MDEV-10619 - Testcase timeout +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-enlarge-blob : Modified in 10.1.27 +innodb.innodb_bug48024 : MDEV-14352 - Assertion failure +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-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_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_tables : Modified in 10.1.29 +innodb.innodb-page_compression_snappy : Modified in 10.1.34 innodb.innodb-page_compression_zip : MDEV-10641 - mutex problem 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.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 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 -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 +innodb_fts.basic : Added in 10.1.34 #---------------------------------------------------------------- -maria.maria : Modified in 10.1.29 +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.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.partition_datadir : Added in 10.1.29 -mariabackup.xb_aws_key_management : Modified in 10.1.27 +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 #---------------------------------------------------------------- -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 @@ -296,7 +276,9 @@ 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/wrapper.repair_table_no_index_file : MDEV-14807 - Wrong error message #---------------------------------------------------------------- @@ -309,25 +291,23 @@ 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 : 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_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_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 #---------------------------------------------------------------- perfschema.func_file_io : MDEV-5708 - fails for s390x perfschema.func_mutex : MDEV-5708 - fails for s390x +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 @@ -336,50 +316,59 @@ perfschema.threads_mysql : MDEV-10677 - sporadic wrong resul #---------------------------------------------------------------- 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 - -#---------------------------------------------------------------- - -roles.definer : Modified in 10.1.29 +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 #---------------------------------------------------------------- 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_checksum_cache : MDEV-12173 - Unexpected error +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 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 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_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_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; 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_plugin_load : Include files modified in 10.1.29 +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_log_innodb : MDEV-10688 - Wrong result +rpl.rpl_row_implicit_commit_binlog : Modified in 10.1.34 +rpl.rpl_row_index_choice : MDEV-15196 - Slave crash 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 +376,11 @@ 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_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 -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 @@ -400,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 @@ -430,18 +413,13 @@ 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.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 : 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.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 @@ -453,36 +431,40 @@ 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-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.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 - #---------------------------------------------------------------- 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 #---------------------------------------------------------------- vcol.not_supported : MDEV-10639 - Testcase timeout vcol.vcol_keys_innodb : MDEV-10639 - Testcase timeout -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.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 7354b1699b1f96e47ec6bd971a3857c40be24583..5e407e9caece59acdb0459a9ac44d567ca8ad729 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 e3357e389c2255c7f57a875b2814eedec67fb30f..53edfc5d87be8474f4846084da1f0437d81f1c04 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(((uchar)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,8 +4238,8 @@ 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, DYNCOL_JSON_ESC)) + < 0) goto err; } } diff --git a/mysys/mf_iocache.c b/mysys/mf_iocache.c index d861c2c3d4f4e6b82ab636e725e7ab86294e69d1..56b1ae3fc6e5be894bbe1601c696204219781cf2 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 @@ -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 72b04119855accef1c67c86218fa16a98f38b973..b82792fc4b5b10def60d224fddbb8e02b42fb90e 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; - len= my_snprintf(input, sizeof(input), "%p\n", ptr - offset); + 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), "%08x\n", (ulonglong)(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 7275f602525ce19b2975a3fddadddf7f76002f24..1b0ef857afae1e3a47e5688bedbfcec0021de251 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 655e9a57747522f684b7e43bd843ab06aec0499d..5c4e33141a62673442d7899ba23ca5ba1f7e0415 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) { @@ -487,8 +488,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 @@ -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,8 +641,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 */ + DBUG_RETURN(2); } @@ -1100,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_lib.c b/mysys/my_lib.c index abc7b8a31614678cf6978c5a9be3753070d78e5a..8daed1101ecc86c39ba94482fb9ad958479da565 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_malloc.c b/mysys/my_malloc.c index dc02d3896bd11d5c1b73809bf046015ccf72f66b..719c13a040e98dd6ce22f61774f3575c0134075e 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/my_symlink.c b/mysys/my_symlink.c index 06f6a29e4a0004c2888f880f8f1a3c6ab3732f5e..8580fac3595c5d6fad6c5064fd7a5aec80696ead 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/mysys/my_thr_init.c b/mysys/my_thr_init.c index 1d3c3059bd5dfd48ef260245669556d9927fe80f..f827fb136d36eb468f1b14f00727b65cbe0a78ff 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/thr_alarm.c b/mysys/thr_alarm.c index 9d917d3dd598a56f9d9f813dcdde96e83e1649ee..61ef3657161069d2623f43d5b76342564009daca 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 96842b1a3ad6d95a99aaa03e26a6193d325b1969..9ca0847570f36dd1f576dbaa78ce35e0a8a97ce5 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/mysys_ssl/my_crypt.cc b/mysys_ssl/my_crypt.cc index a0937a83e1748a84df6e65016b1647ac93fee22d..439339423cd56fe8ad7ccc462331728c6f2f33c6 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 9717870fe2644c29d24c73879f2348f77f56897d..e9f8e650347ed84d1006c20253b561de81cf271c 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/pcre/AUTHORS b/pcre/AUTHORS index 291657caef10a10c4cd89871b7e666e5979ea47c..eb9b1a44b34a62cde8ca6188812fd9253780faa7 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 590a7542885b3c4f5118de1fdfc500d43a600518..7b53195f6a6365716b9ae9811eb0253b3566a6c6 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 2099840756e6302d837dcd51b5dcd6262f7adb16..8865734f81b136629e961c230380423899c75794 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 dd9071a8dd8192f7d734352e29b9395da2ded229..f6ef7fd76649608d9d6f8a88c5e84d83a0cc946d 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 36be07cb8803147b2b427dd9d2e6c70e55607bda..09b4ad360037039ac37eb011639bd6d824eabfab 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 3910059106bd3a8c11ca75c2c02f25627de7b1ea..37f6164475b37ce190c62dce51d56e73fb11b499 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 718a18508c918b8094f27ca8eb83d3b61a5404b5..dcdef6a942796ed43745f6cec1801c849067ca1b 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 3910059106bd3a8c11ca75c2c02f25627de7b1ea..37f6164475b37ce190c62dce51d56e73fb11b499 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 667a45ed5757573474b49ee9cf6d489dc1016416..d4d78926984840491164649104dd41be705c9714 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 1a916693e699ce505af483baad946dcf2ef8e496..9b9da46f0d090744b8653ba9dc1bc6c38c96ae97 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 bc09ced3a7c5b1a1a48cba2a634926ca66e9e49f..f333381d0883b9e79152ed0a43fc1d1ba340064c 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 fa84d924a4c6463e06b7ec4f30d475066d5d9399..93256d32455020a0e7758c67f27dff4f91a78962 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 249edbe8e7f4f0e5820693bd7fa9e172b264bff6..2bad74b02317c99f6939f5dc2bb17a90d06d5ddc 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 317f7454e136781d82a21518ed02bfb396bef810..a406be962d77088c4d41a1b0d57bd4e7ea2fe7a7 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 7b404a711001a0f69060da86ca5915385d76023c..a76d6bfca45036b93e41a93977a00b4a0c5eacc1 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 08c6f39a565b9974d298a376e068334f4000789d..8ba4dc4ddaba708d280a35016f87ffdbbcda10a6 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 28561a93572f9e0a74d87f1ce911c1195f3ba3c4..c94008c3f2981597a1903a3f40adc9404ebd936e 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 811bbefc84c091deb073a40709cd0f25b7619215..61ed8d9d4e404196c67a5613ab54c0b50bd0f89e 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 bab989ca7e5b2887cb1fa566d632e7c6e12fa829..090e1e1c85f0d46fface9a8193b9bdac8bf971a1 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 e62be946c4a9571873aad0a57b93c0d6928fed5d..c03ea12be74c06def8d8d06e2b45035bb23114a3 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 0000000000000000000000000000000000000000..446c64d0fdddf56a5c6cb6ea917f36a7e3bb4fa3 --- /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 0000000000000000000000000000000000000000..b49db3c03b53571b697e34dd06cf7544dd951031 --- /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 0000000000000000000000000000000000000000..122b3d3f17f3bc5b19fc8435f30a0b25a7c0c8f9 --- /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 0000000000000000000000000000000000000000..bd6befc5e11b9da94d6ea35ce74cfc4d28f87cb2 --- /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 0000000000000000000000000000000000000000..13a0762ae010fba53ff25fd31eff5e7fc5617424 --- /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 0000000000000000000000000000000000000000..afbbe2b01630c90b76c25249582cc7b50f6dadb4 --- /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 0000000000000000000000000000000000000000..c64ef3b3133edea0faa64a36bc3e78ea7476fd4e --- /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 0a266ab19fe83c20d1849f69acc003c50331223f..b5f6e996b424672c296ff777690237d7cb594d40 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 880458c1517ccd7dc93d74fa10fcc69ac630985c..b994c9f67b5ffed0ef4bf1cf1e3c0a39f0197b8c 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/galera_recovery.sh b/scripts/galera_recovery.sh index de2e653c4972260da9f305e04c53c236cbe4a0cc..09de67217627e88587ed722c53273ee8d3499abb 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 aad9ef5cc37c9b713babd0bd588346e31263eb2e..2768faccd694b3c2f78d0369e0d80cc2f0395467 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/mysqld_safe.sh b/scripts/mysqld_safe.sh index bcaf7b86f5fbfa08d13943c3ba6bcd7fc486ed69..f21e697953f962fd572c43b9fa25f85f7f10574f 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 1ef4830661bc67bcd717c84c74af37a1179a98f6..e160bf5c77649d4c502f4c0665b18565c5ea8dda 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,28 @@ case "$1" in # # Break address string into host:port/path parts # - if echo $WSREP_SST_OPT_ADDR | grep -qe '^\[.*\]' - 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) - else - # "traditional" notation + 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%%[:/]*} - 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_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#*/} + remain=${WSREP_SST_OPT_PATH#*/} + readonly WSREP_SST_OPT_LSN=${remain%%/*} + remain=${remain#*/} + readonly WSREP_SST_OPT_SST_VER=${remain%%/*} shift ;; '--bypass') @@ -66,7 +75,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 +131,17 @@ shift done readonly WSREP_SST_OPT_BYPASS readonly WSREP_SST_OPT_BINLOG -readonly WSREP_SST_OPT_CONF_SUFFIX + +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) @@ -150,19 +169,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 +259,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 +268,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 -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) - 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) - 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_mariabackup.sh b/scripts/wsrep_sst_mariabackup.sh index 9e3fc54290d5f8c2940b9de5a764790236b5200a..549161aa8f32e2906fb97648627b1af53698ea1f 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 59d9a3c5c9c2ae63e729d1c5c5ae40a7dd986c6d..faa3f10639b6f9fc582f3bcd5dfdec1cf240223e 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 @@ -112,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 --defaults-extra-file=$WSREP_SST_OPT_CONF "\ -"$AUTH -h${WSREP_SST_OPT_HOST_UNESCAPED:-$WSREP_SST_OPT_HOST} "\ +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="" @@ -135,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 @@ -150,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_rsync.sh b/scripts/wsrep_sst_rsync.sh index c6e8a7ef4e1b0d108e7ac54e29ffd470141cb668..3d76d1780e239d1ec98447340a52090d83603e66 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 faa7bc5e815a82d396d983c2223cbb11f0fb7325..00efdaeebcf17febbbab4ea9c5d4b36791c6761e 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 @@ -274,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 ${REMOTEIP//[\[\]]/} ${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' @@ -342,7 +349,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 +366,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 +387,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 +398,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 +407,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 +459,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 +481,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 +503,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 | grep -q -- "--syslog";then ssyslog=1 fi fi @@ -635,18 +646,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 +653,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 2> /dev/null || :) + [ -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 -c $WSREP_SST_OPT_CONF 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 +831,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 +864,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} --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)" + 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} --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" + 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 +889,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 +952,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 +1014,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 +1076,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 -regex $cpat -prune -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 ca3c0129837ce9f279eea726d060f0faf774596a..5bf380a81449462d35e01f9f8bad733158454e62 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 @@ -150,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 ${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' @@ -181,34 +189,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 +351,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 +374,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. @@ -422,7 +408,6 @@ if [[ ! ${WSREP_SST_OPT_ROLE} == 'joiner' && ! ${WSREP_SST_OPT_ROLE} == 'donor' fi read_cnf -setup_ports get_stream get_transfer @@ -466,7 +451,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 +532,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-common/client.c b/sql-common/client.c index ea686a79a1fd5d75c9988929ce8b344b1048a7d4..b1c2d9cf4e2bcc55c8a8f7567e18a76e1d32643f 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: @@ -1347,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]); @@ -1365,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); @@ -1397,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]); @@ -1433,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 */ @@ -1503,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); @@ -1575,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; @@ -1820,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); @@ -2510,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; @@ -2736,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 */ /* @@ -2921,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, @@ -3133,6 +3147,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/CMakeLists.txt b/sql/CMakeLists.txt index b4acac54124ae7dc73607d32acc5fbf0f8dee155..f6ee59a9237be2d4da1d96f514a2e66965654a75 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 88a4a088acf781cdac1af9e024e67bf22e04fa73..a0d05af3fa6255a73e830fdca13014f4e9eafa0e 100644 --- a/sql/contributors.h +++ b/sql/contributors.h @@ -38,15 +38,15 @@ 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"}, - {"MariaDB Corporation", "https://mariadb.com", "Founding member, Gold Sponsor of the MariaDB Foundation"}, + {"Microsoft", "https://microsoft.com/", "Platinum 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/event_data_objects.cc b/sql/event_data_objects.cc index 9e1ee6f30f9cc3419ddf846ddb02bce82da40f33..6ef9fa9f8efe57d9b895762034be70fb3eb7c250 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 51f68ca4c03ea4d935ca621f7f07f7b55b63294d..b7b263971b3f75ecdaf4662e0f80dc7ffe12f4ff 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,8 @@ 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 +548,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 */ } @@ -580,6 +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); /* Turn off row binlogging of this statement and use statement-based so @@ -602,6 +614,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 /* WITH_WSREP */ } diff --git a/sql/field.cc b/sql/field.cc index 1ffe2ce78ac2777f052e90115ded9f41c8bbe37f..64c51677c0ffcab017ed30bb96096cfcabbbcdef 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) { @@ -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); @@ -5781,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; } @@ -9415,7 +9429,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 154037df767e8132c3c87109eabab4c17bedb0cb..c21bba6936fbffc158627d403923f0b535137ca8 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); } @@ -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/field_conv.cc b/sql/field_conv.cc index 850403afb9703b4c86f0e92635ada9692fd8a8bb..c4c843a3bbdac126f9259dc9a2ce127ada2fe5ba 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/filesort.cc b/sql/filesort.cc index 3f174029d480d82b4246c8e96385678584c57123..7f7407fc2dc6d9214f6429a0bd2409aacf01cb1e 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 370a4e655b682cf0c0ae4bf03ca8e374457984a9..1e0cf09614589f60bb13326d1403b0710946ac12 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/ha_partition.cc b/sql/ha_partition.cc index 0649d5d44aa19d979d494f18d5b9dd4532428ea6..34c253cc48aaec4489c1d0c8aefa5539e33f746f 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 a5a28ceb77777ba740147abb0d8e083625b7c60c..1027a8b102df4bbf867ddb93cc3682a3ad8c1062 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, @@ -3325,9 +3327,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 +3425,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; } } @@ -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 1d4dded39719bdd39c680e32be8a65a23726fa46..a047f276349761af49a3ea5151dd9df056940155 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; + } }; @@ -3844,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 8c64a10c496f639ad19708f03781e3d7adda5f8d..e23829c750cdd8244b7d7daedd31d7eaf4378b3c 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 @@ -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; @@ -4623,7 +4645,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 @@ -7175,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) @@ -7600,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; @@ -8403,7 +8428,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); } @@ -8446,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); @@ -9922,11 +9947,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 921179ce232f690b6461fd64f5066d3aeba6178d..139ce40b25b34f9a122f8ff14cb41a91bee01148 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, @@ -657,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: /* @@ -688,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. */ @@ -2558,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 fcb78ca00037c93c0ec36012d680941029594ada..6ffd582c133068cabc84f33510e5baaacce4bfde 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"); @@ -1330,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())) { @@ -1378,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; @@ -1429,6 +1459,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 +1484,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 +1722,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 +1774,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 +1782,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(); } @@ -1849,6 +1884,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(); @@ -1909,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; } @@ -2780,7 +2829,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, @@ -2798,10 +2849,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(')'); @@ -4521,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(); @@ -4583,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 { @@ -4614,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) @@ -4629,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; } } @@ -6890,7 +6960,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 +6970,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 cc3362893554691170779942baf1e4dedd0b3190..03f234ad1e49e5346ba1bd5c4ed49be3cb967e0d 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(); @@ -345,6 +346,12 @@ 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(); + Item* get_wrapped_in_subselect_item() + { + return args[1]; + } }; @@ -878,6 +885,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"; } @@ -1309,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) { @@ -1676,9 +1691,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)) && @@ -2255,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 6b444a7e86d7324a63a835a59c3272711b533412..05a34a9a24a9e71ba7b5764b9cd418e0f0aa67e4 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(); @@ -550,6 +552,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 +569,7 @@ void Item_udf_func::fix_num_length_and_dec() max_length= float_length(NOT_FIXED_DEC); } } +#endif /** @@ -3504,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 1209fc5cdd8624353badbfc4ee10ecc49e4b3074..3219c813821ad2b48b928df3c24d038ba8f7e42f 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 97f75c4b4cf1ac622ed5b39ef469b31b11416e5e..8c6edacad7f50b639bfaec90c13787e57984d249 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 a89c51ad87b258898c119a39c9a7c18793a99a5f..db1ba15214fb2bcefd00b3ffae0671a4698c61ab 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; @@ -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; @@ -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 (res != str) + str->copy(res->ptr(), res->length(), res->charset()); - 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 (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; @@ -2849,6 +2794,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 +4373,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 +4384,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 +4607,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 +4708,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 +4718,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 +5161,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 +5170,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 95eac328a47ecd4aeb5cae63f8e7eb08123a2a2e..49faed2fec17ab9fffb4f90ebe60d1dce7f2ad3c 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"; } }; @@ -230,6 +231,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) {} @@ -784,6 +786,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); }; @@ -1239,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) @@ -1283,14 +1288,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 +1328,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_subselect.cc b/sql/item_subselect.cc index 1c1f09c45676abce04e6e89c57298950f641e598..b275f749f250c5983ea8b7eb8a5f26b9a3ea4bc4 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(); @@ -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_sum.cc b/sql/item_sum.cc index 1a4fe3b0ccca503acd30f03e2148e0078f9f5f90..b4e31ba012f26d5543167f11a59a84d0b044d75d 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 */ @@ -3594,7 +3597,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/item_timefunc.cc b/sql/item_timefunc.cc index 4a94c3a5f89dd6c6155e8a53dbf70bd359ac0498..44105bd4a1257b0a2b16061edb27c1e311328230 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/item_xmlfunc.cc b/sql/item_xmlfunc.cc index 0741da155ac4c15257fa47436aa98d217dc19a9c..c9e6df52de987857626be6eab6866b5ac50a4ad6 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 3758025fc90bf24fc3359e13d396a090eca3c5a4..92a8f7578224096c75573aec5c63605ab2fb8123 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 1b00e951de0ddafc7d9fcbd86a3dea0fc11c42ae..523ddf98640fc9407a735f5c7717696d68818188 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/lex.h b/sql/lex.h index 85bd20a5f3778fd3ef1b63d141b7ebaa9efe3124..6a1cb6653e9da1844546410f4cbd5ec622ffb845 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 a9f486d88c157c8080a7240ca0286297dd537ac6..bcfaf5174daac9496664f612b269d7b7ca14a721 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, @@ -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); @@ -6622,6 +6706,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 +6829,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 +6840,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 +7249,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; @@ -8754,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; @@ -9367,11 +9580,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 +9665,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 +10443,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 bf076fae31dbde20ee5976a1f4990742e8b5dc33..2118bd7a05960f3df38f07897d8e910c5d9f8bdf 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 @@ -755,7 +761,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 +1171,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/log_event.cc b/sql/log_event.cc index f2f7b8776718c6e0cc14016661ac8b2a59bc1d9f..e70d97c54c011525ec2c88823a6314cfccb22b6a 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. @@ -4184,8 +4204,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; @@ -4234,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' */ @@ -4375,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. @@ -4917,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); @@ -5824,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;); @@ -7800,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; /* @@ -7857,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 + @@ -8071,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; @@ -8086,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 @@ -8099,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); @@ -9465,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, @@ -9514,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 abd489773f6d26475384e6b26043e8ce7c40af1b..d2b4470bbf93ed5b2a63ef955dbe59372c30b192 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 56515d42c58a8b7e79b635e7eec0a647d819bc24..86fc5fa39fcd856faf3871e3ddcbebcf1020bc70 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 ae314d826a00be497b6e38b8c710ad54de87e100..f26a437a25a523475ca505dfeb502118a8ecf205 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 120b4c103addbee63705b862cc36f73da570d1e5..e0f6ed4daa8e94811d9dd1599e18e462fbf36c0c 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 36de05e54e4483d124d562812105aea8b284692a..9bb608092059dbea3d0878a05257b09b30b5bf9d 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 8b7fdd2f7058a01cfcd6476de97ff8242d40b5a3..5bf5e3f73fcdb1a73352a5e367204d18ce0a8794 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; @@ -3542,8 +3552,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 +3559,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 +3614,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 +3626,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); @@ -4115,7 +4106,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; } @@ -4306,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 @@ -4322,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))) @@ -5530,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; @@ -5890,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(); @@ -6480,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; @@ -6698,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 0725d862553d09e4c2e279e8c1f8fa863f648f05..97ecf88978705735f720907c314203a3a834a43d 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/net_serv.cc b/sql/net_serv.cc index ed283863d315b73e3e3f23debb89d87a4bd0793e..6d200f55655bbdbade01c02ca99ecec2d18f896a 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 5377e4e4aea32187be3da7f14b79f9dda263dd7c..0315b91b8be653f5677122c36b06c7eabb08690e 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 138af3f14b33fb096d551bf53a173dabaf412bad..89338928cb5c48c25864663424fac9619e412bb5 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; @@ -2704,7 +2710,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 +2722,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 +2774,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 { @@ -3706,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; @@ -5940,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 ce9329e8f6ab7e850f6bfdde32575b6e7a0c8461..df0a733f1214c0fc5a5908141abf996b00500f86 100644 --- a/sql/partition_info.cc +++ b/sql/partition_info.cc @@ -2743,6 +2743,7 @@ bool partition_info::fix_column_value_functions(THD *thd, DBUG_RETURN(result); } + /** Fix partition data from parser. @@ -2832,6 +2833,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++) @@ -3191,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/partition_info.h b/sql/partition_info.h index ec7374b3e3ee7e17c7b9784683b778e2d77848c9..b271ff08e82e1cd22ee8200259e80cde4b37d03e 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 51df8f1a789ba7b1fe89addf8f7a01a1a1ea233d..7b1acf17ef5ad926d297f9a5ba84032be6fdaf90 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 ece6effbef6fe1510de14f1343bba2647635eb81..79d566bddbfd6b0a38979d3345d871d1639cdda7 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/set_var.h b/sql/set_var.h index cf86ecf18fa3b9a73e55e06ede8c1abaab918fbc..203969d616912df8ba675b2cae7545ac2a2a18cd 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 d335b0b420b8353221ba33d2ce678264eca5d2c9..d73a22c80dc98799bd2c8d31e4481c592ab3abe4 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" @@ -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" @@ -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/slave.cc b/sql/slave.cc index da394ff711e932cb1b1121b7fb5f1623aa395158..6fe6de6872a3a34db054c64ee9e571c785324d5c 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 5a64c28865e429166fb6018238affe0fd63458db..a5a14ec8d85b81aa2611120e18468f49c2a19757 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, ...); @@ -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 257a1d36a2a3f496eca7bbcd68a27ae409b94649..0d24ed04eaee9967c6843cf057d012e989ae7f32 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) @@ -2099,26 +2099,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/sp_head.h b/sql/sp_head.h index 5d3697daa169c7bb340e746678bd59994350f5b6..604190079cbee90710a2df98a1356f308789610f 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 5ccc5f7511872164f47e995bc0a3be9d4c81e8fb..a5c91b499517bfb674146bae0f783301a7b815e8 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 @@ -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,9 +5668,12 @@ 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 + 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) @@ -6743,11 +6763,10 @@ 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 propagate_role_grants_action(void *role_ptr, + void *ptr __attribute__((unused))) { - ACL_ROLE *role= (ACL_ROLE *)ptr; + ACL_ROLE *role= static_cast(role_ptr); if (role->counter) return 0; @@ -6820,7 +6839,7 @@ bool grant_reload(THD *thd) } mysql_mutex_lock(&acl_cache->lock); - my_hash_iterate(&acl_roles, role_propagate_grants_action, NULL); + my_hash_iterate(&acl_roles, propagate_role_grants_action, NULL); mysql_mutex_unlock(&acl_cache->lock); mysql_rwlock_unlock(&LOCK_grant); @@ -9507,13 +9526,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) @@ -11456,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 0888f012ddade716dfcff37ca7dbd118e0c9eb64..be23cd3341bf2137e4f0f169f0c9c0f10fb98330 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) @@ -663,8 +664,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. */ @@ -1103,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 @@ -1114,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); @@ -1148,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 bff45e089a4b288592ebfd08d9804f8560112fc0..f17931ae919e3334f18352b256e00e33b381d3fe 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 098e99e88fcb031b4378ab4a81aae68c94ee0520..68299d024fdb0c8332cc0af62610d26f5eeff96e 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 d3d33e04d002c5d4ae4a04fcf866ebeb659df143..c2bf37a10649b1088f8075b43d0fd2e8618b321f 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 @@ -9215,7 +9241,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_base.h b/sql/sql_base.h index c73ea3745071969d4ad593a8f1b9d5f9754abd77..74154184ebcb3e8f5a492c41f93c4854110748e5 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_cache.cc b/sql/sql_cache.cc index 66ac2449519a108d07b20d6ba5dd68e8ededf9bf..df6c7c35e5a85bd9ef86f4767231cc3fefa242ad 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 2ebcea2d6f48a0d05cdca42d58e0644560727182..0a95d2e2cc59b090172b2906da69e6ef41a76ee1 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 */ @@ -2657,6 +2556,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 +2570,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 +2598,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,17 +2610,22 @@ 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; } void THD::rollback_item_tree_changes() { + DBUG_ENTER("THD::rollback_item_tree_changes"); I_List_iterator it(change_list); Item_change_record *change; - DBUG_ENTER("rollback_item_tree_changes"); 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; @@ -7093,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 4556487bdfecb0dced88977698ea445ad211168a..fb3604b899b28e8e56d94363ee4216aad6d0d1d6 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -1177,6 +1177,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); @@ -1659,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); @@ -2690,7 +2713,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 @@ -2918,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 @@ -3399,10 +3422,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 @@ -4064,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; @@ -4142,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 ac5b6ab29a247bb5b3aa8fa606ed72da96e08bf9..abb234ab4b1f0d5b7f394cf828ccd21251a05dde 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); } @@ -1354,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 946cf13e2ae95c34db04d5dd5b1262f9abf84a4c..0cd214d8bc7d43cbdd04f651a1dab7e430cd85a4 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_cursor.cc b/sql/sql_cursor.cc index a8c5569ba4a8bf2f61e165ae1ef7cf3ec8601ec2..69781b5def3c0185cf5e8fa3755aeb063ea51729 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_delete.cc b/sql/sql_delete.cc index bc067b667a69b5718c0991cf863fbb5d265be2f3..453d7ffdc0157ebbc75258d351d1227e0a2159f4 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_derived.cc b/sql/sql_derived.cc index 5a0879c20c495eb327bde915220ba8d7725c1e7c..b29e676bfc7ea4d74cf4752a8b0b3311835b3d9a 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.cc b/sql/sql_explain.cc index ac6bee050014fdcb7876d5616be8159f1b89dc0d..82107f9b922d752a17d2765e35f5a58dbffac374 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_explain.h b/sql/sql_explain.h index 4d0ba38d8107f356a1bc06a4dddda18f8aa09691..caacf6b3a2fe24d03d1885a58740982ff2666d1a 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_handler.cc b/sql/sql_handler.cc index 662fa33dc9f5e3a2c3804115cfd1021b51941e1c..5a022ba72cfa4342db4cda9791ecfaff2748ccd0 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 c39860593b681f64c581a85bd03a1cba20f97036..e103c3b390cf894e37cea81cebfbef3782717a02 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 @@ -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_join_cache.cc b/sql/sql_join_cache.cc index 75e692988098caf334786d46efee5388e6635352..4b7667f1319996f524e1e2a7a8816d3694125b24 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 8edd9b3fbd8595ed4cbff82728097381c71c74f4..085ad1a4b3bbb14bd44d88e7ba702e58a57a5b88 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,9 +657,11 @@ void lex_start(THD *thd) { LEX *lex= thd->lex; DBUG_ENTER("lex_start"); + 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(); @@ -668,6 +670,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(); @@ -800,6 +803,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 +2882,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 116ac815ec003e80a6f3199c908e7c5d3d44bef6..3b47b1d25c98524660dc156f2c32a94e87282cd0 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 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. + */ LEX *parent_lex; enum olap_type olap; /* FROM clause - points to the beginning of the TABLE_LIST::next_local list. */ @@ -2429,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; @@ -2452,7 +2473,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; @@ -2726,6 +2747,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_lifo_buffer.h b/sql/sql_lifo_buffer.h index 8fa13c66dd936c8404f25fddcd5ea4dd333678a5..17024d15beb59736116a372e3cc14ea1feaae827 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 6f01b64df7075876c39c353585028fc6566da148..7fb9c19d2cf061b3c34f3bf8b07f5ef4654daa25 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 7337a8aeb210362fd82e2a8bde1800f39cf021bc..89b5adff60ce78436f7f500ba236e638d0d4e9e0 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; @@ -1957,11 +1972,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; @@ -2459,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 @@ -2652,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]); @@ -2901,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: @@ -3400,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); @@ -3946,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) && @@ -4564,7 +4579,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 +4612,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 +5054,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 +5103,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 +5517,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 +5532,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 +5539,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 +5603,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); @@ -5704,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) @@ -5720,8 +5740,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)) { /* @@ -5972,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) { @@ -5988,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) && @@ -6900,7 +6981,13 @@ 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. + */ + 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. @@ -7018,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->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(); @@ -7163,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); @@ -7177,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); } @@ -7185,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)) @@ -7213,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); @@ -8177,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 da9721df0b707665ed0efe0371008a4ac1c43501..602a3e8d788067e7affb043deacd2d4cdd9ab409 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 dc5e7fe1a1a96fff005118b6227f3b8bab31deb9..65c76127de9e02ed350c1f369d551559f66ea8a2 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 @@ -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))) @@ -4882,16 +4887,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; } @@ -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) @@ -6831,10 +6831,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_partition_admin.cc b/sql/sql_partition_admin.cc index e850677f8d947d1932ca29f99cca153b17e6b66b..1ac9e748d4215070b584b372ba9e20d6f4db4e1b 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 f41d1e0fdbf56b93d8ad0784f9d44a25ed8ed40a..7e4be9aed167c867ca34dffdceeff5b7eb58c521 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 @@ -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 */ @@ -2108,11 +2113,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); + + 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, @@ -2146,8 +2156,7 @@ 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 +2187,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,17 +2257,32 @@ 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); 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) /* 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); + 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. @@ -2276,8 +2304,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 +2333,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_prepare.cc b/sql/sql_prepare.cc index e5b85c3be4504201bec4ddd4392a58d4f4d8b253..92d2b1c68b0ab82b608d5edce617e71ad60ccf2e 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, @@ -2750,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 */ @@ -2758,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; } @@ -3053,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. @@ -3563,9 +3587,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 +3673,7 @@ bool Prepared_statement::prepare(const char *packet, uint packet_len) if (! (lex= new (mem_root) st_lex_local)) DBUG_RETURN(TRUE); + lex->stmt_lex= lex; if (set_db(thd->db, thd->db_length)) DBUG_RETURN(TRUE); @@ -3754,8 +3779,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 +3914,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) { @@ -3936,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: @@ -3952,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 */ @@ -3974,7 +3996,6 @@ Prepared_statement::execute_loop(String *expanded_query, return error; } - bool Prepared_statement::execute_server_runnable(Server_runnable *server_runnable) { @@ -4184,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= @@ -4306,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; } } @@ -4344,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 ef3dd68065a911f4c078f4a0e389f1269800c100..e30060c8d3e7cf6436cfd004ab2c6ddeae11ee14 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_reload.cc b/sql/sql_reload.cc index d68ce96dc85a1b14f4526a4002f15a8af3f66fb2..73dd9679ed748f070933336ef99a191725d8dfa7 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_rename.cc b/sql/sql_rename.cc index 35222bce949045698790b6b05698881cededcd55..4c164a3a621522e6bdc8b269962c562608279716 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 764047e47206bc9edc10e96ab8becf9a5c15ae85..569c3d2c4ef1b6cb80dd561991cf0e6797a5f61e 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) @@ -1970,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_repl.h b/sql/sql_repl.h index e2000bbca73aba931d64e0bb877cd974ce9274c5..37acff3141f244afc81232cb1e597f6e9a75f80e 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_select.cc b/sql/sql_select.cc index b9fe8f3162a0c9b343ef44f8a9bf763ef7fd5af2..c52f74fbd4a3270fcb4b5a6d6d8150ae269a2593 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(); } @@ -1135,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 */ @@ -1199,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); @@ -1237,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; @@ -2323,8 +2345,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 +2487,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 +10475,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 +12294,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 +12670,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 +15669,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 +16878,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 +22170,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 +22184,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 +22308,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 +22341,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 +22399,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 +22718,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 +24645,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; @@ -25425,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)); @@ -25477,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_select.h b/sql/sql_select.h index 7b9c03824ebc7cfe55d6f90108bdfd30ca885d17..8c55528e12040c981c7253fea3e81e681c823f1f 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 2c02f9326db876f4f42e98c54c8c80761a1dfedd..bbf2cb30b978513e7375171f859675cc934ec17f 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; @@ -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 1e8e959314b7c2d670d0ed76e84c29e3088184a7..b7ccbb5c212b3d3778f9c00257b1704a799c5bf5 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 20772adcb22ce558a8a0c6e9c3627b9ee3e1a07e..c22e33182c6ab9644e53d271004c89580eacc41b 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_string.h b/sql/sql_string.h index 51a11c7a4ffa337cb2624d9333d33b54dae13e7c..b8979d397e662b53362d189eb62e84833f5d6dac 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 24b86169d0fa224cd39eff8f2b574428fcb66df5..3c9146354d609a4ec5c636e6b21aae08c2f4175d 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 @@ -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, @@ -4197,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, @@ -4414,10 +4415,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))) @@ -5073,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; @@ -5431,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 @@ -5837,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) { @@ -5917,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 */ @@ -5938,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; @@ -6040,6 +6062,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 */ @@ -6060,7 +6083,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; } } @@ -7295,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 ? */ } @@ -9301,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); @@ -9415,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); } @@ -9473,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; @@ -9481,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); @@ -9499,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; @@ -9682,11 +9711,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)); } @@ -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 2e2c5932c2a7ca4f98945d5493299ee7b0ce899a..6323538f193cf62bc7c87a7b082b8d5d5b1fef13 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 28e59319a5020f26004e8a415bccc7b38dbc6c71..d9999e2aab7dd31dd9ac01152401018aa81c8818 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 @@ -502,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); @@ -575,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(); /* @@ -606,8 +608,13 @@ 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 */ } + /** Build stmt_query to write it in the bin-log and get the trigger definer. @@ -1055,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; @@ -1368,7 +1380,8 @@ 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; + LEX lex; sp_rcontext *save_spcont= thd->spcont; ulonglong save_sql_mode= thd->variables.sql_mode; LEX_STRING *on_table_name; diff --git a/sql/sql_truncate.cc b/sql/sql_truncate.cc index c08c75f771abde1095d5d7d672e700a805cea992..8a70e6f6bdbc0200c9abcea39b4df1eda2b2ce28 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_union.cc b/sql/sql_union.cc index 9d825f55fcb3c53a3538870a936a37dc0b00a198..e12cae0f80e9830e3ddab3e8bdabcc163a2c3885 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 e1d22e6a1e9ff95c477da8b873b6d1a898804bed..db9f9013188235a3698411d887745d485325b8a9 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 90c94e6a50389ac66af2a331d7c7586cfe8f5a46..6bd6b6a7b639dadefa6754922bf883cee3a31315 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -428,6 +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); /* ignore lock specs for CREATE statement @@ -690,6 +691,10 @@ 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); @@ -1181,8 +1186,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); } @@ -1311,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) { @@ -1336,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->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 @@ -1371,9 +1376,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/sql_yacc.cc b/sql/sql_yacc.cc index 27d63955c1c6d34fcb66637ee38cb873ff802c84..caac1c428ff2cb2107678104f702e31209d924a5 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, 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 @@ -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,10223 +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, - 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, - 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, -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, 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, 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, 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, @@ -16119,127 +13612,193 @@ 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, -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, 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, + 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, 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 +13808,124 @@ 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, 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, -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, 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, -1, 38, -1, -1, -1, 42, -1, -1, 45, 46, 47, -1, 49, -1, 51, 52, -1, -1, 55, @@ -16376,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, -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, -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, @@ -16503,59 +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, 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, 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, -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,58 +14898,440 @@ 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, @@ -16629,125 +15343,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, 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, -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, 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, @@ -16757,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, -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, -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, @@ -16884,124 +15980,315 @@ 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, 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, -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, 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, @@ -17011,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, -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, -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, @@ -17138,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, - 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, -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, @@ -17265,375 +16934,630 @@ 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, -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, + 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, - 46, 47, -1, 49, -1, -1, -1, -1, -1, 55, - 56, -1, 58, 59, -1, 61, -1, -1, -1, -1, + 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, - -1, -1, -1, -1, -1, -1, 82, -1, 84, -1, + 76, 77, 78, 79, 80, -1, 82, 83, 84, 85, 86, 87, 88, 89, -1, 91, 92, -1, 94, 95, - 96, -1, 98, -1, 100, -1, -1, 103, -1, -1, + 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, -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, 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, -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,13 +38796,18 @@ 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); + 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) { @@ -38742,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 38746 "/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 2538: -#line 14500 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2544: +#line 14521 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; CHARSET_INFO *cs2; @@ -38760,11 +38835,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 38839 "/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 14535 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_pcontext *spc= lex->spcont; @@ -38779,11 +38854,11 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } -#line 38783 "/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 2540: -#line 14529 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2546: +#line 14550 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; CHARSET_INFO *cs2; @@ -38802,11 +38877,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 38881 "/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 14569 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex = Lex; LEX_USER *user; @@ -38823,11 +38898,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 38902 "/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 14586 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex = Lex; set_var_default_role *var= (new (thd->mem_root) @@ -38839,11 +38914,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 38918 "/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 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)); @@ -38851,11 +38926,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 38930 "/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 14606 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex = Lex; set_var_password *var= (new (thd->mem_root) @@ -38867,11 +38942,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 38946 "/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 14622 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { sp_pcontext *spc= thd->lex->spcont; sp_variable *spv; @@ -38897,11 +38972,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 38976 "/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 14648 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (check_reserved_words(&(yyvsp[-2].lex_str))) @@ -38938,11 +39013,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 39017 "/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 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) @@ -38953,11 +39028,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 39032 "/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 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)); @@ -38972,11 +39047,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 39051 "/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 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)); @@ -38991,47 +39066,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 39070 "/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 14741 "/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 39076 "/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 14742 "/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 39082 "/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 14746 "/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 39088 "/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 14747 "/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 39094 "/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 14748 "/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 39100 "/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 14749 "/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 39106 "/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 14754 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; sp_pcontext *spc= lex->spcont; @@ -39045,82 +39120,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 39124 "/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 14767 "/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 39130 "/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 14771 "/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 39136 "/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 14772 "/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 39142 "/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 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 39078 "/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 2565: -#line 14762 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2571: +#line 14783 "/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 39159 "/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 14784 "/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 39165 "/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 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 39100 "/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 2568: -#line 14771 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2574: +#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 39110 "/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 2569: -#line 14777 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2575: +#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 39120 "/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 2570: -#line 14788 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2576: +#line 14809 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; @@ -39128,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 39132 "/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 2571: -#line 14796 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2577: +#line 14817 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39138 "/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 2572: -#line 14800 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2578: +#line 14821 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 39144 "/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 2573: -#line 14801 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2579: +#line 14822 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { } -#line 39150 "/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 2576: -#line 14811 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2582: +#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); @@ -39162,43 +39237,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 39241 "/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 14846 "/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 39247 "/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 14847 "/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 39253 "/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 14849 "/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 39261 "/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 14853 "/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 39267 "/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 14854 "/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 39273 "/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 14859 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; @@ -39206,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 39210 "/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 2583: -#line 14846 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2589: +#line 14867 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39216 "/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 2584: -#line 14855 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2590: +#line 14876 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->sphead) @@ -39225,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 39229 "/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 2585: -#line 14864 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2591: +#line 14885 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->sphead) @@ -39238,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 39242 "/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 2586: -#line 14873 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2592: +#line 14894 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (lex->sphead) @@ -39259,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 39263 "/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 2587: -#line 14890 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2593: +#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. */ @@ -39274,59 +39349,59 @@ YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); MYSQL_YYABORT; } } -#line 39278 "/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 2588: -#line 14903 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2594: +#line 14924 "/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 39359 "/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 14925 "/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 39365 "/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 14929 "/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 39371 "/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 14930 "/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 39377 "/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 14934 "/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 39383 "/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 14935 "/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 39389 "/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 14936 "/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 39395 "/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 14937 "/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 39401 "/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 14939 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->ha_read_mode = RKEY; @@ -39334,63 +39409,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 39413 "/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 14947 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39344 "/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 2598: -#line 14930 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2604: +#line 14951 "/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 39425 "/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 14952 "/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 39431 "/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 14953 "/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 39437 "/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 14954 "/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 39443 "/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 14955 "/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 39449 "/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 14962 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39380 "/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 2604: -#line 14946 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2610: +#line 14967 "/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 39465 "/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 14973 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->columns.elements) @@ -39401,11 +39476,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 39480 "/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 14984 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->columns.elements) @@ -39416,68 +39491,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 39495 "/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 14995 "/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 39503 "/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 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 39439 "/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 2609: -#line 14985 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2615: +#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 39449 "/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 2610: -#line 14994 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2616: +#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 39455 "/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 2611: -#line 14996 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2617: +#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 39461 "/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 2612: -#line 15001 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2618: +#line 15022 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39467 "/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 2613: -#line 15007 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2619: +#line 15028 "/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 39552 "/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 15035 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->columns.elements) @@ -39488,11 +39563,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 39567 "/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 15047 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; if (lex->columns.elements) @@ -39503,22 +39578,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 39582 "/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 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 39518 "/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 2617: -#line 15044 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2623: +#line 15065 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->sql_command= SQLCOM_GRANT_ROLE; @@ -39526,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 39530 "/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 2618: -#line 15055 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2624: +#line 15076 "/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 39611 "/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 15077 "/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 39617 "/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 15080 "/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 39623 "/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 15081 "/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 39629 "/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 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 39563 "/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 2623: -#line 15069 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2629: +#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 39572 "/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 2624: -#line 15077 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2630: +#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 39583 "/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 2625: -#line 15087 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2631: +#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) */ @@ -39602,275 +39677,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 39681 "/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 15135 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39612 "/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 2630: -#line 15116 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2636: +#line 15137 "/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 39696 "/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 15155 "/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 39702 "/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 15156 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39633 "/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 2637: -#line 15137 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2643: +#line 15158 "/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 39714 "/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 15159 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39645 "/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 2639: -#line 15140 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2645: +#line 15161 "/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 39726 "/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 15162 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39657 "/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 2641: -#line 15143 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2647: +#line 15164 "/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 39738 "/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 15165 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39669 "/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 2643: -#line 15145 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2649: +#line 15166 "/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 39750 "/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 15167 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39681 "/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 2645: -#line 15147 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2651: +#line 15168 "/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 39762 "/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 15169 "/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 39768 "/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 15170 "/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 39774 "/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 15171 "/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 39780 "/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 15172 "/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 39786 "/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 15173 "/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 39792 "/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 15174 "/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 39798 "/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 15175 "/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 39804 "/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 15176 "/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 39810 "/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 15177 "/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 39816 "/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 15178 "/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 39822 "/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 15179 "/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 39828 "/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 15180 "/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 39834 "/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 15181 "/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 39840 "/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 15182 "/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 39846 "/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 15183 "/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 39852 "/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 15184 "/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 39858 "/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 15185 "/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 39864 "/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 15186 "/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 39870 "/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 15187 "/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 39876 "/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 15188 "/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 39882 "/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 15189 "/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 39888 "/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 15190 "/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 39894 "/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 15191 "/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 39900 "/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 15195 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39831 "/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 2670: -#line 15175 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2676: +#line 15196 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 39837 "/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 2673: -#line 15185 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2679: +#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 39848 "/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 2674: -#line 15192 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2680: +#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 39859 "/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 2675: -#line 15199 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2681: +#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 39870 "/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 2676: -#line 15209 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2682: +#line 15230 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; size_t dummy; @@ -39881,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 39885 "/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 2677: -#line 15220 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2683: +#line 15241 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->current_select->db = (yyvsp[-2].lex_str).str; @@ -39894,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 39898 "/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 2678: -#line 15229 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2684: +#line 15250 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->current_select->db = NULL; @@ -39907,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 39911 "/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 2679: -#line 15238 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2685: +#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, @@ -39920,120 +39995,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 39999 "/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 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 39933 "/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 2681: -#line 15255 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2687: +#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 39942 "/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 2682: -#line 15263 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2688: +#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 39951 "/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 2683: -#line 15268 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2689: +#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 39960 "/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 2684: -#line 15276 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2690: +#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 39969 "/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 2685: -#line 15281 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2691: +#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 39978 "/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 2690: -#line 15292 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2696: +#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 39989 "/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 2691: -#line 15299 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2697: +#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 39998 "/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 2692: -#line 15304 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2698: +#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 40008 "/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 2693: -#line 15310 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2699: +#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 40018 "/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 2694: -#line 15316 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2700: +#line 15337 "/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 40099 "/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 15342 "/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 40108 "/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 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) @@ -40059,227 +40134,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 40138 "/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 15386 "/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 40146 "/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 15390 "/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 40154 "/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 15394 "/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 40162 "/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 15398 "/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 40170 "/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 15404 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40101 "/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 2707: -#line 15388 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2713: +#line 15409 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40107 "/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 2708: -#line 15389 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2714: +#line 15410 "/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 40188 "/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 15414 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40119 "/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 2710: -#line 15394 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2716: +#line 15415 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40125 "/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 2711: -#line 15398 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2717: +#line 15419 "/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 40206 "/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 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 40141 "/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 2713: -#line 15406 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2719: +#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 40151 "/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 2714: -#line 15412 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2720: +#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 40161 "/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 2715: -#line 15418 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2721: +#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 40171 "/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 2716: -#line 15424 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2722: +#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 40181 "/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 2717: -#line 15433 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2723: +#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 40191 "/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 2718: -#line 15438 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2724: +#line 15459 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40197 "/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 2719: -#line 15443 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2725: +#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 40207 "/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 2720: -#line 15451 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2726: +#line 15472 "/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 40288 "/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 15473 "/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 40294 "/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 15477 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40225 "/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 2723: -#line 15457 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2729: +#line 15478 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40231 "/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 2724: -#line 15462 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2730: +#line 15483 "/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 40312 "/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 15484 "/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 40318 "/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 15485 "/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 40324 "/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 15490 "/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 40330 "/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 15491 "/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 40336 "/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 15492 "/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 40342 "/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 15496 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40273 "/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 2731: -#line 15476 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2737: +#line 15497 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40279 "/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 2732: -#line 15481 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2738: +#line 15502 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_COMMIT; @@ -40288,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 40292 "/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 2733: -#line 15493 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2739: +#line 15514 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; lex->sql_command= SQLCOM_ROLLBACK; @@ -40301,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 40305 "/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 2734: -#line 15503 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2740: +#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 40315 "/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 2735: -#line 15512 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2741: +#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 40325 "/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 2736: -#line 15521 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2742: +#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 40335 "/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 2737: -#line 15534 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2743: +#line 15555 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40341 "/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 2739: -#line 15540 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2745: +#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 40350 "/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 2740: -#line 15545 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2746: +#line 15566 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* Remove from the name resolution context stack the context of the @@ -40358,29 +40433,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 40437 "/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 15577 "/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 40443 "/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 15581 "/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 40449 "/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 15582 "/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 40455 "/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 15586 "/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 +40469,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 40473 "/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 15600 "/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 40482 "/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 15612 "/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 40488 "/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 15613 "/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 40494 "/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 15614 "/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 40500 "/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 15620 "/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 40508 "/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 15625 "/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 40516 "/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 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 40450 "/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 2756: -#line 15618 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2762: +#line 15639 "/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 40534 "/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 15648 "/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 40542 "/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 15654 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; if (!lex->expr_allows_subselect || @@ -40486,11 +40561,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 40565 "/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 15675 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex=Lex; @@ -40513,17 +40588,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 40592 "/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 15710 "/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 40598 "/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 15712 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { if (check_simple_select()) MYSQL_YYABORT; @@ -40531,73 +40606,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 40610 "/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 15719 "/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 40616 "/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 15720 "/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 40622 "/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 15721 "/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 40628 "/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 15723 "/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 40638 "/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 15729 "/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 40648 "/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 15734 "/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 40654 "/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 15745 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40585 "/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 2773: -#line 15726 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2779: +#line 15747 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40591 "/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 2774: -#line 15728 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2780: +#line 15749 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40597 "/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 2788: -#line 15761 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2794: +#line 15782 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* We have to distinguish missing DEFINER-clause from case when @@ -40608,58 +40683,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 40687 "/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 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 40623 "/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 2790: -#line 15791 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2796: +#line 15812 "/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 40704 "/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 15814 "/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 40710 "/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 15816 "/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 40716 "/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 15821 "/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 40722 "/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 15823 "/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 40728 "/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 15825 "/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 40734 "/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 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))) @@ -40673,37 +40748,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 40752 "/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 15848 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 40683 "/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 2800: -#line 15833 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2806: +#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 40693 "/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 2801: -#line 15839 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2807: +#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 40703 "/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 2802: -#line 15847 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2808: +#line 15868 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; lex->parsing_options.allows_variable= FALSE; @@ -40712,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 40716 "/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 2803: -#line 15856 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2809: +#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; @@ -40729,60 +40804,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 40808 "/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 15898 "/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 40814 "/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 15900 "/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 40820 "/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 15902 "/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 40826 "/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 15904 "/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 40832 "/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 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 40766 "/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 2811: -#line 15905 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2817: +#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 40774 "/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 2812: -#line 15911 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2818: +#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 40782 "/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 2813: -#line 15916 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2819: +#line 15937 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* $17 */ LEX *lex= thd->lex; Lex_input_stream *lip= YYLIP; @@ -40800,11 +40875,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 40879 "/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 15955 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* $19 */ LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -40828,23 +40903,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 40907 "/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 15987 "/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 40913 "/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 15988 "/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 40919 "/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 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))) @@ -40856,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 40860 "/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 2818: -#line 15991 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2824: +#line 16012 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { /* $5 */ LEX *lex= Lex; Lex_input_stream *lip= YYLIP; @@ -40880,50 +40955,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 40959 "/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 16033 "/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 40967 "/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 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 40902 "/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 2821: -#line 16022 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2827: +#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 40912 "/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 2822: -#line 16028 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2828: +#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 40923 "/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 2823: -#line 16035 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2829: +#line 16056 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= thd->lex; sp_head *sp= lex->sphead; @@ -40972,11 +41047,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 41051 "/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 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; @@ -40988,11 +41063,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 41067 "/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 16120 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { const char* tmp_param_begin; @@ -41000,27 +41075,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 41079 "/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 16129 "/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 41087 "/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 16133 "/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 41095 "/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 16137 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ { LEX *lex= Lex; sp_head *sp= lex->sphead; @@ -41029,209 +41104,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 41108 "/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 16151 "/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 41116 "/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 16155 "/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 41124 "/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 16159 "/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 41132 "/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 16163 "/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 41140 "/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 16167 "/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 41148 "/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 16171 "/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 41156 "/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 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 41092 "/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 2836: -#line 16164 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2842: +#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 41103 "/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 2837: -#line 16171 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2843: +#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 41114 "/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 2838: -#line 16180 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2844: +#line 16201 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 41120 "/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 2839: -#line 16181 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2845: +#line 16202 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 41126 "/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 2840: -#line 16185 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2846: +#line 16206 "/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 41207 "/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 16207 "/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 41213 "/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 16208 "/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 41219 "/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 16212 "/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 41225 "/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 16213 "/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 41231 "/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 16218 "/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 41237 "/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 16220 "/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 41243 "/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 16225 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ {} -#line 41174 "/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 2849: -#line 16205 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2855: +#line 16226 "/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 41255 "/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 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 41191 "/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 2851: -#line 16217 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2857: +#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 41202 "/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 2852: -#line 16227 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2858: +#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 41212 "/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 2853: -#line 16233 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2859: +#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 41223 "/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 2854: -#line 16244 "/home/buildbot/git/sql/sql_yacc.yy" /* yacc.c:1646 */ + case 2860: +#line 16265 "/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 41306 "/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 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.h b/sql/sql_yacc.h index d9b7b90523008faca858473200093edaca0fec1b..c178abe6b71c8c0ea20aeb2bddba6b2a1da74e26 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 3fda8832f6b30665c0531a30158e73d9a8ec3e28..fcfc63439cb76e8fff8ac2c0e4f45c9b5643d3ff 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; } @@ -14487,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/structs.h b/sql/structs.h index c1c832d07ec1cd489f97ed82d1e985029b0efc7d..2ab102d82f919332e3c45e45977cb2ed180075a9 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 8eb3d35a96ed4b7647ef2b94390eae7d0158d7ed..5470acc789209da0c419f4f6f13e1db541f3ee8d 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)); @@ -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 ( @@ -4966,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 53d88bc02aa1429f4cb1b42f9b78abaec3d18c84..4407d631db80a5153a2d7b3c54794514ce270038 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 @@ -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); @@ -2232,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; @@ -2685,6 +2689,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 +2704,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)* @@ -3730,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) { @@ -3894,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); } @@ -4260,6 +4277,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()) @@ -5408,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. @@ -6337,6 +6359,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 + @@ -7330,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 7d9b5292a064c5310229f95ead2d6b32f15634df..bf9b55089ef72c1c1ff5fa391a6894ba5b24762e 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) {} }; @@ -2287,6 +2290,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 +2305,10 @@ struct TABLE_LIST void set_materialized_derived() { DBUG_ENTER("set_materialized_derived"); + 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/transaction.cc b/sql/transaction.cc index f03cced7bc8bc606b203f046d57d26c0b3905406..1744feea15151142edf4d78ee16193507825e174 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/tztime.cc b/sql/tztime.cc index bed5f416f13028ef37b0cf614caf13add47fcacf..7df2ad7d0e86dd620cabeb2cdb0e442beb19dccc 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/unireg.cc b/sql/unireg.cc index 66959f400d90915c595e1c66a2a811c28b41075a..e41cca2dfcb5e04c94371085de54677140dcdf47 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_applier.cc b/sql/wsrep_applier.cc index e5c95780df510e5ee47f37ee502dc8eb4d23a3c2..723804c76db9a340130955507f111560f9c77637 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 690c1a4b2a45eb8dbaf6804bbbbc91312bb67a03..28bd3a4492b280c55c2b17bdd0e1db91b08aaf9f 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 75c1526cb155d9d213f03e71278dabd717fa2b2b..e5c754a9d41f9a9d7aa10c24713221ef0a00d295 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 33689a91661ba656c7c772762d07a00377a35358..b127d3a8f002a0da636fd92c5fd32667e458ef10 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; @@ -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) @@ -1649,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) { @@ -1657,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); @@ -1776,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 || @@ -1800,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; } @@ -1815,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; } @@ -1824,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; } @@ -1976,7 +1986,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; @@ -1996,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; } @@ -2008,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; } @@ -2326,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; } @@ -2393,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 fd68fab991c278b6c8d874a3b76366534fc515ed..272e4ac4984b3211e5a9f00dec1c02feb1e0f29e 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 119f17c2afc1ebbca52bc5475138b96d27176d30..b00bfda16fab8e7287d6aef0b1d556f3379752fa 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 35f218e425f872b9135839488b2c3c87c8c97b1a..4df969496bcdf7bce28a18aa95900299f75c3336 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,42 +76,23 @@ 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); } } -// 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: @@ -177,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) @@ -574,15 +556,15 @@ 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, (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) @@ -860,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' " + 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_GTID " '%s:%lld' " + WSREP_SST_OPT_GTID_DOMAIN_ID " '%d'" "%s", addr, port, mysqld_port, mysqld_unix_port, wsrep_defaults_file, uuid_str, @@ -1223,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_sst.h b/sql/wsrep_sst.h index 49dd5b39fad79b25609ff99e96a7f69a21cb42bc..dcf0ff226515353ea9d141846210ee2d9cfbb71f 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/sql/wsrep_thd.cc b/sql/wsrep_thd.cc index 7b73273b8a99a3848aebb75da5dfa2fbd7e72781..eb26da6128273d01a08d99dd04a6fb53619ee253 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_utils.cc b/sql/wsrep_utils.cc index 580c8bbd55c1c51d6e34064cb106eebe76aa0735..8a72d754a43df0db3d485e8269494b89bfcf6267 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 b21041eb0f81e1fb62ea0b4a7bfbb72d45d485ea..216bab0cdcdcdc1f86a87469921a37d40edc678d 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; @@ -52,12 +53,31 @@ 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 (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" + " innodb_lock_schedule_algorithm=FCFS and restart.", MYF(0)); + return true; + } return false; } @@ -368,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 7530fd988701c5fdf652c9fdc587ed9f824c4827..53952173c8348779a0723800207e3ca1ccf1766e 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; @@ -92,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 1b15fa16ce49e49e447d8bc05b0a4b85b7232b95..e87bc70ade45dff5b4fb438b4579d0fb4e1f798d 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 6842319b86dfb369b516d0980a21f62bdb856072..d70757e8142a9f1e3b3db06268ceed0e8064dc77 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 69b2ef783168f6578d0db1659cea1f817f4252a8..6e8c8baf90e14c108e0c1c35f64ef027257dd4f8 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,9 +228,9 @@ 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_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 aaf1b7bf2f80ccf2d3c2d127cb53026fd82127c3..afa54fa42567eac7d44d303e64d22719b1b64f6e 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 Binary files a/storage/connect/JavaWrappers.jar and b/storage/connect/JavaWrappers.jar differ diff --git a/storage/connect/JdbcInterface.java b/storage/connect/JdbcInterface.java index a1b1360e6ea79cc4580bdc5c9829e59a1e8caf1c..72ee4ab0d39fec43711421f79932a84691a2c7c5 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 adce0616a1b15c99eed67d27287a7ab85acb0f3c..9f611eeb23b0dd32eed4d8235c8804166012aa07 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 639edf63a1a9fa81872d85d436f4e671b5d731b6..cd1785b48ac20f9aa02cdfc2b87617d2431787fc 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 802095f2f82f31cad45e16bc61d3bb718310e33a..76c9d09ac934cf7a0562bc8547cba6e4eea616e6 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 8ac7be80988b700eb26eedc2a325b0e793b39676..737c74c129360237187d18a053edeca5d7697e89 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 0c234dfb8b85a53aa5825e5fb13b76fed875a59b..9029e616bb656087eeeb9cfe39d83e017000d5e5 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 44fac56137f341a8639974e1571b749f6c1b89a6..edee1874b972b1d21c5225abd711e7f9e25eca43 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 2ffe51d2009c93f8631c914cacfc100c172d87f1..a9cf43f3d9678e4b4a94280f61c40c53e3bfc3b3 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 5e80201fccf0da6f18d2f09de3463e02c42fa096..39123b18c593f375ae3fe22b46076075802486c7 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 13f325d8f3f7a166347abba66b4d2270f5ce10c2..670131b8fd2f6d5bd8b1618e86bce0e2725b50f2 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 e24e10835c187a273cd74179d15a8054bf7a4120..ba8eb829abde08bd3718bfcc5eefa9390550cff3 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 84dff422db71be76074fadb3bf2055552ae77331..6e71e1bf2cd4faa3d721d63d46195207bf5e0ea3 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 44abd962c564faa7a09d8bcd8a087e67bac12004..893e3da0d46402d0f04d3b676500322c18279f9b 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 1d6194b154d30a211430e9427fe4eb0bb7378fcc..0a98ec5b54ad4ede7aa0cd315ca64140a7ef6e05 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 df366ef15f9b9bf02a31689abaf1ec283f81633b..880db54c91dab029a5a89d4a328425319130f712 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 c456ee9e9b72729d43205d658cdbbf983357e6ba..7c222eb3c80957cd12a7f43f5de02d28da2fffac 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 871613cb4b440c5187f00de718e21498e76e2c92..244acfdc5c87e2f133d2c9c92331cc2e7df68b9d 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 dfd9343af76ca260b94b980409d43bd2b6785902..e76dc496246631f5925fe9c02073bf4b7e8b6807 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 079128f9aa63a976f40967a1a2833fd116111156..469cd90d1d7cb81e27e2574f6d3cf38952c04ee6 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 64429d9b93ec13a82cb468272ad3299c6392809c..729b1b883c17197450231379bd71d5146b5e5cb6 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; @@ -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 */ @@ -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 de7a9fb3c0317461781fc67123d514102a6f5836..472d09408c3eea2c537e602aa87a7457af8a0c6e 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 */ @@ -217,16 +217,22 @@ 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); 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 787ec2affc1c9f19466a4c7eafed97aaffda7024..af329c0c8df694a96e64b0eb6ad6bc2791b14317 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= '/'; @@ -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, @@ -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,19 +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 - -#if defined(MONGO_SUPPORT) -// Enabling MONGO table type + "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, MONGO_ENABLED); -#endif // MONGO_SUPPORT + "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[]= @@ -408,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);} @@ -426,26 +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(MONGO_SUPPORT) -bool MongoEnabled(void) { return THDVAR(current_thd, enable_mongo); } -#endif // MONGO_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) @@ -737,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 @@ -829,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 : ""); @@ -885,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 : "", @@ -1097,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 @@ -1669,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 @@ -1765,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 @@ -2015,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) { @@ -2072,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, @@ -2596,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()); @@ -2637,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()); @@ -2666,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; @@ -2700,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 @@ -2747,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 @@ -2765,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; @@ -2791,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) { @@ -2804,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()); @@ -2890,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()); @@ -2927,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; @@ -2974,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()); @@ -3012,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 @@ -3020,7 +3038,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 +3096,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: @@ -3129,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; @@ -3162,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); @@ -3196,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); @@ -3222,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); @@ -3275,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'; @@ -3327,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())) @@ -3402,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) { @@ -3550,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 @@ -3611,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) { @@ -3664,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); @@ -3711,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; @@ -3754,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) { @@ -3918,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); @@ -4024,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", @@ -4068,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; @@ -4098,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); @@ -4164,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 @@ -4357,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)); @@ -4442,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)); @@ -4563,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; @@ -4641,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); @@ -4834,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); @@ -4867,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); @@ -5003,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); @@ -5114,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) { @@ -5143,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); @@ -5365,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, @@ -5398,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; @@ -5462,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")); @@ -5596,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); @@ -5775,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: @@ -5830,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); @@ -6078,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) { @@ -6152,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; @@ -6172,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()); @@ -6255,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; @@ -6521,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; @@ -6531,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); @@ -6539,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); @@ -6561,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) { @@ -6606,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))) { @@ -6646,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); @@ -6936,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, @@ -7200,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) @@ -7216,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.c b/storage/connect/inihandl.cpp similarity index 96% rename from storage/connect/inihandl.c rename to storage/connect/inihandl.cpp index 0ce0eb9fa0d6ad1ac972e8d135419ab979593f63..c039a980bcba894ae70a20c54cab92be1a014e22 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); @@ -292,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; @@ -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; @@ -335,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)"); @@ -358,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) { @@ -397,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); @@ -446,13 +447,13 @@ 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 */ 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; @@ -467,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)) { @@ -482,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 @@ -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 */ @@ -534,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); @@ -573,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)) { @@ -590,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 @@ -619,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 @@ -627,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 @@ -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 @@ -893,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) @@ -908,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) { @@ -981,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 ); @@ -1009,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, @@ -1017,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, @@ -1026,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) @@ -1039,20 +1040,20 @@ 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 = 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, '='))) { @@ -1344,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 90f834ef9a70c4bb0dd95c2b8edd89bc9b412627..d1be0ca1848ca38592f62f9057dd5944019d3c92 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 4c21c2c9681c1535a24be417a88690f7e3db299e..ddbc3115f0b166b4121e98a3e2c3406c86f86c48 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 56f318d238b54e95c92afd850528e0041d9fbad5..0c36cccadcf58fa173d16e6bfea7748f89877cd9 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 c7115cdd7202412fd6671412a115bc6ddb3424e5..30f6279146db452c243abb8483f1887da987e30d 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 4736641ef3f5c464d16c78d9bf414d4ffeab54c5..1731ccbeb8c2f525867cfeea214b3bdc042337f7 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 b86d2da21b7cafe23f67c2dc4d0942af87300af1..98a4659cea8ca1c01aa3536692f731d45f32a4fd 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 375532212c48e30305a107604ac8cb92653244b3..dcc97287420f6b898dfe1989ad9573b330895059 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 504ea837fee908018b9715fb2ceee798dd7b8df1..794a84f22c492fd8b3a874ba25581479daf72c01 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 @@ -1505,23 +1615,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; @@ -1541,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; @@ -1581,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 @@ -1672,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 @@ -1766,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. */ /*********************************************************************************/ @@ -1868,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); @@ -1898,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(); @@ -1922,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 @@ -1959,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); @@ -2001,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 @@ -2055,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); @@ -2094,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"); @@ -2193,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; @@ -2259,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; @@ -2319,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; @@ -2355,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) @@ -2401,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) @@ -2451,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; - for (uint i = 0; i < args->arg_count; i += 2) - objp->SetValue(g, MakeValue(g, args, i+1), MakePSZ(g, args, i)); + 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)); + + str = Serialize(g, objp, NULL, 0); + } // endif objp - str = Serialize(g, objp, NULL, 0); } // endif CheckMemory if (!str) @@ -2738,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. */ /*********************************************************************************/ @@ -2802,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 @@ -2812,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 @@ -2827,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 @@ -2841,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) @@ -2875,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 @@ -2900,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); @@ -2912,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) @@ -3058,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; @@ -3074,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; @@ -3095,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; @@ -3210,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 @@ -3227,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); @@ -3327,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; @@ -3346,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; @@ -3441,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; @@ -3460,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; @@ -3508,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; @@ -3536,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; @@ -3568,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); @@ -3693,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); @@ -3852,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 @@ -3863,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; @@ -3968,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); @@ -4342,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; @@ -4384,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); @@ -4401,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(); @@ -4465,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); @@ -4495,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 @@ -4546,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); @@ -4572,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); @@ -4585,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 @@ -4632,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))) @@ -4683,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))) @@ -4739,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))) @@ -4996,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; @@ -5013,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; @@ -5034,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 cd3b9768f7a80ec09952f8e32649e32da9cd06b6..23e8c0e1aed2ea1a760fd63d063aa7d65203caa4 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 700d247da38ff5058e758106a959922a4dd6f005..9b30b315441e6ed58256e09ef83a9ec8d8f69c0b 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 b9600bdac2e5da46ee6ac3dd741702e6073e2bd7..f95f3adcc6edcf62e778c0682a7c6f71d4ccecfd 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 088dc2d29d1788f71af5f29ab57754b584718f29..53e2bf377c43c52937d7f67541025ca34e23a753 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 bb77512be62efe4885bdd08466190184538319cd..cc8f75b297603fe42b85f1dce705dac44390bfc8 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 08bb24e14dfb6f25d9a2c78d7f6de639a7cc3009..253c42bb0022fb1b3500beccac160f417f673a8d 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); @@ -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, @@ -1067,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/disabled.def b/storage/connect/mysql-test/connect/disabled.def index 6d59369a4dfa94d1639e17f9bfb4289e0fecb71d..0dcf030613d062794a7d3614cda1fb10fbbe8311 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/mysql-test/connect/r/jdbc_postgresql.result b/storage/connect/mysql-test/connect/r/jdbc_postgresql.result index 6d77d79d5d3ffbbbf75dd0afd4039c474486c2b5..7969672dd6688016b5fe517ddb323ff0e30c7120 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 783d86e6595e418d896269fe9704217692730027..1a90132deded347e2de42c28c01e8e91ac7936e4 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 a301e0273d518c5197e52438982c00eabce3bd12..4c5fc94fca62910726aa9bf37a18b1635da356a5 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 8adc006a51bb938fd9005ded3fd5933b8f51fd63..550e94f286e39f4b10d4da964f4470f3492b014c 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 7d81ca5e73dc2ec6e4e69615184b1c8606253197..09544bb1ecb3bc7a1b86066cb0c0832be8396db5 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 0c009d612fe2325eaec16ed36005a33e55d1c430..d0819619c33a3f684e2e827e28f64028b2dfe50a 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 c7aadcf116591d48e81aba3fb84eec0491668426..132bb34ce648b3108218a9384f720b0806c021a2 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 708b6f1cc7c7c021d3928baaea6948ec44a56398..67c67653e88dda71ab9279bfe399d2cd39011ba4 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 672d9f15b809b12a155341ef826618d50229b069..665178bd3ea047ec78f46c7e8c9eeedb2077616d 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 e07fc0988fd12023f761b6d6ae477569b279d876..9633f358c97ad332f9f2d778d0b531535316fceb 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 0000000000000000000000000000000000000000..4c59a3b06d8406c3791ea3c6c14fb9d82305f66c --- /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 Binary files /dev/null and b/storage/connect/mysql-test/connect/std_data/JavaWrappers.jar differ 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 Binary files a/storage/connect/mysql-test/connect/std_data/Mongo2.jar and b/storage/connect/mysql-test/connect/std_data/Mongo2.jar differ 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 Binary files a/storage/connect/mysql-test/connect/std_data/Mongo3.jar and b/storage/connect/mysql-test/connect/std_data/Mongo3.jar differ diff --git a/storage/connect/mysql-test/connect/t/jdbc_postgresql.test b/storage/connect/mysql-test/connect/t/jdbc_postgresql.test index 1041ef468d7b82fc69d43c1be251a832899acc85..8036f71020d029b32ff48a47247d4158c0bcaf89 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 05122f51924c2b94b16177dfdc30b9e66945fd00..81ec80c13d6e910f9c8adbef6fa841375f802a7b 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 35dbbfed7065ef2779751bdc39d24d9c6ccd3513..d45131f32ba0548856f0348406515dc3cf9ef977 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 2d7cbcfa8bd74c78ffbd672883b2f9592a4477c5..fab2ca8413909c9749e573d037a28250b2a76c30 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 dfc223e9074a72a5ebe5a2cf08216b58ee597527..357fa55240b65670b5c7f582d844c4596a63303c 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 68a0ebcd44d156b025b0fdfbe92fe107a3864632..05409c695fb82a15005f17b1a57befb7652458aa 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 0000000000000000000000000000000000000000..88b822102d0801b9328935d7d81ea6eab48e7ef1 --- /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 70a0a6a14503741d7402f607c7ff34cd6bcec7c2..f7b1a43a95da135f9b7e67a6c1d503928973457c 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 6a0a8be8ff84dad07d474381e9c6f49238236297..5446e0d2a0772d4c2da48994e07c76f398940355 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 0a6507315db025609c07f5753ddc0d55c7db00ed..e296553d8e241f19c45418f871437ead94bc4d82 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); @@ -334,7 +312,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 @@ -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 0855e26570441fd5197f7e9bf1c2b1f746424fea..887527e38ab802fc61a4c7684f397ba325e2c34e 100644 --- a/storage/connect/plugutil.cpp +++ b/storage/connect/plugutil.cpp @@ -136,9 +136,9 @@ PGLOBAL PlugInit(LPCSTR Language, uint worksize) { PGLOBAL g; - if (trace > 1) + if (trace(2)) 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 @@ -215,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); @@ -223,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; @@ -256,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)) { @@ -273,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; @@ -308,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); @@ -335,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; @@ -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) { + if (trace(8)) { #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(8)) +#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. */ @@ -520,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); @@ -531,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 */ /*********************************************************************/ @@ -544,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 f16624548fb7491372930fdf75e442a73905e85a..3db7a2af1cd7088ded2adc397359450d71864797 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 031fdebe6502679fdc480dfe0959d5fe940a8efc..e4f169575f8c122e5e9f67eb1dff82003242fa89 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")); @@ -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/connect/tabcol.cpp b/storage/connect/tabcol.cpp index 5065d86ce6a7ba0abe9f86fe4124c97fe14620fe..93de0598fe8163e2878081262331732732d5f3b0 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 5b9667a6c840fe77353cf4a1026805d8a15e1a39..29cbbb35765b71f0040f6bb2411c3d9d57d527fd 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 948b357dc1fedb29bb187c14f7639ba4ade4a3c4..bdde37adaad40dca873f3ab3dc73ad928aaab292 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 a75b373b5640abd851da0834c53c27d2c5f337f1..64d401bef15152aeda4dafba9a9ae35ad8677cd3 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 a78d5861e53e711b76bc80c03f49b8cdcbeb76a7..1969fd4465fdaef8fe6731099d6b630c1c18f37f 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 516601a5eb48f48476efef9e81774515302bce74..63fa2a636688be2be20bb358efc2496bb4dfa89f 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 b6a1487955b03a846a5cf8627ccdfdf5b66206b0..275b5edaeaed7e83dc2e276b2d0946b81806d6f0 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 d422ed26ef2d0bbe0bbf0251b4cbd50913921bd4..078129a14e30c8d178e9251f958f36471b51ab57 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 8778b7d4b4703c4dfde2f1fa3824e09cd454fe3a..9e4f5ab987d0e7d9b4e8f12aecccec5ccdd1384a 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 17583cba333f4cbe57dbe4859d6e4c417c342cd9..0341c0f8aa07119d77eb90bd17f70e89049949ad 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 61aefc930821f41b4e65f938685091a1d96a0b8e..d4d3a34d67e7e5438eebf47b949b5425ec268bb8 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 a28b5d7108cb34cea8c84157fd449c2293d270e8..8260ab65391090b93cb07e1f60a0a562900bcc30 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 0967afca6cdf933f49074d5cbf532028c94d4316..649fc6706c60693788fa6c78001f6efc155ec4a0 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 d1e2ae696085c89bea1e31376f10242426bc4e44..605b38224305e57a69cb24904fecc8105dda0b8c 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 56e5e72efd62f342bd813a23c345677c83e3805b..f7bc3934fbd5cc3d02540bd115be454be03c848d 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 76a46e6899bf7bc80e43e4d45fb0be61a92e2e5a..da5d134f347003d328472c48304b749852c33aff 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 7f0d9881298f9ce2501663f81c47a2035bcef826..f73a2b6578d2569dde51aba1d87655042d7ababb 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 d3fb31fb57a6e6e24e57a67692bb21e423fd7755..e194568ccf874791813162e7e60456303138b445 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: */ /* ----------------------- */ @@ -135,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 @@ -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 @@ -434,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); @@ -473,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 @@ -528,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 @@ -553,13 +555,14 @@ 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()); } // end of ReadColumn +#if defined(DEVELOPMENT) /* ------------------------- Class TDBTBM ---------------------------- */ /***********************************************************************/ @@ -572,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; @@ -650,7 +656,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 /***********************************************************************/ @@ -669,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 @@ -695,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; @@ -711,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); @@ -759,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 @@ -860,10 +866,11 @@ 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; } // end of ReadNextRemote +#endif // DEVELOPMENT /* ------------------------------------------------------------------- */ diff --git a/storage/connect/tabtbl.h b/storage/connect/tabtbl.h index f02bf620aae983e89fe2e77a8ae528dc2f8aba08..e7a84395787a7e0e55141ea21797038235906631 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/tabutil.cpp b/storage/connect/tabutil.cpp index 5d8d7c1b9f86c85acddd3ee9c1d875aea940b739..68b66aec31fc867979e619dbcc8e23a0fbc15b73 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 533986e44da5786647f92d188565a96c65b2d0c5..11b344ef65289c0184424cf0cc1bcd84f8fbe41e 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 335ffce5d7fa03750c7ade22c1b37262680e723e..8a8e1bcbcb62dea20ad9ca8812d7ef65f643ce82 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 6402f48e09042e70e31ec277e8e7464599ebb09e..c96e08444973013b0b6896495fab84c688c68f61 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 94d2c8ad5fdf37c27d624a4a3836a1832fb9bb9a..9532d7c2a8d2ebe69fb0236a2193e9abddf7ff1d 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; @@ -187,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 018c7ee3fe19f0cf0532e51fb4dd190bd182ddd3..73ca135691c3b3d53dfc9244e0fea245702c971f 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 74a3a1f807518629525e838d82130e4f4b71b076..e159efaa989235937c3ed62682159b1ae0d1c21f 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 30dce3b7fefc52b7999919bd4e7e0486b5110c02..efefc17b5f57a0f5fbedba58fd881c8a615c2bc5 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 02d3e974dcc883c3c6d9bb5112bee24883d6d667..c595ce5d6c43bdbd2c3b2d50ac38a03af2485751 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 7e0c61ff634d467adee1a998c8fcf6fa4f4de209..6659e529e975544efb062a65b17e45d11c6673e8 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 85e41554efc0cb1af785f2d0ea831f33acfa7289..d234aa03edab50128cae616e7e2511da697eb392 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: @@ -3467,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 6c918575315e8b650ab969667eb6fdc98ed4a39a..50be6575a83c5acd7d183a36eb6a9697595f86ef 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/federatedx/ha_federatedx.h b/storage/federatedx/ha_federatedx.h index abf25abe0c5511f2f8a6acd57c32d5a743b304e4..f3af725862314c454a7a1e40b1ff45cdc114f6ee 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/_check.c b/storage/heap/_check.c index 910a0d202563e7aa89d0dd0ad1075eeb6054d84b..fd8652d6a2acf51713b2feda2cc42df67b23be38 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 970c503497f492de9f167a8c06a404a469681c5f..0298104c8aa4b4fe63d4a27fc706e6fe3d163111 100644 --- a/storage/heap/ha_heap.cc +++ b/storage/heap/ha_heap.cc @@ -705,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 431e992e75bbc8d58244964d9690b3214bd04a7f..ed669069b969f64792733c129fc3d450ce30156b 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 0c1c2c4c8f8f80cb4b294f02f5dd45d70d74e386..3f02e28a31b0593753d6a6cc3fb893295dee64b4 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 6bf1888275e4b71914dd1feb875c577c0afa35aa..1f2a26cb3ed0a81e94b1b9110d3521ad803e7ea8 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 40c5a18f974dfcc946ffb6580ed80ce117559f4e..19767fd752be142c39dbd3e10433e72e55016013 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 39a6f2082a31bdab323dade8419af4a6516310b4..65726c37e1fa18611c449a47c764bfd44f638d48 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 a1d81fd808dbb6bf67d8737805553f542846abe2..fc1e82bab4244078ad0a90ad479702e61915fe44 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 86032ff207db36f6832f1419f28b5f8d2ba5d5b1..2a45f05c463605767f6b6c1d09d2564e5b6a69a5 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 @@ -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 @@ -514,3 +520,6 @@ MYSQL_ADD_PLUGIN(innobase ${INNOBASE_SOURCES} STORAGE_ENGINE MODULE_OUTPUT_NAME ha_innodb LINK_LIBRARIES ${ZLIB_LIBRARY} ${LIBSYSTEMD} ${LINKER_SCRIPT}) +IF(TARGET innobase) + ADD_DEPENDENCIES(innobase GenError) +ENDIF() diff --git a/storage/innobase/api/api0api.cc b/storage/innobase/api/api0api.cc index bc83e98374fe15a65d5909377a639088f505b0d6..fd14fdefd18fe6ed8bd6f8fb435a92c82c2a12c5 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 bb010190af744b360c8c50d58cafeaf2ef8277eb..09d84d1ecbc76b45ef689f68755cb12b590c9549 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/btr0defragment.cc b/storage/innobase/btr/btr0defragment.cc index ca4c90eef41e8d407a59972b4319b5db4d6718ba..9f17815cd43ca2d2a962702867cd4460a59efdfb 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/btr0pcur.cc b/storage/innobase/btr/btr0pcur.cc index ff80cfb29ad37ae8b584e13b389958cdd317126e..5ba9409a7b1c270a8e8f98eb8843d9e2cd9f7572 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/btr/btr0sea.cc b/storage/innobase/btr/btr0sea.cc index e36e6d6194c33a34fef15162218627375e5903af..bd5cd02aa7500b963cef94e3b3ec2e3ac09243f4 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/buf0buddy.cc b/storage/innobase/buf/buf0buddy.cc index f2ab73217e01a4ebb98ee9d47e4a96d928cb192a..7a441b4239af25a73667e43cb0f2ebee7fae59a8 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/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index 7267028339fcf85ff0ac9f39b29e4c327922c813..1386fd63cc369e1c58c14b6786b270f28fd687b3 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 @@ -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; } @@ -351,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. @@ -3072,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)); @@ -3186,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; @@ -3249,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: @@ -3450,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; } } @@ -4734,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 @@ -4772,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)); @@ -4790,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)) { @@ -4966,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; } } @@ -6221,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 @@ -6330,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, @@ -6347,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, @@ -6384,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 70422671190e49ac3561b722fc33a4c317071052..5f126ebb2a930ae01d0303711b980e892913780c 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 703c425e127dc21859fe955bad7cb03a4bd24ad8..7d9dbc74951e265a0a33b2409d2bd914ad3785e0 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); @@ -613,6 +635,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/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index dacddfca385f0bc266bfefe96e6340975af5d944..66704ac1344a9a881e17ee2ff8c7b71a1f73f421 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 a047b28f4fd08c59450b1e29f70a608b3d5a0425..7039ecdf4a64bc4313bc9e5db2541e06eb60c389 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, @@ -237,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 */ { @@ -248,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]); } } @@ -268,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)); @@ -329,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; @@ -361,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 @@ -671,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)) { @@ -1045,8 +1051,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 +1058,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 +1071,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 +1098,10 @@ buf_LRU_get_free_block( } } +#ifndef DBUG_OFF +not_found: +#endif + buf_pool_mutex_exit(buf_pool); if (freed) { @@ -1101,40 +1109,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 +1910,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 0b9e08544a5c4d33b4ddcde4049b68838db86f6c..34ca399f9b2ad99583f22b7a2c8f6b7cadd0c0cc 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/dict0crea.cc b/storage/innobase/dict/dict0crea.cc index a2f79a400e2663ff506a9005136a658fa171424d..057e2684eb87b5e1a3e01062c8971080cd162b3e 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 8d7c1275c3b11c01be2ffdd5aef788c7554d954a..9609ef9634397db6e14aacf9c55bee084d0b7a3c 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); @@ -3398,6 +3377,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/dict0load.cc b/storage/innobase/dict/dict0load.cc index 4a2b6d43bbde080053f726220b91634d802c670c..b2065c7c4649ce07ebfd3c21f4c3bf56bd0e3699 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/dict/dict0mem.cc b/storage/innobase/dict/dict0mem.cc index 0e5e9f65b043eefc8af09ba7e0975a0101a53774..dd8155c09eb72f60b1421cd7813bfbe8c802f0ed 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/dict/dict0stats_bg.cc b/storage/innobase/dict/dict0stats_bg.cc index 43ee1a236cead0b0bcad76ecbc95e6eb30b9a3f3..6f2f96c452e6c9fd2521060f63d5e2b8540b8d9a 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/fil0crypt.cc b/storage/innobase/fil/fil0crypt.cc index 3095503cfc5569a81528249c9c024f2503b4d68d..932d7b9e31209988f3943aaca7d74c25d1bcfce4 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 ac30f3c7a25328183dc64984b51d4f1acc8b0f50..5891db627586103c0af5765b31a2165889b84cdf 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)); @@ -2074,7 +2015,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)); @@ -2085,7 +2026,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; @@ -2893,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 */ @@ -3004,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; @@ -3206,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; @@ -3214,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 " @@ -3244,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) { @@ -3310,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 */ @@ -3330,8 +3206,6 @@ fil_rename_tablespace( } } - space->stop_ios = FALSE; - mutex_exit(&fil_system->mutex); #ifndef UNIV_HOTBACKUP @@ -3919,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 @@ -3934,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)); @@ -4276,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); } @@ -5849,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(); @@ -6346,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 edc932f36f5f193d990e255fa1bb9e6639e6aeab..25cd8e28a91dd35006f703dc6d57d28cdbe752f4 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 1cf37f366d7e3f9be25461813b4f18cecb219082..b20c59c4d8c1e2b1f609756a93e7bd84526879d2 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 2ba58c9a590fb674e427d22de3d27cc6e5d398af..f65265fd565490a990355823a078930cecbed612 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 @@ -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, @@ -4629,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; } @@ -4639,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); } @@ -4658,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; @@ -4762,9 +4748,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 +7586,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 b874309964b4c6c979cb676684330bb310941cd9..3a54383683749f29e41454602dcc2c7713c1394d 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 9a7258bc924c0443fb22b0daad16b9fef33af5e8..0daa89b6e9a23cd476a51434b617ff5e9d72e619 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) {} /*********************************************************************//** @@ -3094,13 +3145,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 @@ -3478,6 +3529,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" @@ -4834,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 @@ -4858,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); - } - ut_ad(lock_mutex_own()); - ut_ad(trx_mutex_own(trx)); + if (trx_t* trx = thd_to_trx(thd)) { + ut_ad(trx->mysql_thd == thd); - /* 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; @@ -8286,7 +8322,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: @@ -8403,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; @@ -8880,7 +8914,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. */ @@ -9031,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: @@ -11315,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: @@ -11550,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; @@ -11697,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; @@ -11741,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; } @@ -13098,7 +13121,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; @@ -13883,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; @@ -13890,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, @@ -13898,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; } } } @@ -13911,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; } /*******************************************************************//** @@ -14732,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; @@ -16726,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 */ @@ -18592,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", @@ -18656,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) { @@ -18713,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); @@ -18779,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(); @@ -18811,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 */ { @@ -19234,7 +19251,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" @@ -19794,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, @@ -20163,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 300f49c93f98abb6a615cb17f5d677692f23a8d2..9c838910434dd1f2d15d8828811d1d605f1ef16f 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 bdc4987b5c9896e7f666197c995818ebf1caa17d..9f44b64a235a9d13dcab466fb7bbbc55e74b7bb1 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) 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 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; @@ -1620,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 @@ -1935,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++; @@ -4418,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(), @@ -4880,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, @@ -4894,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. */ @@ -4925,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); @@ -4934,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; @@ -4943,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); } @@ -4953,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, @@ -5783,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++) { @@ -5952,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( @@ -5985,6 +5982,8 @@ ha_innobase::commit_inplace_alter_table( #endif } +rollback_trx: + /* Commit or roll back the changes to the data dictionary. */ if (fail) { @@ -6176,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: */ @@ -6202,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 2c82c1b49318789ab2fd8e0cb783a31679ad57c3..31bb984f1964a8e9429bf0221e84e077a3db078f 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 c621ed5f71a94237364822646f96b79d26bd17db..17fe3ae7511fe57220afa95a4d83e7ba1b896b40 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; @@ -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/btr0cur.h b/storage/innobase/include/btr0cur.h index 30010da9d8f7663809eccaac70c8dfab1efacd84..51ff300fa1f3c1f6dae204d12bca726e12d3940c 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/btr0sea.h b/storage/innobase/include/btr0sea.h index c95ca28057aaae871a286d4a0fd20aa862819a3f..4e1df7066d1857dc337d6c2ef20f88531b46a795 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 857bdf9d2be77019ab6a6a586a0d5d66b1a75237..aca4e58810c66343a1a5226fc038f8818c9551a9 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 308bda20c7b4af5f207b753dbf92d31a4d60109d..623883433c2dd2ab4a6e86ab0d3a746d90700a49 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.h b/storage/innobase/include/data0type.h index 111664b0b527f6c79d99bb9568101426a836a31f..28182782105b7723de3781e4b258d399d193ee7d 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 bf433036e61bbe412abaa9da2c9870380c65e313..c04da618a849dc1c27a3033977636b238f191efd 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) { @@ -544,6 +524,7 @@ dtype_get_fixed_size_low( return(0); } #endif /* UNIV_DEBUG */ + /* fall through */ case DATA_CHAR: case DATA_FIXBINARY: case DATA_INT: @@ -564,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); } } @@ -601,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: @@ -622,6 +602,7 @@ dtype_get_min_size_low( return(0); } #endif /* UNIV_DEBUG */ + /* fall through */ case DATA_CHAR: case DATA_FIXBINARY: case DATA_INT: @@ -632,9 +613,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 +683,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 0d5ade1631e55160167d0cfafdb7fbe3a6edd3b8..7011f4a9226d1c8d06756668289baa51e0e6240d 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 22b96a58f66ec3f4f6378a0e039bbb665a6cd711..bc72d44108169526fa20dc1d53596f77298d45ec 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 9a6cc0aa0c19c8e4a31354799d719cac73621ccd..3c9bd80431ec45435323f99b9999bbd72ed5b7fc 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 81f207d1e2096ee3f550ed2042141c3b2ec2478a..a8dc9e14381c846a9faf068c3dc1cb5c588c2a42 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 @@ -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 6c2504c9f8c0423c4c8154f90c81211cd4eb81e7..3f21c5293081e17e044f2a0be11676a3c286c306 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 03e16699ce383e3f21c02ef716e4a6462aaea4ab..934372c55b2a45169f07b4e0d11d21ab37aac309 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); /*!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 c3307985532b3f29895742917ae6b49759086944..1df9fba5e9ede0be487db04ac114ae8c9a14156a 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 37cea34d4eb12268b7a79a565eb42bb921f55666..3f897ae1d101d94edc687d043af474532f8e7410 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/os0file.h b/storage/innobase/include/os0file.h index e2e88eee560a4aa5e25e374ebdd6c963ffc9156e..55e41f6ebb5d65f267535a0c360cf8b5ddc00e06 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 ba8828623af0d78cd87d3e7b03e836109b05f5ff..f37581cbf8f6f20429eb065c08c02ef542c4020d 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/rem0rec.ic b/storage/innobase/include/rem0rec.ic index 5811a77a48b765b16d2f77162b3abc261e52aee5..89f6902059dcb63f66e7e33ad9cfb136095cd073 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 71e3b9bb19e8de72866b4c63dc37107cc2ab4191..a38e9b6b3d559c4fa39d730f3a29c3bdb394c3a1 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/row0upd.h b/storage/innobase/include/row0upd.h index e59ec58b63c1b82ce3c108119813b8068bd17719..0a99e0ebd5655bf5a15efa8ada0a0ff72be9964c 100644 --- a/storage/innobase/include/row0upd.h +++ b/storage/innobase/include/row0upd.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 @@ -119,8 +120,7 @@ row_upd_rec_sys_fields( dict_index_t* index, /*!< in: clustered index */ const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ const trx_t* trx, /*!< in: transaction */ - roll_ptr_t roll_ptr);/*!< in: roll ptr of the undo log record, - can be 0 during IMPORT */ + roll_ptr_t roll_ptr);/*!< in: DB_ROLL_PTR to the undo log */ /*********************************************************************//** Sets the trx id or roll ptr field of a clustered index entry. */ UNIV_INTERN diff --git a/storage/innobase/include/row0upd.ic b/storage/innobase/include/row0upd.ic index 618a77fa4bfc2b55aa864150c447b1645d68dae9..efc6c1be4b51f4e2b5480c8a598e640d013c9991 100644 --- a/storage/innobase/include/row0upd.ic +++ b/storage/innobase/include/row0upd.ic @@ -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 @@ -153,8 +154,7 @@ row_upd_rec_sys_fields( dict_index_t* index, /*!< in: clustered index */ const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ const trx_t* trx, /*!< in: transaction */ - roll_ptr_t roll_ptr)/*!< in: roll ptr of the undo log record, - can be 0 during IMPORT */ + roll_ptr_t roll_ptr)/*!< in: DB_ROLL_PTR to the undo log */ { ut_ad(dict_index_is_clust(index)); ut_ad(rec_offs_validate(rec, index, offsets)); diff --git a/storage/innobase/include/trx0rec.h b/storage/innobase/include/trx0rec.h index a6e202d04e4eaaf7faebf8e23f63c85e2e6a586e..ec15250ec7b7eb00e23884ee40b6e283b2b1f176 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 @@ -226,10 +227,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 98a667b2ec1042ef75125b48badd427d35a7fcbe..274a3b038ba2a99b9171415bca07d356d52de7a3 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 7265a97ae2516f6abb706fe1a4f342aa4f7061de..e097e29b551b76894ea988b5bc043d6f2f6fac68 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/include/trx0trx.h b/storage/innobase/include/trx0trx.h index 68941363620a5bf58e1706945d571712d914dcb9..fe16b8272b81790d37d97fed124de35984c42b0b 100644 --- a/storage/innobase/include/trx0trx.h +++ b/storage/innobase/include/trx0trx.h @@ -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 @@ -695,11 +695,13 @@ lock_rec_convert_impl_to_expl()) will access transactions associated to other connections. The locks of transactions are protected by lock_sys->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/trx0undo.h b/storage/innobase/include/trx0undo.h index 42ac62916e0330c6a7bc975692c80b5a17b34b73..266ca32548c5cefd869003271e812a2c8dfb5292 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 f00cb179f56990653564f8e7cf0b7b7b3607089f..7304d1e5d87db97e2c4a84f512719288e8054e05 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. */ @@ -677,14 +681,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/ut0timer.h b/storage/innobase/include/ut0timer.h index f361ae79bf525f6784ddffff7c4ee3523fdc25fc..3015771b434d7268f7258155fbb7ef4e18041383 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 46dcd0cb71834ed743720b5cae4f4c899fb9cce9..34886481efab3b339519ce724180c8cbe9e0d6ba 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/include/ut0ut.h b/storage/innobase/include/ut0ut.h index cdf517ce176e547fc7111f9c46e1ce43cd94517d..ffdb13ddf4361b64accf3179e663d9f975dff961 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 6b2c309e432c3f0708247e1d7a932ef16fe602d0..441fcace7c3de8630d6381e8a93729ccc6f90121 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 @@ -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()); @@ -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 */ @@ -2205,20 +2216,13 @@ 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) { 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 +2523,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 +2828,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 +2960,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 +3127,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); @@ -4940,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; @@ -4961,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 %llu\n", - (ulonglong) c_lock->trx->id); + 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)) { @@ -5251,7 +5258,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 +5269,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 +5322,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 +5369,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 @@ -6880,7 +6887,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( @@ -6888,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); @@ -7036,10 +7043,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 +7059,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( @@ -7910,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 @@ -7967,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/lock/lock0wait.cc b/storage/innobase/lock/lock0wait.cc index ca9d05a4829384005476505ad0e109224cafa56a..a0f557e18e5a87db75851db1fc853d4beaabef22 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/log/log0crypt.cc b/storage/innobase/log/log0crypt.cc index 13d691187799082f7c64c8a66d0c657913956fde..ec3c72cab43b10d0740a2b2595f9b472afbf4989 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 1c9cbc3a219d2628009eb2288b8eafc0b14dd8cc..6546459354b4e555cb95c0c0892d19040546551c 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" @@ -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), @@ -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); @@ -2335,7 +2341,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", @@ -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) { @@ -2576,7 +2583,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), @@ -3236,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++; @@ -3248,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); @@ -3283,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; @@ -3319,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"); @@ -3407,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); @@ -3440,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; } @@ -3467,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); @@ -3498,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 6e6d8aae25e9d70bdeb594713463e6c45edeb19d..deaf5e88d7cb4d66d2ed30835360072ebfc2818b 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 e066aff5b300000b5ab54ffd1eaad693cc51a0fd..f91126697fc71683a12a1b7145a577355037aab7 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 @@ -405,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); @@ -506,13 +512,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 +532,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/os/os0file.cc b/storage/innobase/os/os0file.cc index e9abdc91ff8807152f030b25f83dc2de093ad61d..5aa9b6040f89abc1504b5d99d5c7f1809f993d6f 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 231c0101266a04b31da0d130532f724aa4732ee2..2cc967129a93ed608b7a6ff8d3d87a534ffd53f9 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/rem/rem0rec.cc b/storage/innobase/rem/rem0rec.cc index b6bbe3347bd3a7db827c0486aed98b409525636a..af32d0519e2f16d50ee7f29a0505d3928b7351c0 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 ad852577ad2376d0d9a0ce685b697bd206a5d4a8..32b78391d6a66297aa80d7efbcfb9ffa10677476 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 40ddb3a6a87e0e986aa873f09c47170e672adbfa..5ab577ce0203929464c45cc1135366980a67406b 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 9cf55699d3f97fc58b188ba4b17aa3ef3e973fcd..c808a991f25afb89a9d81dbf2c17b08cc6e951e9 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) 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 the terms of the GNU General Public License as published by the Free Software @@ -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. @@ -1258,7 +1250,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, @@ -1595,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) @@ -1619,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, @@ -1671,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, @@ -1704,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, @@ -1727,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 { @@ -1751,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, @@ -1768,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); @@ -1779,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 @@ -1790,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 @@ -1844,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 @@ -1906,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 @@ -1952,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, @@ -1959,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. */ @@ -2013,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; } /*****************************************************************//** @@ -2876,7 +2788,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); @@ -3420,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. @@ -3594,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/row0ins.cc b/storage/innobase/row/row0ins.cc index acbffb3a386a23ebf5e49ee532a0dbb7f54e7e93..c50eaa2a653cf01b52a27ca2a7d06d3f0192c96d 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; } @@ -2968,6 +2967,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); @@ -3070,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 9107ad6236c9b9ef65d8353b3110e47e2ddbe5fa..c170e7e8cd339d605e71e4b802acd01bf677d431 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) 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 the terms of the GNU General Public License as published by the Free Software @@ -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); } @@ -1064,7 +1012,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 +1131,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 +1160,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 +1171,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 +1181,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 +1405,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: @@ -1573,13 +1523,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 +1536,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); } @@ -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) { @@ -2173,17 +2111,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; @@ -2264,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); @@ -2273,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); } @@ -2323,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. @@ -2339,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: @@ -2797,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 f4120e5fd90839e5a98724b1239c875a9297836a..0206d4153425ae90aec52e862735c92619146523 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 @@ -3111,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 dcf4413a1c4267efcce26ee308d7d784ffa4383a..be24ae885a25dc63d09ea8e01ede51929d6c7514 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) 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 the terms of the GNU General Public License as published by the Free Software @@ -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 @@ -1512,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" @@ -1999,7 +1985,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 */ @@ -2770,7 +2756,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 +2769,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 +2833,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,37 +2850,27 @@ 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; } /*********************************************************************//** Reassigns the table identifier of a table. @return error code or DB_SUCCESS */ -UNIV_INTERN +static dberr_t row_mysql_table_id_reassign( /*========================*/ @@ -3564,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) { @@ -3609,7 +3563,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); @@ -3638,7 +3592,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 (;;) { @@ -3685,7 +3639,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); } @@ -4131,7 +4085,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 +4097,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 +4137,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); @@ -4272,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 @@ -5301,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) { @@ -5403,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/row0purge.cc b/storage/innobase/row/row0purge.cc index 1ed8b7377d95ea756e692ec59f9eec50908c4792..98504b1e9730ccf4ef992c730e7c514d0a3e7e1a 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 6c4e6adb96ce6e655bbbf2972b9b6d726ac166b5..53b4040f74e8a21b7236e45bad3449103ca47f81 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 96d25e15777dbcb848c64c224857f5f1d6175446..9bf9e7182ca670118405508a974def4ec80487a7 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 d309cf4c7422671de8bcde791bb5d6469754bceb..06bf4cc30c0c41fc04341dd1ba7d8c4c1242ac92 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) { @@ -2706,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) { @@ -2812,7 +2815,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 @@ -3666,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 @@ -3728,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_); @@ -3930,7 +4044,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 +4175,7 @@ row_search_for_mysql( } mtr_commit(&mtr); - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); } } @@ -4542,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; @@ -4614,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: @@ -4731,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 @@ -4785,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 (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 @@ -4933,6 +4999,7 @@ row_search_for_mysql( } } } else { +use_covering_index: result_rec = rec; } @@ -5137,7 +5204,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 +5271,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 4aa5cfdc4da637105c9706ed76ebdbfff16e15d6..6c5e808cc3829ccd51dee8d41d69c4e1b98535d3 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/row0undo.cc b/storage/innobase/row/row0undo.cc index 82b1ab049facf1375509355385eb46ed6af19261..552b99ab4d4a71249b2a73ea0772360865d95a5e 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/row/row0upd.cc b/storage/innobase/row/row0upd.cc index ef51e2046ae41ebd9e2db76e1fffba0671af34a2..33f46882651447e192c81ab04506f4040d875628 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); @@ -1802,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 @@ -1832,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); @@ -1852,7 +1870,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 @@ -1961,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); @@ -2184,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)); @@ -2268,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); @@ -2389,7 +2400,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 @@ -2499,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); @@ -2528,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); @@ -2601,7 +2611,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 +2665,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 749ece33a067fb1fdd54903d53f91edd4fdf3f57..6e8ed7893d624ce7e302a638ce831f6245a1e210 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -77,6 +77,8 @@ 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); @@ -425,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; @@ -2550,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); } @@ -2740,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/trx0purge.cc b/storage/innobase/trx/trx0purge.cc index 5553de4814fe42fc8ed84d1f17c08c7f221a82b4..9e5e90128cb08bc22cefa66707f2874ea35dd919 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 1010f60940b4875dea14c66c03a063daf6d34242..cd5e51d4973789f26b8ed1a1c26626d81dfb0c7a 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)); @@ -1221,10 +1233,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; @@ -1257,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 */ @@ -1333,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); @@ -1370,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 e22700c8fce8d73ac57a3a7532ea9b1dfa1a662a..3fd71aff23ad9ed5a7bca0a0d16acc981aca0a01 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 @@ -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,90 @@ 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; + 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)) { + + assert_trx_in_rw_list(t); + if (t->is_recovered + && trx_state_eq(t, TRX_STATE_ACTIVE)) { + n_trx++; + 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); + } + + mutex_exit(&recv_sys->mutex); + mutex_exit(&trx_sys->mutex); + return false; } /*******************************************************************//** @@ -763,17 +814,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 +1145,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 +1202,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 e9443e93140537f5a6efd2c819094071e65f3ad1..0246eaf32a8355d0cb4e844148725b49ae5156ac 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/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index 1cd0b6ede51237bee3b402e8f8adabe7b989f89c..6d4bb2022913e061a854732e58365266da73e3bf 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 1836d282cd44f86b5a71949bbaf8aba59e8e99ee..370b3f181a133ab4ad0fc94943da4893dd4a9b83 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 @@ -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); @@ -1987,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)); @@ -2023,9 +2027,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 +2055,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/innobase/ut/ut0ut.cc b/storage/innobase/ut/ut0ut.cc index 181e713cca90ead983881f045bfd1db3faeca8d6..2a430c9c42271b1e9149fb0c6871fe4b9a3608f3 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 47f759e0c050f68771674a27d443217b8a4c802b..eee6b502c478057363c866242b77cd20a4920064 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 : @@ -2134,11 +2139,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 @@ -2217,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); } @@ -2560,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. @@ -2575,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); @@ -2691,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); } @@ -2711,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 */ /* @@ -2726,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 @@ -2783,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 @@ -2814,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. @@ -2837,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 || @@ -2858,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 @@ -2909,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 @@ -2920,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); } @@ -3321,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 } @@ -3341,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 65fe5f545d1f338cc1c8eb16c58d0d7fe87e3035..f3548a381371ee6e1b6d78d9d7b9ecbfba217d65 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 9ab5533fdbd090429f142e634dfbffbfe3f352d4..e8e2bc56b25cd6cc695b3298d98682d7fed53609 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 575965582086bf22534448d7ec4ad690f2c05557..c0a9341537960bfbfd812530a5ed82784e80de2b 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 @@ -6166,7 +6167,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 +6317,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 +6346,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 +6362,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 +6464,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 +6489,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, @@ -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 d89a69f02abacf599ca42c83d8608493930cc08a..b63340e23a6e1119150c04437c55caddc6114c26 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 358f564d3f1fc858201012049732ff64bcd8db15..0ae3868dbf64d5baa5fcc35ea22fc9fecc878f7d 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 b46cf7e176516f9bbb4616e1bb25bba247fbc45c..f037589db29b42e6f4ce20b73cf4ddc9f462dc8a 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 7f34b73089f91ef496ca9e8a44ed4b86ad5769aa..0234eb5fb7f326b440621a3caf652f9daeccf4f3 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 6c74bb52f513adf1d79448ab127d121f88585cbc..f3800bc36bef660718f6897f81049d6b4ac7a405 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 7a3d4a216ddef17232d247871bf205e93c446812..aa7ff9da7f2f134cddb21498420e0869b86c5702 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", @@ -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/maria/ma_open.c b/storage/maria/ma_open.c index c4a7df4443c7495c0806cd5991871e4efc249189..598f76a6472d134f01a6494b5f95f6055a8b7328 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_page.c b/storage/maria/ma_page.c index 4021fb8e161e831cd37f3f323d8d7b3f2bbce97d..2f77f6f87ec5c4447f0befd334bb71b9b91f2635 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_recovery.c b/storage/maria/ma_recovery.c index b0b547a3070784e7df08757fd8939443dd88c6b9..c06e46c104f272cc7311f07294ca145a7bf50fa0 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_search.c b/storage/maria/ma_search.c index 951850b16a4e3d3e3ddbbceda73857648e740849..0132dc95e5e4e14f405f93e83c5e25d6d5113061 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 88ce88b8f9845bdd52d5434df3861e0e40af0d9b..aeefd9aa190acb85abc11cbc868fe7a7df9a75e3 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); @@ -65,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) { @@ -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; } @@ -546,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); } @@ -560,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) { @@ -580,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; } @@ -597,7 +638,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 +668,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 +677,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 +706,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 +740,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 +765,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 +783,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 5ff6dc26337c2ef85490a7712f18d04b95a49eb7..8728a2113e59341530259d62bea3a2abe98df880 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; @@ -83,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 0000000000000000000000000000000000000000..9bfd1f0d0479b3476ae953dd896adf32a654a97c --- /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/ma_write.c b/storage/maria/ma_write.c index 34ce530283cbd4a430045a3aed7fc8b83b8b0110..4175a5be18c331d42aeff50931a6925feb1549da 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_chk.c b/storage/maria/maria_chk.c index aa01f4cd8957d8ffbd861580c5e45d0d173063d4..b47f1b8c82441ea901a271021a5349ec5f3493d0 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 3b93dda2badb1aac1ced29017577a8da194ea184..8262e1b5e2dd643470b4432001f31ef4d639df6a 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,8 +601,10 @@ 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; 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 */ @@ -856,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 @@ -1181,7 +1173,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/maria_dump_log.c b/storage/maria/maria_dump_log.c index 42c694bf1bfe5196908e5b8df6e2dcc074b72c1b..3570dede80ecad8d07ba67f088fa71593d3348d5 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 814c50e1db8a26ed90e75c77f09d574de04a4671..28b4ff4cfc70844261f320663565c1958b912e3a 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 a0724b2199ba18541f5d23cfd571c678f3ce5704..d0cf7521e9b4e061dc5bf943d662b653cfb08a61 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 bc48d39baaa6b231ea4220a33f76aeed9ce5e93c..5b3c9f0287a71350e3ab61afec1bdfdd9b599938 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 66139a31230fb5a49e1ad9eb05b7a3cf34009b2b..11c7379776636253098c1b3f4b2199923388d297 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 39cff18a3ab5a67bc67da1edb53c9d89430d0424..dc7e0c79f87d95aaede3913a1b8b27df360e829b 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,7 +255,8 @@ int main(int argc __attribute__((unused)), char *argv[]) } #endif - load_defaults("my", load_default_groups, &argc, &argv); + long_buffer= malloc(LONG_BUFFER_SIZE + LSN_STORE_SIZE * 2 + 2); + load_defaults_or_exit("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 a6ccfd754de4b3d17c4793cd96ee41e4a5a1f65f..310345f0885e6b259de0380e01ab513f0e707c1e 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/mroonga/CMakeLists.txt b/storage/mroonga/CMakeLists.txt index 5d8e8c1eeb83bcf21233c754664a8ea06eeff542..5a7d4699386654b93a233e26731c0816fb6d5fc9 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/mysql-test/mroonga/include/mroonga/have_mroonga_helper.inc b/storage/mroonga/mysql-test/mroonga/include/mroonga/have_mroonga_helper.inc index f78a760a5636a28ac7f2493b4d2c540c318cc15d..0d93ce03bd7132f4be9ea1b41f1d871a7aca36bf 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 0000000000000000000000000000000000000000..d5f8c1293d5c1f74bc694768aa098a2542a0cbb9 --- /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 912c2e2bf7d35c6cd95ff5c0f7fd2c3a3f8101bf..fdd21cc0f4dee1e75052f877f854adf54efbf53c 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 a63f4f75a74d67033c735b6f0ad8457f1ac6a4f6..b84fc3978ede9110450eaeb089aa7a9f243f9155 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 e37b163b5c51019bb46458d2b67401d6b2d7e015..0cb1a8d243af883bbee33ccd9a713c963c191508 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 2df00d6a46c03c24ac23e26c28bedbe7411e0b4a..d1704a43d3ab4d01538ce728331d6e3a1088102c 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 a3a7dc9b086480789959bb5586b0c2baae6605e5..e298aaa43b1205ab558c54a7e6b094f88ace9d8c 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 66024f5cf0078186b2aaa69bc055cb0f86042471..4c500f1e67414ec72c027bb740799da01d27f6c7 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/mroonga/vendor/groonga/CMakeLists.txt b/storage/mroonga/vendor/groonga/CMakeLists.txt index e27070f9e0c3120c6b31e1093cc564be3ab51be7..ee526646c092a50b73f345ce7355aa8ca7e6a077 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 6765261feb7da9184066e780f3ad5bfb9bf1602f..64fadb8bbdd0bd2e2bb9421ae5ca244408f120e2 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 3a9bf45e22f5b5a3cc2169bd398eb79c257dee24..92888e0321e3aafba491c196272e1370b4bb90c3 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) { @@ -2467,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_locking.c b/storage/myisam/mi_locking.c index 1921926463e0af40a96c1b5ca110078287508545..4fd287c60387843a967b0021915ebc12d5589012 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_open.c b/storage/myisam/mi_open.c index a82f2b9e8c123a1017b2d8bda1368c95bcac87a1..e692f31b2b45be3bf716383d0fd8e4957df37265 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/mi_search.c b/storage/myisam/mi_search.c index 60a34c641ada5f6dd925fcb06f12ad9f95400165..92f28f4e32ab5acf327232030eae462c50c0518a 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/myisam/myisamchk.c b/storage/myisam/myisamchk.c index edbe235e190850c6939b8434b8726ed3a9c7d5ee..dfff5720847cc704973c42d77c040dd62503ea87 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 966edc877cdbb510d5aa8d15d87cbae37c9589a4..bb9f59f86f737f4828f97dc47033841624a51877 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 2afb7dfbcd64354e27447f3ac97c3ac255134745..3ef9da152ad9af988660562e407a557628b04799 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 6decce601fe4d9b879ec14e0f7cced8d673fb9d8..42366787340a81ad0f817d45e77f53161695e7d6 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 bf454aa33330cef6cc2d1ba0b18719490fc4cdc4..1a7df6147e796b3b09b48e6114e4abaab5ed0260 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 f24732af4ef97cd310a3adce80604fe2d69de3b7..aab6e797306df5f6d66e29500b3edbc219869463 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 971f0c46be8063574e5763d3a5ccd1ae23b43f1e..cdbbc022d5089473018b39a30d5c1c0f3b954d57 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 5308f780e0e9223ee292d3805b55a06f24cfabd1..3f6770b5d26c4df31daf708865d54c5a144dabf6 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 2a290bd8de943394db0a55a2d123f56ea67e6a38..ea8246c46f3e1c4813d70233f18bde8fb16a05bc 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 7d2924ce87288c648fbf242428ead65b9d2fc807..c559f562e98ade2cb11e702505f486da1e9dffd6 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 fc3d9ecc25f83d7f6d8abb3f1474d996b1beee4c..5de41ac0f98749d01986f3b0976403391ac3c4fe 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 c3dfe8b8cf24373d54bb67d74e04540ddc04ce9b..8d7b912657066037a21ec9c46499f294520c750c 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 8f892869679b49173a7e8decb5d3e98f9aa639b5..5c3ef9cabdfa103c2a0c26f6be851f60a29352ac 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 3c5c6e67c2a461646ce7c8b512610d01fc0ee8d5..697595edeb639a0d342b0880e7b4bbe5559da717 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 77a2969d0610a428545b5fdd6b640941a1283d83..6f04e08dc93846a61a2594f674c72d826de1f332 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 94d9f2257e1c45457496fce4d78b4d34718179fc..130edc5ee8a2b657436a0f5f41d0d2b10f091b9f 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 26c9662e08410a336e074e2b0661778e666876f2..f6bf39b813e9d215bf3b62b86b547daf39482b25 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 c959bf00d26364bb035c78d1bb3a334ab4557b99..e90e0b0ec679ad49aa9046bbb8cf9c4a166ba2f9 100644 --- a/storage/tokudb/CMakeLists.txt +++ b/storage/tokudb/CMakeLists.txt @@ -1,14 +1,25 @@ -SET(TOKUDB_VERSION 5.6.37-82.2) +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 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() @@ -33,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 0000000000000000000000000000000000000000..0888185848d12fc0ed6c251f1347081e90d09157 --- /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 d42525f1089d7068312dc20af8f86bab54cc10a0..3b6b909f6357a1b3d4407be4ba95f4a713246ddf 100644 --- a/storage/tokudb/PerconaFT/CMakeLists.txt +++ b/storage/tokudb/PerconaFT/CMakeLists.txt @@ -9,12 +9,23 @@ 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) + # 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/README.md b/storage/tokudb/PerconaFT/README.md index d53caf001901285562ac1ff964ee4fe0b83cb258..ffb646b67afdaa40cf81c251c599579dd05fda22 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/buildheader/make_tdb.cc b/storage/tokudb/PerconaFT/buildheader/make_tdb.cc index 0fa876f2bd80ab707333c47d8cc1e86efe693f7a..95d6207eddabd05efb829f38d295225f8551e335 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 0cd9a9c594146c4d1a286fcd0298bcb8595e462f..50d35ee4906ee3ffcd09e6ecaeee20304963e931 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 + #-Wshadow will fail with GCC-8 + ${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 9119a49b081022660fa3a7054c2cd5f975f51296..c109185f973c3071790d2a2779da0d04e76fa6c3 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 31aab932fd6775f1c2e5fcc67d3c276d5c98b8ea..ae2bb2846e8a3c9874a8355d0e4ddc0643d9604d 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 3223ab0a4ce8a2df7df381119a59a43b6ef4421c..13ff5eff5af574a8ef85feb837205dc57a0907a1 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 07e244947e4f459b6d9d334313642e8056dbaf11..eb8696423cac1ac32808b336063fca57f800955f 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; @@ -795,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. @@ -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,353 @@ 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); +} + +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; - //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 +5004,9 @@ void toku_ft_layer_destroy(void) { toku_status_destroy(); partitioned_counters_destroy(); toku_scoped_malloc_destroy(); - //Portability must be cleaned up last + toku_pfs_keys_destroy(); + + // 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 700e532d5cf4e4532f71c120f102c469be20ca25..454bf11794fe4b139a4495ea22b06e651de5ecea 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 6a520dba3a3ec984a490fd10840c5509d0b3c097..ac69fb7e7891892a886182001b528a7f6a955148 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 28d8d49ba9fac387f43131800928e484bd86db11..9ff712bcbaef5cbbff2e1cedfed8fdf2a19b5655 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 1aa2c20383150f0c44e2790e5a9f85b37f8cd72f..6f7b0147b212afad457c4b3e7728311a5d7b3acf 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 528c86a8f79bfdec0bd90f62ea49e8b88c86e60c..9528af95627305e67364fb0ebcfed1b0c3627324 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 9c1bdab1ee2821403e7f2cf1453982e5af83ef8c..cea2e8dfda26d85111ba1db8dbac5debc5437231 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 bee74fac346af3b762d40e19512fbbdfad2126a8..be19e1342cdf8269e4042aa8da80d2461624649d 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 f13419ae43e17bb74c2fa0beddb0becb0a160ea2..494d3b1d53144a046726a625a16d677f5c8a8d2d 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 eacec9cb83f7bb21865083f24802d222c7a22f15..3f13fe10febb7cf4149fa9a2732bb001808e9902 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 9eaa56bdc539478a94ea274eb89d45b9df884954..9a9a1214ecbf67e69610271fc9f5de054cbff3ee 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 19811373d16367e44e9975beebd9d557cab8457f..29f6daa293ae1483beac50bdc5ff7a684454e497 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 d2532134d96cff9dc9011de5c62945ca34448d0b..56d51f56915236f863b00578b3cfe88769d0370d 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 fcab9fc675e5902ae699be1f926dea936f18372d..0d6573972d7c18adb98a1c20e5f859f37c15d43a 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" + @@ -648,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 55899905bafe239c0662a1182926b5f8825af79a..46bb8f81412c23f38dcbc7942cb5b5ea51d03b32 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/serialize/sub_block.cc b/storage/tokudb/PerconaFT/ft/serialize/sub_block.cc index c967d4b4c1cf59de456f3d9b767c3b39d9e76b5c..6dc1f82844ac30ae29c92966c67da9da1e2002a5 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 073741fccb120228a380cf671479026a0288ab8b..295eb73cec9f00c62800e1d5ad212777a1fc49d5 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 8bbda2954627c4300a9f2309ef15af3ba41bb5a2..0af5c8185a965c7b600b67a311c6b1ff0e77dd51 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 9c54c086f5b451be91ea9c6f6504e176f3f03653..7bee0b807702175da724041da4edeccd9aff9ea1 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 c1b6e0a94f24eebb24a1ca96d86bd9bcd517d311..5ab0df88e0873ae43a704cc38b647acd0d022626 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 b462d76eeee1d47ef70f2e169d206e43c80c9df6..0b5110ddd993fc7f214401115bc7e296fe3d5138 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 ee68ab3ef0bb9197156a172c946deafa69119419..a4ff6c33e6acf7ecc219a632ebd648bf04e20690 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 3dd3a15e2de35173ac58aa6130ee1ac1fd9245c1..5e87fed740d63f94f11c59fe8bf157ea40a0b4a2 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 c1e7b373e837ceee55cab3c353ff9a4b6d797338..dd6c674af24e72bd94875feddddbad5f99fc013e 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 50bd20f492e090c88cda97b7f819fb9498b19d90..99d595b1ff17eadbf89baa20bc23334e64d0c9f5 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 8a270af0566cc34d65a010b31d74690e4e131d1c..65b02aebaec135d39ae3e592e5ae1ae4fee71202 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 afc95471116541f2f75891a4c3d22e8201a413ff..4cf1678449b080a5ef27ea5a328f22825f922ab3 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 9a62f99e1fa7bf1eb4e701e5548467592d39a405..6d8bc28026c7c5ce1eaab2e53646ac44266c4643 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 8fd8828737aed5736886785f0ea51b877f8dc77d..ebe05e5088341a5808f115d50b604934aeb82efd 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 63ca871a459d95ab6dce355160760626522bc695..dd5d59df002ed26a0959fb4c4e5ac2810b074487 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 e4bb5fb0aeaf0dc1df8af800ad148bbd05c1d5a8..64f688c470d3ff4ec6cadecabf194453898c9770 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 11baa36e51bf8da117ff8af3f8a94a42745b43b9..0e44bf10349cda2dcc3f0d537cb8b12673b552e8 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/ft-clock-test.cc b/storage/tokudb/PerconaFT/ft/tests/ft-clock-test.cc index 26a3dae673cd9696919042e620b55c85fd2cb575..00ff8cf204bed22ccd10ede3154823f24d5fb4f4 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/ftloader-test-extractor-errors.cc b/storage/tokudb/PerconaFT/ft/tests/ftloader-test-extractor-errors.cc index 872b674c78410b2a3596ea38c4bcc872495c102f..4bff52ceb1bde1f45392ea655266012b913a0b2f 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 d1aeff198ff9089f7b79d4c60870bc928e79deaa..0b1213167384795e42442ea325ab591660e92b65 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 0784ca87a26d1403fd0bb42b0d5dd10de4dd3250..e4423319518ac1ab0b11dd695ffdde4078733591 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 a31181deb309406b8f7d1d686f7b9d212703d8fd..019852bb7291f3cb92c5ef61fdc134706f4d75c2 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; @@ -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 d4e31af22dcc5e71e580389bc143563c520c633f..fed9467a4aed0da517b281d2e44da0f7f5e23ea3 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 4d17488c57c5ed1d75e557f13aec3144325a113a..0e8b94566df831560434a346b91e49b67366b6f2 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 431ee4b5e50ccd99a0dd9684589e12f6385afd62..a3c934d1f4bd978cfda0477a6630c834717af7b6 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 97e00c42b956f85225b4dc02691da2f6aeb5869d..6afe5b9f7c41647cf7aab7943924c84ecf72e805 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 3e5d9bba817e93921172e3441719acbfafca9bb6..06a2661488515d9c1647a20af562e5928758bc63 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 cb316127ef7825cc6a2345c7b13a24c23c1d841c..1029dfef320dbe102f21e7978614a0eb9780a161 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 5f8485ac4ec746a22c538f1a94a944d2568e55e6..208ebe3ca318492ea9260629b9fc07c65f4d201b 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 70c3ba22a0c992475e62fc838d30294f1ffd19e0..2b29de409b12041c07c20d6568472eaa8b6da839 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 e5e24a8824675e038b6cbff79c58c4e24375903d..9e4a46e8dfecf1ffe0cdfe8fdb4d5398e4b4bbc6 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 97afd2f5bdb72f787071456da7eea3985a0f78fe..7228de06f34ed8f886cd69eeb2550b11541388b6 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 71b1e79277c6eae09850713c0faf657fc3ffb3d8..5e1ab746936ee1512ccad1764db57777c2409698 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 a3ce6beb7b088eb1e03b6ca487adcf599062ebc9..7327cbd9d24162928d029da5315d6b770e1b2ded 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 db110127c552026ae57c75bb202a0af8bd649bca..99a21331b0a735fb542cee9da7e4ca97f2f9c308 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 88eca36a261b971039054e31441c5085d26c4732..384a960b1f372527a2b90bc28ecf3615f5a93b3f 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 0151b5bd466489708e8174132e523eb8acb0eb2d..c0829e3f4e1cf8c295d95f6f933f5d99b9d2fa20 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 2fbf078bdd641f960632b111c74f3b867d291a12..069aae26f664b3ad2cb09739362e29476adf2c69 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 91ff7c5a007c88c0f6ec2d7530ac5708a62a0529..6bb5c77bf32be12d424a1e52bc929135c39e8750 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 6c143f963ba6b221319a28f338fc04de1d43057e..32029b5bddd7e42fb93bdd4f79d6be3b81530214 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 17eb07060d4ab55de8baef907da90afc527672eb..ff59a7bdd5c387fd7fc203fdd420dc8e9a99ab6f 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 4326e8fafc289d83861f44048f279fcec8495f1c..be1ddaba9d082f22faf1b32ca16ec4e3f2381ebb 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 d146d94e33721403858d04496bc44d389c203bf9..9dc9596a7ed0cb574d8a9ec07e57702fd5c658fb 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 ec9ef21583c869adf9a170aa0cd8ed58598cbe7b..08ce63140a598491e681775da814068e66ad0dc1 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 4f43291fe7614101079f18e583d94c0f925f493f..cc3a4969643bee311911a501ab1c244ebe0a9f28 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 4793db63cc1e8e487bc33b43bc79a1a75c7aefd5..e5576a5d463ca65b3601818902331af5b660d380 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 0e3efc1a12afc60398d5b5e8db77577568ad8e81..485bfac8514cb390ce7628b6b6edaef7c67b487c 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 5430ff84b70591903fffbf60b953126b30738d73..9594158cf3813b27ab3e4dfc8b65e5b8abaf12b0 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/memory.h b/storage/tokudb/PerconaFT/portability/memory.h index 5ae652d39fc52e1d00a9abc5aec54892c01966f4..851e4d69e03005b43c2a096e088d570562a1341d 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/portability.cc b/storage/tokudb/PerconaFT/portability/portability.cc index 19f445a85d7f4afaa97127fda96f80a5cc9015f8..dfa5153cc667ab0f4e511f6dfc731ed3e8068ddf 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 92f2fb354f70eed8aece504fbfa1e212a5c98061..d1ebc81e1dc96dc93eaee15fae24bfc365920797 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-max-data.cc b/storage/tokudb/PerconaFT/portability/tests/test-max-data.cc index dbbea974a49ff761542042187fec3704e7fccb28..fb5fc37111a77a963c9ff1ddd28a9cc298d8467d 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/tests/test-pthread-rwlock-rdlock.cc b/storage/tokudb/PerconaFT/portability/tests/test-pthread-rwlock-rdlock.cc index 364bd7d3766c22b147aabdf36002cb085d14e301..62aa5205f3c108df68a36f5ce197fee29ec07d21 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 3ca9e06bff75a4d04fda509597a91553b0a67dd8..92b30421ba9b44ef0df255acfd5a80dd9f646b17 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 494a17bd0742b03bc664092cd78b66f1f4f206f0..57201764afb899bee461d826c74b6d509316efaf 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 1e1c7533c15e77a61ececccff0730db8be4b7053..0d99b36b51a48f6473137f77b6dbaa479579839e 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(client_extra); DEBUG_SYNC(thd, sync_point_name); diff --git a/storage/tokudb/PerconaFT/portability/toku_instr_mysql.cc b/storage/tokudb/PerconaFT/portability/toku_instr_mysql.cc new file mode 100644 index 0000000000000000000000000000000000000000..b7b4c0ab233929cf88a3575933e8accfa8f876a7 --- /dev/null +++ b/storage/tokudb/PerconaFT/portability/toku_instr_mysql.cc @@ -0,0 +1,365 @@ +#ifdef MYSQL_TOKUDB_ENGINE +#include "toku_portability.h" +#include "toku_pthread.h" + +toku_instr_probe_pfs::toku_instr_probe_pfs(const toku_instr_key &key) + : mutex(new toku_mutex_t) { + toku_mutex_init(key, mutex.get(), nullptr); +} + +toku_instr_probe_pfs::~toku_instr_probe_pfs() { + toku_mutex_destroy(mutex.get()); +} + +// 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) { +#if (MYSQL_VERSION_MAJOR >= 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 0000000000000000000000000000000000000000..d6b0ed35ce97f69d8f2564c4885bfd683d8416f4 --- /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 0000000000000000000000000000000000000000..c300f9275b892436b3c2c21a9e129e8bf9825013 --- /dev/null +++ b/storage/tokudb/PerconaFT/portability/toku_instrumentation.h @@ -0,0 +1,341 @@ +#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)) {} + + ~toku_instr_key() {} +}; + +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 3a0e7376971dc5c439132fa607521ec17932aa9c..d7cfcfefb9aae2b69716d36edc61001a4c7e7223 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 28ea8014f5305699301ea1b2a5a8f992730fbad4..8a3dcf5afc484553501bdfdff6e7f91a2d936e79 100644 --- a/storage/tokudb/PerconaFT/portability/toku_portability.h +++ b/storage/tokudb/PerconaFT/portability/toku_portability.h @@ -125,12 +125,39 @@ 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 // 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__)); @@ -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 84c277362010f63a0fe98566c25f3d880cbe0cbc..a0dfcc246a73dc5f6c5d51982c8596405bc8b9b2 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,74 @@ 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 +#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, .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_mutex_init(toku_mutex_t *mutex, const toku_pthread_mutexattr_t *attr) { - int r = pthread_mutex_init(&mutex->pmutex, attr); - assert_zero(r); +// 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__) #if TOKU_PTHREAD_DEBUG - mutex->locked = false; - invariant(!mutex->valid); - mutex->valid = true; - mutex->owner = 0; +#define ZERO_COND_INITIALIZER \ + { \ + { 0 , { 0 } }, \ + nullptr, \ + 0 \ + } +#else +#define ZERO_COND_INITIALIZER \ + { \ + { 0 , { 0 } }, \ + nullptr \ + } +#endif +#else // __linux__, at least +#define ZERO_COND_INITIALIZER \ + {} #endif -} -static inline void -toku_mutexattr_init(toku_pthread_mutexattr_t *attr) { +static inline void toku_mutexattr_init(toku_pthread_mutexattr_t *attr) { int r = pthread_mutexattr_init(attr); assert_zero(r); } @@ -138,61 +198,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 +224,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); +} -typedef struct toku_cond { - pthread_cond_t pcond; -} toku_cond_t; +inline void toku_mutex_lock_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_lock_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) { + 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 +} + +inline int toku_mutex_trylock_with_source_location(toku_mutex_t *mutex, + const char *src_file, + int src_line) { + + toku_mutex_instrumentation mutex_instr; + toku_instr_mutex_trylock_start(mutex_instr, *mutex, src_file, src_line); + + const int r = pthread_mutex_lock(&mutex->pmutex); + toku_instr_mutex_lock_end(mutex_instr, r); + +#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 +349,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 +384,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 +517,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/portability/toku_race_tools.h b/storage/tokudb/PerconaFT/portability/toku_race_tools.h index 8482a164fb8f2d5b93b627c5fd29be94475ae1e5..96712ffffdcfab484ff863718dd8c99cd686ef74 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 a1278ef0337312771ce047fc8d1dd0471924a827..c4c45b8e8c745016534ec126c20bca3718dfaab5 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 65bf4814cf8554872d81394f85796abdf504a34a..bae37389004be25f3a8999e5d46d1fa22b89d89e 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/indexer-undo-do.cc b/storage/tokudb/PerconaFT/src/indexer-undo-do.cc index 4c7f5336161da5479392d0251b5afb39e14d9b7e..cc86402751bbd24ec23118b42ff56b00e3febed4 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 b475b08beb5964fc835c3f16cc767eb35eeb890b..044ffac917c7957ac980345328a1fecf01607a88 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 d9d865254f1ee6035df40b91057b4a0343d1839a..3b53911e61479478397461e348b7217b23586435 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 9f3f8f4eb6ae3ca7d9fa5ce6b016ef72f78ef0ef..c104eabd6c3fcf73387eb902ad0f45fb14a1d927 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 a62d83eb46f1a209a9c49eebb202315654ddc711..3a702e3f115f3bf53c32a74d6ab4694cb3038a53 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 bd5697ba5262b891f04b30e3317695699986157d..781708cc627d2ca3a6f96dbaae3eb09106b41606 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 729473bb7cf73cefbe71e0fcc6895f30e1d09253..aa179e88d765e407f42ff76ae32fd98c1329f02a 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 8821b39aa8a37c5153c5e252cea370e756513427..38875a2f8ecf12a4e8f01fe765481b5396da338c 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 a31e173fd83157761c24cc4cb1b7b2a8d31e1d9b..bf4a8a24f4737b3b93dfcf05a459221e90bcd4dc 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 615cdb5d17c2618d3a87b4b66c7bfd60981c03bf..dba7962de35bada430f17ada05fd19af0b73c849 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 0fa56325007fb896f27f45cc2db3a041f443ff87..95481062483b16373b8228171b74443f2604d283 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 a0e03ab3293f695b058749c46a60f75744bf2f1c..7c2e7b0fb26988571d819739649aa91621cc430b 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 056d74dbdd2aa4b2de922d5a0108baf90c6db305..54a5846eb5e8007b7f6be1b711cbef2baaacfda8 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 1e7fca85bffb51b5c2b03e0ab3c8dcea5def1df5..59e582547bfea4cc22e593bdc41623305b1bef06 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 ba64989842ad0a13b0ffe1d1636af767e66af3af..aa433c87be15da55ae2d05e601fdeeaa3c1a44c6 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 9ae33c566214468a9990e1547a2d8835c866dca6..0953a4e80de755de9464fe60d8611d403ca0debd 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 be82f8c352f978d2c758e11d8b14fe5be964f9de..f62dfbc76d38ee9d3f71d8f7405ddb70b6436224 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++) { @@ -346,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/db-put-simple-deadlock-threads.cc b/storage/tokudb/PerconaFT/src/tests/db-put-simple-deadlock-threads.cc index ada46bd751612871f7b31aa4c84c05293e497f4c..e5bcc6af7bba4228ab71d7c88191b71f64c924cd 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 365ea39ecedc35250ade13c6af42be6f4662decf..0fbe851532ef5ab3cc71ba48eb0aa3b423ecb56d 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 3660f11d1bd62ca86b1095b1023c8e6dd961d211..7a968058d7fb44c5ba019fb7131d3fb80e7d0f23 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/directory_lock.cc b/storage/tokudb/PerconaFT/src/tests/directory_lock.cc index f040e680903cd191caed04647470a12e85425db4..b28a71704cf86afa85633bd8481e2749b2d1c211 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/filesize.cc b/storage/tokudb/PerconaFT/src/tests/filesize.cc index 6ab22245e6896156fe681729f3c1fdc1a0dcc21f..9dfeea131c6ab93ba87e19099edeefa3ebd1bbb6 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 82471f30e4561fe1730f018088dc5d29f9bb518b..5336bc3329f520ad4321cd6d8d0e565da696bb00 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 eefc621f80ae464daee420f4efea6e80d36682f4..004a19eccec704c9c1367df7d19b8efb3435ee0e 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 27501291b15de3fa96fd454146b44b4ba8b3e1db..f4dd9c53ed5386b9253b3efe20ca732d640098f7 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 59b40037125d452e0d3fbb9dcc0495e5da654ecb..99c9bf301ccb02a342ca6eda2e04c119b51f03bf 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 a0be49c1617e48c761385d1040ae69010532f5d7..2bc60142f3c12732fabeb564422c3c3dcb4c4748 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/loader-cleanup-test.cc b/storage/tokudb/PerconaFT/src/tests/loader-cleanup-test.cc index ea894683c232dd2fc4bd8728302e855546f3fc37..a229cb5b5651c4775db08001c2271e8552f790b8 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/locktree_escalation_stalls.cc b/storage/tokudb/PerconaFT/src/tests/locktree_escalation_stalls.cc index b4874472bcb0080c429a073e19f0e11e71452dfb..e6c1b18b2b6ba3517a09795a1a7bd40bb51b5eb6 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-del-multiple-abort.cc b/storage/tokudb/PerconaFT/src/tests/recover-del-multiple-abort.cc index a8455c0f4067af91e59657b58c9c8e13aeb533b9..425c12e1a90fd9293a716526f7865b1b31b74ad7 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 e823a74627d1a4fdbbeeaac4749ab5a614aa76ed..75479cb69c4118611c16301083ccba483cd66bfd 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 c2ee80c438f24ecd78badedfb6c9e0f5c9f27d13..9f4b1cd9cb84218ff7441db6c86d4f4a4a928496 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 d045800960c05285977d099145e5f4c972057c0b..da40a61f24b73d9af9e7ebfb9c3c86fb1fa7ab66 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/recover-test_crash_in_flusher_thread.h b/storage/tokudb/PerconaFT/src/tests/recover-test_crash_in_flusher_thread.h index 0ed68207ed4d7bf301b6480eb731cc85afcd5b9b..5c10d0cb712688d63dc9a45d6c931643a1ae37d5 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_fileops_unit.cc b/storage/tokudb/PerconaFT/src/tests/recovery_fileops_unit.cc index cc99ab560d85ebc58e9b118b30a650a1cbbb73fe..45f0b465db49cfe3b23455b1b50325536758ada9 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/recovery_stress.cc b/storage/tokudb/PerconaFT/src/tests/recovery_stress.cc index b1f5f98a90aa1b1967749623423b2149e790c511..1646030cc85c858c619ef86c62ac4afc04ccb7ee 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 3f10bfe8aeb7e7bcb6594aa5240839ced9496432..3a55ca4486f2feca71a456c2b8076499e1f04382 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/test-prepare3.cc b/storage/tokudb/PerconaFT/src/tests/test-prepare3.cc index 5cb3796a26b82a34f80565e3ebf6d66e47dacd13..f57fc963529b4d83fca98638ba5abd2ffe28bbb4 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/src/tests/test3039.cc b/storage/tokudb/PerconaFT/src/tests/test3039.cc index 54a2b3bf730781be84ad511e711709d5225a0a4a..6c38fa1359261810cadf8eb0857ba380c9dc1dc5 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 bb5566b032d4bf1443478913d6f18fe2f9dcc6cb..e1fa37bef54a897db524325672bd302fcafb42c1 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 dc18242b489e591f3d3151941b06850144cd0655..1231e3b4bca34837ba93e2dce389568cad50d87a 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 55449610ffbe467c5ae418de0204a39889f4ae34..7b60364878baee1a629e8cd5ae5bd3bcce8f01f6 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 e67efb465b2d9c2124afb853a099bb3b7bf29b20..e797fc640d8192a7f88e4cfab6b3e6de73425bc8 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 728afcce1b9c450e15b073392c67633d5e6469f9..d5d056d51268f44a2da2b879d084668363a67f92 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 910cf46e5138779392cca0be90c2a227a47cd84e..766372a15c2820d3e4ba6065feb2070f6f3d4f9d 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 414ddd2b70af71f542052bf10e4a1dc6f994ca84..35104c2a569e5bb29fb953c70f73769d8fdf3ed4 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 94eaf2a01a9de033796d8e827f1713421ed64b3c..6f872d10a32a389ef421bfdc2caf9a6f01014e4a 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 f2bf0a2c756d7459fedc452d96f8dec97e5ba315..66471a74af29159e436c17ecf33de8f8f99169ac 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 75ea49ec8583db6f8673da035b599db28e369ad2..571bae699169c6d3681b8a44ca4b920ce50745e4 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 65fa1d830efeaefaf91fec005bfe25dd9abac263..5473a8e3d5e108b802c2af754caded476be2fbe6 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 92c3657a1548bc529c2def6cf91e011b26b1a977..c66409fb8238768d6002f821b42e5b0952d858f2 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 e5de0a5d906b82bf720de3bafb47bb8231f5ef1f..133eb36ddb5a6d5fee794d8e1a590491f4066b81 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 66e9f4a5ec835331b5dd54b91364134f64379965..da53a7bfe1146d120ea3937793144ff383a30dba 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 e0bf0d2ec6f8aac321ade8ea94beeef547a2693c..6395f5916604786db732bbf7f6d15aff198a4757 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 0d5245e8f80558215c7cfcf9dea4f44961ce602f..a266de638f1d73827378c499e18704941d537b8c 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 f2bacceed9d2fd528fdd17e73adef95c41049d00..e232f327d1065003e2bbcd79cf35d74437b16d8e 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 30cc16d73a7c5840be15ff2d0234ee13c77799b0..469e78f492f1c7ab54d947c377e171b779fb89e5 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 1edfe9c81f9a592b02dc8066567e6065ec0fb536..41f48d4ec09bee97542879bae7702a1c8a8ecced 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 100d1bfa20b1409f4da7589f0a6fbbd6a3b9dd63..40c4a7f65772996ff752363d012821c39795a0e0 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 8be28857c142b93273e50b258f5cce88e6209880..ab8fcd2a401f956dade144d6cfdfd8f78b43bcf6 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 13c56fec6bf7bc8dbb5c3f1ee2520698e30090b0..b8f0a63411619c4890ace79e60059be2c88d3905 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 40b479055f22405d52ead69deca871ea7cfd333d..dd5fb3b8f0c78ae8d54b9b32723251b86b88be0b 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/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/tools/CMakeLists.txt b/storage/tokudb/PerconaFT/tools/CMakeLists.txt index e6540bf69be5b2e25293d3bd4561e3461df40067..af40a838b9a81d820d8015a10d3cc8c25224433b 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 5bc1cb7446f0100aab1bb44d1533d8d4dcaba2bf..b6d2a584a4551d9f6ba48e73ab8860af33aa8ef7 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/dmt.cc b/storage/tokudb/PerconaFT/util/dmt.cc index b5b94982487ddecb6605f0d1ed1a4a00f00f1134..642c9367d7eae83419c04dd1ca4ce3b66f4d21f8 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/fmutex.h b/storage/tokudb/PerconaFT/util/fmutex.h index 9ff95978a168c8c30fddf801ea657b2dd1238166..fed1bc24a92b8817b1af9badb307521e07b4d87d 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 ce1e33e85d38287982c6ed42b9bc9e9610be44e5..1f821fe5f546aa60e6742c24c866e45c858e1c43 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 52b98a8d727ca302d4af8f799b232f137654cf47..b02d95e545cb860fd7f1150128df87d8243dbe50 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 7fc24bae7275bb0e146611a70303f89bdc5f2beb..409bf6bdd7ba656bf674259ede2ce68900312dda 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 737c6ef6a4fc1ba1d8f4929b0390a3a0eecdf65b..c1412015be073e635e11a86c81104a7624bfeb88 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 3490c1b365ca8ed66d49bd6d665e76b502f3d5fe..d777961ad782159aabb6b8c49673e1f6008bde8f 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/omt.h b/storage/tokudb/PerconaFT/util/omt.h index c7ed2ca546fe131c0d66c77af85069ff10cc5a46..36946401381c2c6300c9bceff9b4f14992915fdb 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/PerconaFT/util/queue.cc b/storage/tokudb/PerconaFT/util/queue.cc index 0716dfb2f59448d17ad76af5ebee4c944970bce8..39dfbbc699a62a492913a798c12e2d1883d156d3 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 47f78df70d1cf54900f4d465f5d564fe52035758..d9a13ba9014296f69e25fa194f348d5a6942f3af 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 bce1b1a885b526ef45bb4941f47890fa256826f2..7e60c711c668d63ba43e974b5668327f6150dce5 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 a2ddbdeabdf07edadc27f78985f219488d3daa60..026ab7446d3bdead21afcec236f426d51be4a7cb 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 80bc965fd316e471cd5f324e6e9a52cf7b208e23..0e5eb8364e2e4f56cd62aeb1ab5ff04ca678051b 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 c5d7e3e53a78a13b631cd8aa2f406a888f36cdd3..5aa3565510b79e3ec4b468aaee3a913a4744521d 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 7fd4801fe1195e78a815c2afabe2c0e0e5091176..9a625c32aeb3534a1376906cc27419e6ebc63dc1 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 0075ddf9bcbabafd0b596964fdd0feaefb32ef66..c0b43c2db1ce01da4cc2739d5ffc74ffcc2abca7 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 18ca1229f56ce1ebfafb2b3a16f852220b7622e2..56dd3f6b480ba58b614c523f77d41eb2f9a5462a 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 146cc63242a2aba03eb8c4c9a2118e8b64c189e9..6e0ccf05f93851cd2a96a5b4dc09954a7098ba32 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 56bebf1c3ec2644a29a4525182264f4eae59d4e9..cdd4adb0947642ebd7a0695488b2c088a1f5fe7d 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 3891e57738b36f20b87a17658712d7334a42cb1c..a2fd747bb92536229502d1ca8f31695f14ecf803 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 23de81f3d8af11eb855950ed82433efeacc2d07a..9fe5e729ec4e87ee4b31351c28ad6cbb0a8c983c 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 13bc60e9d98765881706c03c0e8dd77c9280ee6a..88ba83ea0ab1651d4bbdf708271d46b49ba139dc 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 1b33e0a53e44222e911b955735ee5f2818d02535..360272969e57d9d9b2a0b10e85e48d66476181de 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 7b44044bd816eef8b1de79148c1b7e287fc3e772..1016ae83ad2db6d142dfdb64719af3f4cf4f3a93 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; } @@ -950,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; @@ -978,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); } @@ -1008,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; @@ -1027,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; @@ -1718,12 +1764,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 d126ff4339f26134078aeda85d2fdc4cca3a68e4..80e13fa9b0c57c64f220e13af4d4d9ae8dc6cda4 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/rpl/r/rpl_tokudb_row_log.result b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_row_log.result index 8cbbda48c1f528f72962cb491ba7350491cc60dc..f283b3adf80ebb258c1467dea864069db5c098c6 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 42defbe07b5d7ff0a31920ecc55281f803a74f38..0334000f12e8a030f7aa42eabfed0c233a0edb55 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/tokudb/mysql-test/tokudb/disabled.def b/storage/tokudb/mysql-test/tokudb/disabled.def index ddefceb432ed7178acc65056ac6627e54f985a72..7f354cd8ba67fd2f6c7b24a80cfb418c8e3eb307 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 cfd7e38179cbe795381a83bd3eb376addaef0a5f..981433fac9137e77e5e404c664e1d8aefb630fd1 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 0000000000000000000000000000000000000000..c9fcb5e227363c05ce658be43c16d66f804bcad8 --- /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 0000000000000000000000000000000000000000..f1b214e514c43f834bc6bea9dc17ac75266e87ec --- /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 0000000000000000000000000000000000000000..e8f51edee04b924a21c6d8abd5944f8af0ea87a0 --- /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 cb6691484456221efcdde19bf6378a2bcdacd330..15d4f9fe12ad080a01f7fb8bc7ba2b10434733e4 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 47f1eb37989293548c1d3c220476f30085115f8c..75c53611308b21f42b371f9a5b2df712713255b7 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 0000000000000000000000000000000000000000..c5ef0f0703e95dd885c7e6dcb783f0f67fbc825e --- /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 0000000000000000000000000000000000000000..20a4549c45f428d4a8120f0ab18ec61b530f06a4 --- /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 0000000000000000000000000000000000000000..0c4c01b3dc0836e690e52ec95cb2e2fd0a115b8e --- /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 6533f8c06be9589c50a2e33cda52edb57f80d8e4..9c5c6e6403e723293e138c623146e83937121c0b 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 5ba5da217891f06923cb43c725038f56fb64aea8..caaa963c325ad7c6e5aeee447d8991c75a50bc56 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_bugs/r/db917.result b/storage/tokudb/mysql-test/tokudb_bugs/r/db917.result index 9c29033429e4a13c9e8c787a73f01220ae8f3216..9276664f84f591f9fcc416b0ad2cd187bd779570 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 ae94d7b30de60cdc349492402ef1685ae806658d..781fdb012f136db34f683c83cad7d297b43179ab 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 2e9faddbaff8347ce3db2bb1e464e3887886ea84..3804a583dc3397e371b149880a323440887cb75d 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 a809c3faf063f0a97cd45509d50b3e52084ca284..b723a5d72e8a9422f235bebf9aaa34e92444004b 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/mysql-test/tokudb_parts/disabled.def b/storage/tokudb/mysql-test/tokudb_parts/disabled.def index 3252a463176de963c4ce6bf119d6d85f4e4a1eaf..17a8ddcc12e8579d33b42492a17686ee129888f8 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 0000000000000000000000000000000000000000..5a7bfb369dffd53953a85c667484213a85fcf755 --- /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 0000000000000000000000000000000000000000..c99206acfe3ff187782d6600f27ab11d60530398 --- /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 0000000000000000000000000000000000000000..189d6bef14ed580345a1a33ea210c852787ab021 --- /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 0000000000000000000000000000000000000000..2e220916ec3641ee6fe8265a3cbff798c186d485 --- /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 0000000000000000000000000000000000000000..31757a202590f79c64c1d55f252ac384573f292d --- /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 0000000000000000000000000000000000000000..4034fba05497fb187222b8716856e63be759e115 --- /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 0000000000000000000000000000000000000000..6d826fe91d1b590d4e6deaad5c34dd72195382f1 --- /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 e019e41c7882470a45c6f2780a4934d61e3a6120..13e0e9321cc211a4762f69f6f20c339fe889595d 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 29991ab325d543ba58169ccfa72f07c317573588..bf5eb97a6191bf8edf4e8ed46a82f791682e9e27 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 5cd0609ac74feedbf663ba0d7150d823127c3578..bb263d5f960dd2fa2d87cfb7c672247ee90635a7 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 f27e803a0655fb242f211cc7804c232d430c7064..6fc1191975dc46725f69656e9dee60f38e658f8a 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 dcb1fd6ec635b897176f4bc13ae324b7994925f0..5df0159901f8f5a639523f19a2a921357f9f9dfa 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 @@ -138,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); @@ -179,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 @@ -224,57 +195,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 +273,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 +303,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 +338,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 +350,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); @@ -390,30 +370,8 @@ 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 = pthread_mutex_lock(&_mutex); + int r MY_ATTRIBUTE((unused)) = pthread_mutex_lock(&_mutex); assert_debug(r == 0); _signalled = true; if (_manual_reset) { @@ -427,7 +385,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 +395,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 +403,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 +425,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); @@ -497,34 +455,9 @@ 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 = pthread_mutex_lock(&_mutex); + int r MY_ATTRIBUTE((unused)) = pthread_mutex_lock(&_mutex); assert_debug(r == 0); if (_signalled < _max_count) { _signalled++; @@ -538,7 +471,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 +479,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 +487,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 +496,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/CMakeLists.txt b/storage/xtradb/CMakeLists.txt index f66a142ecd86235acfd73b2d7610119ea96283e5..f5ec6fd746d5b0b226d799b1feea804333689a68 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 @@ -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 @@ -503,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/api/api0api.cc b/storage/xtradb/api/api0api.cc index 1abb0b2bdd1d94af3b235afd17641f42c32f203e..55ed555ed48961e36c91187b82fe09d4d1772afd 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 f22871deb3211322740e136bc6be32a5990d05de..e29d9091f8e967d814af1d6554cef4b5eff944ac 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/btr0defragment.cc b/storage/xtradb/btr/btr0defragment.cc index 44acd9118d7898703b9e5c9a9343b75cb14b05d0..3124db650c6e2ec984c99c8f3f0de593f7bd91e7 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/btr0pcur.cc b/storage/xtradb/btr/btr0pcur.cc index 0b970e1cf492ac8f52e5ed6cbd52fe7efee83819..06166e1aa16f8526a60478b1b5ff298bca1211da 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/btr/btr0sea.cc b/storage/xtradb/btr/btr0sea.cc index 12c99246f1617d875e9e884609cd63d442bab881..713a584ee7e0885e77d192397eaded0c242848bb 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/buf0buddy.cc b/storage/xtradb/buf/buf0buddy.cc index 2ee39c6c992799ece85edbbdebb3ae32b4e46b72..1c50e71e68756dcf490729274a5429e83c4ea23b 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/buf0buf.cc b/storage/xtradb/buf/buf0buf.cc index 2ee2b2ba37fe2c98f2a7bec1bd321d9dcb35965c..3ae6dd56586470d338a5506ced7a605f426aef03 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. @@ -102,10 +93,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; } @@ -387,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. @@ -2966,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)); @@ -3085,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; @@ -3148,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: @@ -3366,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; } } @@ -4681,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 @@ -4718,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)); @@ -4736,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)) { @@ -4929,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; } } @@ -6228,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 @@ -6337,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, @@ -6354,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, @@ -6391,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 ee8c85446e9d34e5b2a1cb733e6cdfe1cd8c24af..0ec23cbdbe1f04dcf92db12694df11f11d45100e 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 bf384390a9823adeed76d97c5da1847bc9c435e4..ce21a30896087d7e594229831cf4bdf1fe12a20a 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 abbcd5141cf613bee42744fe6359f631e2a21f7c..de59bbcd4c0b1a017f906299cfcc08112438bb7c 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 c71d45009e4561654b307f5fd392aec6a56c05b6..2c4a4049de633db1fe355aa7fa83dcfd1f1223bf 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, @@ -234,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 */ { @@ -245,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]); } } @@ -265,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)); @@ -327,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; @@ -359,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 @@ -729,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)) { @@ -1080,68 +1086,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 +1166,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 +1173,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"); + DBUG_EXECUTE_IF("ib_lru_force_no_free_page", + if (!buf_lru_free_blocks_error_printed) { + n_iterations = 21; + goto not_found;}); - } else if (DBUG_EVALUATE_IF("simulate_recovery_lack_of_pages", - recv_recovery_on, false)) { - - block = NULL; - - if (srv_debug_monitor_printed) - DBUG_SUICIDE(); - } else { - - 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 +1224,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 +1263,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 +1289,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 +2072,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 76b715507100a648ad5792e2d408fd0f0f0cc778..43e678ed7d492a1336ac273a01134c36231ec272 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 0b9e08544a5c4d33b4ddcde4049b68838db86f6c..34ca399f9b2ad99583f22b7a2c8f6b7cadd0c0cc 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/dict0crea.cc b/storage/xtradb/dict/dict0crea.cc index 6d5b12474ebbd0b95f40e794061219a40af5dc78..2fe9f8af4ecb03cd0c7bc8e871fc732179e43a43 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 5af3a635a96f47fe3b9316b1262f5baf7fc2727e..7ade6d79adfa9ef2e384dbc8451117509fa54b4b 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); @@ -3409,6 +3389,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/dict0load.cc b/storage/xtradb/dict/dict0load.cc index 6171bbd80d027ecc98349ef9e50854158c92d4b7..fb14a9058a5001d5cf0084b6766967d2e7534330 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 125d7d78a1f3dc69d9e66414dc6b0b9d1963099e..ab6167b920b63778f728afedc5e67ffc6de47903 100644 --- a/storage/xtradb/dict/dict0mem.cc +++ b/storage/xtradb/dict/dict0mem.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 @@ -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 ba6fd115551c0f0eabc6a598f8cd9f5c596b3767..884f62103f501cf941b5d83908a78d7d815e4392 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); } } @@ -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/fil0crypt.cc b/storage/xtradb/fil/fil0crypt.cc index 3095503cfc5569a81528249c9c024f2503b4d68d..932d7b9e31209988f3943aaca7d74c25d1bcfce4 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 00f2c44637e39f31e77bd83a3aa720a666fdb285..a88350831651fc3ee4e13a1c2231fc1dc71e501f 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 @@ -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)); @@ -2125,7 +2066,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)); @@ -2136,7 +2077,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; @@ -2939,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 */ @@ -3050,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; @@ -3252,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; @@ -3260,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 " @@ -3290,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) { @@ -3356,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 */ @@ -3376,8 +3251,6 @@ fil_rename_tablespace( } } - space->stop_ios = FALSE; - mutex_exit(&fil_system->mutex); #ifndef UNIV_HOTBACKUP @@ -4109,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 @@ -4124,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)); @@ -4467,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); } @@ -4966,6 +4828,11 @@ fil_load_single_table_tablespace( return; } + /* In mariabackup lets not crash. */ + if (IS_XTRABACKUP()) { + return; + } + abort(); } @@ -6055,7 +5922,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 @@ -6087,7 +5954,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; @@ -6150,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(); @@ -6307,8 +6180,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 */ @@ -6682,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 edc932f36f5f193d990e255fa1bb9e6639e6aeab..25cd8e28a91dd35006f703dc6d57d28cdbe752f4 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 ffed8a6edd342a6fc417cabfd569a427c179501d..f97e0c1331b74e1fc49b26d1beea4deb2014ee06 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 88b5ad97277298ce7688a02fc89e3a5b6fe5e04e..42cb2056dfc20c755ba8a64a90be195ae3159fcc 100644 --- a/storage/xtradb/fts/fts0fts.cc +++ b/storage/xtradb/fts/fts0fts.cc @@ -1,7 +1,7 @@ /***************************************************************************** -Copyright (c) 2011, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2016, 2017, MariaDB Corporation. +Copyright (c) 2011, 2017, Oracle and/or its affiliates. All Rights Reserved. +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 @@ -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) { @@ -4594,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; } @@ -4609,6 +4643,14 @@ fts_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) { + static_cast( + ib_vector_get(cache->indexes, i)) + ->index->index_fts_syncing = false; + } + sync->interrupted = false; sync->in_progress = false; os_event_set(sync->event); @@ -4705,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; @@ -7535,8 +7585,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 cb30122adcb555b6bcdf9c9d07c1d0dc124c3da1..d9f969480003b1fcd0a66b1c13e64779c9653ab8 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 358d979fff60b2cbec865174fd26c9e7266cdc89..100dbcd70cae01fb13acea4578e70a91ea06c35b 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) { @@ -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 28e3b23b667c82bec5799b2204ba07e279892ffc..a7d06617696753d35039293d0960b700da70ad61 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, @@ -1289,6 +1335,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", @@ -1375,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. @@ -2696,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)); @@ -3218,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) {} /*********************************************************************//** @@ -3838,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; @@ -3934,6 +3978,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" @@ -4512,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); @@ -5437,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 @@ -5461,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; @@ -8870,7 +8908,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: @@ -8987,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; @@ -9462,7 +9498,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. */ @@ -9613,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: @@ -11883,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: @@ -12119,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; @@ -12261,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; @@ -12307,10 +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; case ROW_TYPE_COMPACT: + innodb_row_format = REC_FORMAT_COMPACT; break; } @@ -13699,7 +13723,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; @@ -14500,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; @@ -14507,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, @@ -14515,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; } } } @@ -14528,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; } /*******************************************************************//** @@ -17504,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 */ @@ -19755,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); @@ -20500,7 +20515,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" @@ -21070,6 +21085,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" @@ -21094,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, @@ -21528,6 +21558,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), @@ -21536,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 c5b0e72370268b653f837c9db060d82661aad6af..3dbbc53a0e33bc09085aa411165ba45503fa6e04 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 b2f0d301815c39777e0c4517df87636916d4e220..131939bcdb2f92203504dbb968764b3e445fa1cf 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; @@ -1623,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 @@ -1938,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++; @@ -4434,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(), @@ -5801,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++) { @@ -5917,7 +5901,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 @@ -6154,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: */ @@ -6180,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); @@ -6233,8 +6274,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/handler/i_s.cc b/storage/xtradb/handler/i_s.cc index 94cd6f29558b90c161997ee319405705cad6d93f..dc4fa99fc560f8c5e5c073bfdd16e11fc8d45432 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 6925cd3abb5ed66999902ae1c5577a8f74de8ff2..96a86eea4c19d5eb5512028a12bb92a031241151 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; @@ -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/btr0cur.h b/storage/xtradb/include/btr0cur.h index e478b33bf8efe196054792ad009ef2ecae2bcd1c..1b0632e21205182cf0da9786859ff1c7b74f417b 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/btr0sea.h b/storage/xtradb/include/btr0sea.h index bfe2c43defbbb3d897750d534318a6e81378fcf0..55366d3c0d3f22cbec6a5993b1b7e22b4592cd50 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 7661ba1785d5c166aeba7b22caa5f10ba67a630a..0944b5d4067056f8b804585d2b216ad2fde89f18 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 1bc11937fa1cad50964c470798e03c1d2d21a815..f0ba1bb227d6ecc4091c804ec43700887b89c83e 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.h b/storage/xtradb/include/data0type.h index df6b6a41c1184e85ed1bddf9483c049a51c291ad..f3ecab5a3ba443f61915284534e6cebf2b6819fa 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 ff72f6ed20fceb1c61ca9f075072616f60a413c0..a7e2eb0682c04b4ab6bed2454153075cf9a9da1a 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) { @@ -545,6 +525,7 @@ dtype_get_fixed_size_low( return(0); } #endif /* UNIV_DEBUG */ + /* fall through */ case DATA_CHAR: case DATA_FIXBINARY: case DATA_INT: @@ -565,11 +546,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 +582,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: @@ -623,6 +603,7 @@ dtype_get_min_size_low( return(0); } #endif /* UNIV_DEBUG */ + /* fall through */ case DATA_CHAR: case DATA_FIXBINARY: case DATA_INT: @@ -633,9 +614,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 +684,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 dda8f4d271416c73efadf684dbb9dc68892664b3..241ed89e36bf9c85c114f4ce1b805dba142c6c9c 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 4db6a73bbc2159fab82a51816f4c9678c771c01e..17b4adc10e29c9717f4999f8bedd0c10ba2d55a5 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 2a4422fc18bc5525c0d1d38ac7d91e6963ebb079..bdec503c88ccfd3c7e42739672281244baa6f7b0 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 8f3385eb22b6a1365da013e942c0cf34ae76247b..66fcf7a09982e46221c13cc64fdc6ddfd61c53f1 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 5fe2d20b4f052c61aa333860c4860675f87c8efb..7b8339fec7d74529b403a6fb19b4e4798033d817 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 @@ -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; @@ -1161,7 +1153,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 +1181,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 @@ -1307,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 6c2504c9f8c0423c4c8154f90c81211cd4eb81e7..3f21c5293081e17e044f2a0be11676a3c286c306 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 03e16699ce383e3f21c02ef716e4a6462aaea4ab..934372c55b2a45169f07b4e0d11d21ab37aac309 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); /*!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 ef6cd61719d869c714a3f3cc8c188c05292aaaff..42a57f1022a1e3cd621b6e61d33af97103d866da 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 a6d9df099257e55af8fdd2fefc08f029e27cf73a..04c39cf7f7ee7174e11125bc122a428ff29d99de 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 b17e09cf0fae15d2c99405a714f007740a5b68e9..5e93b3454c73632559c50120bb855eb9d850bfda 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) @@ -469,10 +472,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) @@ -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 72ac9d9dd6a083156529eb4a7bc38a7974738e1c..a2011da354591731eba79c1f4aa0c94002995a6d 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/que0que.h b/storage/xtradb/include/que0que.h index e5b2a1ba3fc4c6cfc598d69612b971c94481b6c7..005f28d2af1ce8da946a098939558a09ff298458 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/rem0rec.ic b/storage/xtradb/include/rem0rec.ic index 5811a77a48b765b16d2f77162b3abc261e52aee5..89f6902059dcb63f66e7e33ad9cfb136095cd073 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 4326f1208e5e89e5e11b015b9618ba9bad0b693b..4915e7c7a312b15eea9998bf279c560cb50feb0e 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/row0upd.h b/storage/xtradb/include/row0upd.h index 4312fcf733917174147acf81c2f3cf4154a07b45..9efaaa41cf0123460e2ac98994604af81406d111 100644 --- a/storage/xtradb/include/row0upd.h +++ b/storage/xtradb/include/row0upd.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 @@ -119,8 +120,7 @@ row_upd_rec_sys_fields( dict_index_t* index, /*!< in: clustered index */ const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ const trx_t* trx, /*!< in: transaction */ - roll_ptr_t roll_ptr);/*!< in: roll ptr of the undo log record, - can be 0 during IMPORT */ + roll_ptr_t roll_ptr);/*!< in: DB_ROLL_PTR to the undo log */ /*********************************************************************//** Sets the trx id or roll ptr field of a clustered index entry. */ UNIV_INTERN diff --git a/storage/xtradb/include/row0upd.ic b/storage/xtradb/include/row0upd.ic index 618a77fa4bfc2b55aa864150c447b1645d68dae9..efc6c1be4b51f4e2b5480c8a598e640d013c9991 100644 --- a/storage/xtradb/include/row0upd.ic +++ b/storage/xtradb/include/row0upd.ic @@ -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 @@ -153,8 +154,7 @@ row_upd_rec_sys_fields( dict_index_t* index, /*!< in: clustered index */ const ulint* offsets,/*!< in: rec_get_offsets(rec, index) */ const trx_t* trx, /*!< in: transaction */ - roll_ptr_t roll_ptr)/*!< in: roll ptr of the undo log record, - can be 0 during IMPORT */ + roll_ptr_t roll_ptr)/*!< in: DB_ROLL_PTR to the undo log */ { ut_ad(dict_index_is_clust(index)); ut_ad(rec_offs_validate(rec, index, offsets)); diff --git a/storage/xtradb/include/srv0srv.h b/storage/xtradb/include/srv0srv.h index e7f6350987efc27156bb31efa268113fe864f5f9..6df60e0e52d44f02ce328acfdb68e1e0ba07f327 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 a6e202d04e4eaaf7faebf8e23f63c85e2e6a586e..fef12548003c9aefb92ec5955b106890e682085c 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 @@ -226,11 +227,9 @@ 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 */ - MY_ATTRIBUTE((nonnull(1,2,8), warn_unused_result)); + roll_ptr_t* roll_ptr) /*!< out: DB_ROLL_PTR to the + undo log record */ + 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/trx0roll.h b/storage/xtradb/include/trx0roll.h index b2e9d8a077f62e083610e90bc34074d2499b723a..565079b17b4a03bc84aad8c686d46ed1019ecd1a 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 6024c1dc94e27e19070153efb393a8394fc6cad5..699148cff6d51b5418683c0eb6635efc1f8a218a 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/include/trx0trx.h b/storage/xtradb/include/trx0trx.h index 5db19b3959a2fcd8163d17a505111184414b20b6..77afde4c35cef887c524f80fe9d54b89b157665d 100644 --- a/storage/xtradb/include/trx0trx.h +++ b/storage/xtradb/include/trx0trx.h @@ -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 @@ -744,11 +744,13 @@ lock_rec_convert_impl_to_expl()) will access transactions associated to other connections. The locks of transactions are protected by lock_sys->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/trx0undo.h b/storage/xtradb/include/trx0undo.h index 190308112ba9a564ca5cc5f0903739070584b1bc..0148cc61579360a9f311e580604804be88a5c559 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 5886b078e4debf344c35335a4a38063817135c97..7e1a6b0eeacd1877e91ebb855977158c05e66052 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 82.2 +#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. */ @@ -691,14 +695,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/include/ut0timer.h b/storage/xtradb/include/ut0timer.h index f361ae79bf525f6784ddffff7c4ee3523fdc25fc..3015771b434d7268f7258155fbb7ef4e18041383 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 815726e9d0a1c359c3d3cd4590cc0a342fd5a7fb..02af23cdc6df7db37cd77b474d02d101353b6ea4 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 5fba1c7f547bf5866d3943b29f4823a04473daee..726c01a2e0fda41fa0226513e9353d6153e24910 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 ddaeff69f107a14c8124fb0d50193e20db8b8805..549cc411f69754b9675027e2190c51c4e519efac 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 @@ -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()); @@ -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 */ @@ -2346,20 +2358,13 @@ 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) { 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 +2556,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 +2996,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 +3163,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); @@ -4979,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; @@ -5000,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 %llu\n", - (ulonglong) c_lock->trx->id); + 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)) { @@ -5297,7 +5305,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 +5316,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 +5369,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 +5420,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 @@ -6939,7 +6947,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( @@ -6947,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); @@ -7101,10 +7109,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 +7125,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( @@ -8011,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 @@ -8076,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/lock/lock0wait.cc b/storage/xtradb/lock/lock0wait.cc index ca9d05a4829384005476505ad0e109224cafa56a..da4b0301df866fe4f56ec81822154bd45cc6c096 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,26 +201,69 @@ 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, 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 */ /***************************************************************//** @@ -232,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); @@ -402,15 +461,17 @@ 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; + if (srv_print_lock_wait_timeout_info) + print_lock_wait_timeout(*trx, blocking, blocking_count); #ifdef WITH_WSREP - } + } #endif /* WITH_WSREP */ MONITOR_INC(MONITOR_TIMEOUT); } diff --git a/storage/xtradb/log/log0crypt.cc b/storage/xtradb/log/log0crypt.cc index a5fbbab17efcf40b49d1157b7feecd0d684d0ed5..2a0a7abb6869ef260b61c2ebdb337429ff6ef14a 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 1542f4a646f749e0ad9d7ad8d561e0d4f2915488..1420f5a3a12bd52cb1265a6bab1fd9ff5238b42c 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" @@ -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", @@ -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); @@ -2582,7 +2588,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", @@ -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) { @@ -2890,7 +2897,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, @@ -3552,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++; @@ -3564,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); @@ -3599,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; @@ -3635,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) { @@ -3643,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; @@ -3729,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); @@ -3757,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; } @@ -3790,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 @@ -3823,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/log0online.cc b/storage/xtradb/log/log0online.cc index 27382977e5ccec4442e770c0c6d044d9c8631315..af32237243b3c178665ac81a18b6d9e8a54c94a2 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/log/log0recv.cc b/storage/xtradb/log/log0recv.cc index 1943fb51f37ecda833449bcc756c9234826447c3..d8e90de45e9f9180ad0264b51db47593fdbe3d61 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 e066aff5b300000b5ab54ffd1eaad693cc51a0fd..f91126697fc71683a12a1b7145a577355037aab7 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 @@ -405,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); @@ -506,13 +512,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 +532,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 8b0fa059100c0b339b19847c434267e5bea666f2..2e172a7524c44cf42d015861efd9e49ace38e03c 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 @@ -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 */ }; @@ -1427,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) { @@ -1498,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; @@ -1593,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)); @@ -1720,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; @@ -1915,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; @@ -2135,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; @@ -2348,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 @@ -2383,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 @@ -2393,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); } @@ -3159,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; @@ -3194,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__); @@ -3262,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; @@ -3293,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__); @@ -3373,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); @@ -3694,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; @@ -4123,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) { @@ -4276,6 +4318,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 +4359,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 +5016,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 +5102,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 +5118,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 +5205,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 +5333,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 +5358,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 */ @@ -6454,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 800f76e1532f0a36292bc47aa470ffd323b10086..e21880c2d4b556c00bd0da1a6784b700aa01bf60 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)) { @@ -2839,7 +2836,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 c62e8c9043405366059677b6c7b24b9eedb87eb3..2314f110312c8a2be76f8c1544e4d558a39797bc 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 ad852577ad2376d0d9a0ce685b697bd206a5d4a8..32b78391d6a66297aa80d7efbcfb9ffa10677476 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 0f9c15f6a695d3a400332e7a593aeeeb4bc8ae9f..bd57685b71c9822e3c72fa6d83f744edf9cfcc16 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 3efc2a30037c7a5b1284e0c69e7db9352893c353..4af409535672fe0452f3a997f6ebff8465fcc887 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 @@ -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. @@ -1259,7 +1250,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, @@ -1315,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); @@ -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,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); @@ -1845,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 @@ -1907,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 @@ -1953,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, @@ -1960,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. */ @@ -2014,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; } /*****************************************************************//** @@ -2877,7 +2787,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); @@ -3421,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. @@ -3595,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/row0ins.cc b/storage/xtradb/row/row0ins.cc index 62e194020bc382c5c8b6b8203d1602c260bd459e..472be8ad84876e482150c807270dce3852ad098f 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; } @@ -3041,6 +3040,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); @@ -3143,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 e15a4f4f5d88bfb85f148deb12baa4e7437f21c3..21f1a1c5974d2547c3fd5319539d672e760a552f 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 @@ -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); } @@ -1064,7 +1012,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 +1131,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 +1160,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 +1171,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 +1181,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 +1405,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: @@ -1573,13 +1523,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 +1536,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); } @@ -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) { @@ -2173,17 +2111,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; @@ -2264,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); @@ -2273,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); } @@ -2323,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. @@ -2339,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 cbcc3cc62f3fd2bcf9d8d1102c7d4eb88ebf0d2f..9f8fc39e06b92d1bc3c584166d19d0938c00d4f6 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 @@ -3114,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 3f79c3af6c80f04e275480b9b3c8f5bb4c9425ef..2b6f38ba2af70db7b41f81cbba34bc05151af653 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, 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 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" @@ -74,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 */ }; @@ -137,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 @@ -1516,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" @@ -2011,7 +1998,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 */ @@ -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_id(drop->table_id, FALSE, + DICT_TABLE_OP_NORMAL); - 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 */ - - 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,37 +2868,27 @@ 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; } /*********************************************************************//** Reassigns the table identifier of a table. @return error code or DB_SUCCESS */ -UNIV_INTERN +static dberr_t row_mysql_table_id_reassign( /*========================*/ @@ -3587,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) { @@ -3632,7 +3587,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); @@ -3661,7 +3616,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 (;;) { @@ -3708,7 +3663,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); } @@ -4050,6 +4005,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); @@ -4150,7 +4115,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 +4127,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 +4167,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); @@ -4291,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 @@ -5321,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) { @@ -5423,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/row0purge.cc b/storage/xtradb/row/row0purge.cc index 333677edf21063f643805f672147d18e302607c6..0cd0941987d06e23cf72b4c26352a8dfaefe3215 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 6c4e6adb96ce6e655bbbf2972b9b6d726ac166b5..53b4040f74e8a21b7236e45bad3449103ca47f81 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 96d25e15777dbcb848c64c224857f5f1d6175446..9bf9e7182ca670118405508a974def4ec80487a7 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 6131129d0a6f9a53bf1161352e7e54e7493e4f7d..b6b5d107885da1a9aa1df410b755010a171a3569 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 @@ -3684,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 @@ -3747,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_); @@ -3933,7 +4044,7 @@ row_search_for_mysql( } } - mtr_start_trx(&mtr, trx); + mtr_start(&mtr); /*-------------------------------------------------------------*/ /* PHASE 2: Try fast adaptive hash index search if possible */ @@ -4554,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; @@ -4626,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: @@ -4747,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 @@ -4805,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 (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 @@ -4955,6 +5016,7 @@ row_search_for_mysql( } } } else { +use_covering_index: result_rec = rec; } @@ -5159,7 +5221,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 +5288,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 2e5cc14bfe1932a493353a171cf4d1b651c20dd2..bb2fc53661621dc0c7284536b7a8fda493fbe985 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/row0undo.cc b/storage/xtradb/row/row0undo.cc index 82b1ab049facf1375509355385eb46ed6af19261..552b99ab4d4a71249b2a73ea0772360865d95a5e 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/row/row0upd.cc b/storage/xtradb/row/row0upd.cc index 113d2f10fc2b371aba4fed3c613fdc291276bc3d..93ccc07c9af19b5bb6c2ddbdeb29e85f5bfc3ed5 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); @@ -1805,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 @@ -1835,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); @@ -1855,7 +1873,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 @@ -1967,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); @@ -2190,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)); @@ -2277,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); @@ -2398,7 +2409,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 @@ -2511,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); @@ -2540,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); @@ -2613,7 +2623,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 +2696,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 65a15b15aecd100899267e88fe4a4b1615f4a0b0..31e8709593443d6a470f03dc50da1d0084b6add7 100644 --- a/storage/xtradb/srv/srv0srv.cc +++ b/storage/xtradb/srv/srv0srv.cc @@ -82,14 +82,16 @@ 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; +#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; @@ -479,6 +481,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; @@ -566,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__ @@ -2137,6 +2132,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); } @@ -3238,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); } @@ -3442,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 2aa2426ca9c71492830c2c3e46ef8223a6048a1f..4ed310089acc6381f85b452d033be2c9fdb45dd7 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/trx0purge.cc b/storage/xtradb/trx/trx0purge.cc index ff82bb2ad4ec9e1f9e087f8c898b31cef9d0ec03..cbf783628f9d40e4ad8925adde6c207fd7bdf587 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 4e0ba825ed2f89881ed3f79f5e6983428990d636..dc9b08299255244321dd80bd5966d012d4ceed5a 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)); @@ -1221,10 +1233,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; @@ -1258,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 */ @@ -1335,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); @@ -1372,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 335ef8859c491b95a7c3bb5f17963e5bb580e4bb..56b7120fa34bc9f85d1a7c8f2ce75361d7e6c3f5 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 @@ -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,90 @@ 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; + 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)) { + + assert_trx_in_rw_list(t); + if (t->is_recovered + && trx_state_eq(t, TRX_STATE_ACTIVE)) { + n_trx++; + 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); + } + + mutex_exit(&recv_sys->mutex); + mutex_exit(&trx_sys->mutex); + return false; } /*******************************************************************//** @@ -775,17 +826,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 +1163,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 +1220,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 83bb28b3c07a619c9ed3a0baf306c632097fa07b..6108ab7ab94d5730bc18b366c0256bcd5c4c5092 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/trx0trx.cc b/storage/xtradb/trx/trx0trx.cc index 2b0b05dc3272c32a7cc229a3b2fe034b596e9c35..b3d709ccf8a767062bdcc6856ccb5f91fad1462e 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 3259bcb70b1b3c51fe4d6b792e50a3922a326cd9..594416ba34d6917fec6111ccce0fe990d98f0930 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 @@ -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); @@ -1987,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)); @@ -2023,10 +2027,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 +2056,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/storage/xtradb/ut/ut0ut.cc b/storage/xtradb/ut/ut0ut.cc index fd52537ae11933b2b99fc0d4d796747d8367b0bf..695be4907e01ba0b28571fc5788a699c6ba00d20 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/strings/CMakeLists.txt b/strings/CMakeLists.txt index 32a3f06c861a38fb7c3e142ba9481de7325f144f..2a7f0b71cc8d3541236237a68386a00d98c67605 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) @@ -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/strings/ctype-tis620.c b/strings/ctype-tis620.c index bd8efeff1ec062590234ce7a49947c6ff5dd2c6e..5284109b816473773bd2dca5fdfb02e0b0a07ae4 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 4178b20789dcd6c43aadc2cc1e84571535c3e97d..134fdfc57b856725801cb634ded284a91e720ced 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 91246603f2e224b639dd5d508af48441541dd2c6..0000000000000000000000000000000000000000 --- 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 4685a04faec9f47ce868583fdeea73e7c9462529..b5fed6a6760f80178b90699d4d8df883a260b312 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 71e9b3fad3d0e6b6174ba1191f6f90a15e2df111..dff4610d4906caf530328d8f966191114c5245ed 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) @@ -104,6 +111,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 6a307b2c41f84de205ae50b4aeb746393b4c981e..ef9fa5c2a22d3ac69d10ee256421ec55e6bcb631 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 @@ -85,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 @@ -103,7 +104,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 410e7433b2b844df988bcac11d02af51c1cb64cc..465a0d94c628be0373338def4596b1e4070d3a25 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 @@ -106,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 @@ -124,7 +125,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/mysql.server.sh b/support-files/mysql.server.sh index ed0da3ccddbc0846cf1314998107421d6c5a8121..a60ec248cecfc2e800a2fe33b08502fdf0a7d7fd 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,13 @@ # 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 # 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 +36,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 +290,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 +306,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 +320,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 +336,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 +357,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 +369,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 +382,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 +400,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 +438,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/support-files/policy/selinux/mariadb-server.fc b/support-files/policy/selinux/mariadb-server.fc index 1a69ecc2c40064e9ce3e5ee3eb3fa59e03f490b5..409f72923aae1f06aefa4c3bcc410da37d0873d6 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 34d79326b10d7a8e8e2739c64eb581f44ff0ebc2..45ef40f41534c481c1461f93e4d9213099f2c3c8 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/sysusers.conf.in b/support-files/sysusers.conf.in new file mode 100644 index 0000000000000000000000000000000000000000..a975b29476aa041a663e01543f9a737085c5286b --- /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 0000000000000000000000000000000000000000..03d66abc0c7ca5eb558a57284300f98d23e9760a --- /dev/null +++ b/support-files/tmpfiles.conf.in @@ -0,0 +1 @@ +d @MYSQL_UNIX_DIR@ 0755 @MYSQLD_USER@ @MYSQLD_USER@ - diff --git a/support-files/wsrep.cnf.sh b/support-files/wsrep.cnf.sh index a5390855ca17a54222c884636952d23f88b6b472..51ce3dca2ddad469169174cfc7d6175d85b15574 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 b7211989f1f858bfe5711ba3b26beb419d7cd989..71fb3894b3c202ea05dc84ef3b6a977b28f8a686 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 c367e7ca35dda124c024c27c773c60249ea4ced0..b63bcbaa03755b97ab96d5200c0d495bc911dc41 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 bf0fb8ea2c0181d529ad624ebd0fb0b5a04757b2..38e453e9cb8434eba093c6797fd2d481f355a504 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/mysys/base64-t.c b/unittest/mysys/base64-t.c index 4561606936a9e2986af74b8b458761e61dec42fe..a3a37976da6ba3be6f501006009dde694ee24052 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/unittest/sql/mf_iocache-t.cc b/unittest/sql/mf_iocache-t.cc index 31f98562521b86e71428debe2ef38a25dca89395..1b04f8eb0d3a3b9c313b1d83bf3968377f039cac 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(); } diff --git a/win/packaging/WixUIBannerBmp.jpg b/win/packaging/WixUIBannerBmp.jpg index a04177bed9da0e5f70573f4a6a4337cb6d40128f..66256b79255d04872a1c1670124ee513402363d6 100644 Binary files a/win/packaging/WixUIBannerBmp.jpg and b/win/packaging/WixUIBannerBmp.jpg differ diff --git a/win/packaging/WixUIDialogBmp.jpg b/win/packaging/WixUIDialogBmp.jpg index 466cdc461c8e1a54e712c476062a83c7c6f5ce93..c6ddf12bd2a20b80cb6c1fd1e7f8c66efde84eed 100644 Binary files a/win/packaging/WixUIDialogBmp.jpg and b/win/packaging/WixUIDialogBmp.jpg differ